12c new feature: Colunas invisíveis

Mais uma nova feature que surgiu na versão 12c são as colunas invisíveis(invisible columns). Seu proposito é permitir que alterações em uma tabela possam ser feitas sem afetar os usuários e as aplicações que utilizam a tabela de modo que após as aplicações serem atualizadas para utilizarem as novas colunas podemos tornar as colunas invisíveis visíveis.

Quando uma coluna invisível é criada, consultas e operações podem utilizá-la apenas referenciando explicitamente o nome da coluna, caso contrário ela é totalmente invisível nas operações.

Por padrão em qualquer acesso genérico realizado sobre uma tabela todas as colunas invisíveis são omitidas, como no SQL*Plus:

--Criando uma tabela com coluna invisível

SQL> create table teste (a number, b varchar2(5) invisible);

Tabela criada.

SQL> desc teste
 Nome                                      Nulo?    Tipo
 ----------------------------------------- -------- ----------------------------
 A                                                  NUMBER

SQL> insert into teste values (1);

1 linha criada.

SQL> select * from teste;

         A
----------
         1

SQL> insert into teste values (2,'par');
insert into teste values (2,'par')
            *
ERRO na linha 1:
ORA-00913: valores demais

-- referenciando explicitamente o nome da coluna invisível

SQL> insert into teste (a,b) values (2,'par');

1 linha criada.

SQL> select * from teste;

         A
----------
         1
         2

SQL> select a,b from teste;

         A B
---------- -----
         1
         2 par

Alterando a coluna invisível para visível:

SQL> alter table teste modify (b visible);

Tabela alterada.

SQL> desc teste;
 Nome                                      Nulo?    Tipo
 ----------------------------------------- -------- ----------------------------
 A                                                  NUMBER
 B                                                  VARCHAR2(5)

SQL> select * from teste;

         A B
---------- -----
         1
         2 par

Adicionando mais colunas invisíveis:

SQL> alter table teste add (c char invisible, d int invisible);

Tabela alterada.

SQL> desc teste;
 Nome                                      Nulo?    Tipo
 ----------------------------------------- -------- ----------------------------
 A                                                  NUMBER
 B                                                  VARCHAR2(5)

SQL> alter table teste modify (a invisible);

Tabela alterada.

SQL> desc teste
 Nome                                      Nulo?    Tipo
 ----------------------------------------- -------- ----------------------------
 B                                                  VARCHAR2(5)

Apesar das colunas invisíveis serem omitidas por default no SQL*Plus, ainda podemos fazê-lo mostrar as colunas invisíveis no DESCRIBE(DESC):

SQL> show colinvisible
colinvisible OFF
SQL> set colinvisible ON
SQL>
SQL> desc teste
 Nome                                      Nulo?    Tipo
 ----------------------------------------- -------- ----------------------------
 B                                                  VARCHAR2(5)
 A (INVISIBLE)                                      NUMBER
 C (INVISIBLE)                                      CHAR(1)
 D (INVISIBLE)                                      NUMBER(38)

Colunas virtuais também podem ser invisível bem como podemos utilizar uma coluna invisível como chave de particionamento durante a criação de uma tabela.

– Tipos de tabelas que não podem conter colunas invisíveis:

  • External tables
  • Cluster tables
  • Temporary tables

Um fator que sofre influência com a utilização das colunas invisíveis é a ordenação das colunas da tabela.

Normalmente as colunas são exibidas(listadas) na ordem em que elas foram criadas no CREATE TABLE, ou mesmo quando são adicionadas posteriormente elas são exibidas por ultimo na ordem da lista de colunas.

Quando utilizamos colunas invisíveis, as colunas invisíveis não são incluidas na ordem de colunas da tabela, desta forma sempre que tornamos uma coluna visível ela será a ultima da ordem de colunas e quando tornamos uma coluna invisível ocorre uma reorganização na ordem das colunas. Veja o exemplo abaixo:

SQL> create table exemplo (a int, b int invisible, c int);

Tabela criada.

SQL> col column_name for a15
SQL> select column_name, column_id
  2     from dba_tab_cols
  3    where table_name='EXEMPLO'
  4    order by 2
  5  /

COLUMN_NAME      COLUMN_ID
--------------- ----------
A                        1
C                        2
B

SQL> desc exemplo
 Nome                                      Nulo?    Tipo
 ----------------------------------------- -------- ----------------------------
 A                                                  NUMBER(38)
 C                                                  NUMBER(38)

-- Alterando coluna B para visível

SQL> alter table exemplo modify (b visible);

Tabela alterada.

SQL> select column_name, column_id
  2     from dba_tab_cols
  3    where table_name='EXEMPLO'
  4    order by 2
  5  /

COLUMN_NAME      COLUMN_ID
--------------- ----------
A                        1
C                        2
B                        3

SQL> desc exemplo
 Nome                                      Nulo?    Tipo
 ----------------------------------------- -------- ----------------------------
 A                                                  NUMBER(38)
 C                                                  NUMBER(38)
 B                                                  NUMBER(38)

-- Alterando coluna A para invisível

SQL> alter table exemplo modify (a invisible);

Tabela alterada.

SQL> select column_name, column_id
  2     from dba_tab_cols
  3    where table_name='EXEMPLO'
  4    order by 2
  5  /

COLUMN_NAME      COLUMN_ID
--------------- ----------
C                        1
B                        2
A

SQL> desc exemplo
 Nome                                      Nulo?    Tipo
 ----------------------------------------- -------- ----------------------------
 C                                                  NUMBER(38)
 B                                                  NUMBER(38)

-- Alterando coluna A para visível

SQL> alter table exemplo modify (a visible);

Tabela alterada.

SQL> select column_name, column_id
  2     from dba_tab_cols
  3    where table_name='EXEMPLO'
  4    order by 2
  5  /

COLUMN_NAME      COLUMN_ID
--------------- ----------
C                        1
B                        2
A                        3

SQL> desc exemplo
 Nome                                      Nulo?    Tipo
 ----------------------------------------- -------- ----------------------------
 C                                                  NUMBER(38)
 B                                                  NUMBER(38)
 A                                                  NUMBER(38)

Referência:
http://docs.oracle.com/cd/E16655_01/server.121/e17636/tables.htm#ADMIN13866

%name 12c new feature: Colunas invisíveis

Autor: Anderson Graf

Bacharel em Sistemas de Informação e MBA em Gestão de Banco de Dados Oracle. Entusiasta da tecnologia Oracle, ACE Associate ♠, autor em vários blogs e OTN. Consultor Oracle Senior na Exímio Soluções em TI

Envolvido em soluções de:
– Implementação, migração, gerenciamento e suporte a produtos Oracle, multiplataforma
– Monitoramento de ambientes 24×7
– Backup e Recovery
– Performance e Tuning
– Alta disponibilidade (HA) – RAC, Data Guard
– EM database/grid/cloud control
– Particionamento & Advanced Compression
– Oracle Engineered Systems – ODA, Exadata

Blog pessoal: http://www.andersondba.com.br
Articulista na Oracle Technology Network (OTN) – https://goo.gl/99R6yW
ACE Associate – https://goo.gl/MBB51b
Articulista GPO – http://profissionaloracle.com.br