quarta-feira, 31 de julho de 2013

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
Postagem mais recente Postagem mais antiga Página inicial

0 comentários:

Postar um comentário

Translate

# ACE Program

#Oracle

#Oracle
Disclaimer: The views expressed on this blog are my own and do not necessarily reflect the views of Oracle.

#Blog reconhecido

#ARTICULISTA

Marcadores

Postagens populares