Pessoal,
Bom dia!
Outra novidade do Oracle 12c além da utilização do valor de uma sequence como valor default em uma coluna de uma tabela são as colunas do tipo Auto-Incremento (IDENTITY).
Segue abaixo alguns exemplos práticos dos tipos de coluna IDENTITY que podemos criar à partir do Oracle 12c.
GENERATED ALWAYS AS IDENTITY
SQL> create table t1_always ( 2 id number GENERATED ALWAYS AS IDENTITY, 3 nome varchar2(20) 4 ); Tabela criada. SQL> desc t1_always Nome Nulo? Tipo ----------------- -------- ----------------------- ID NOT NULL NUMBER NOME VARCHAR2(20)
Podemos notar pelo resultado do comando DESCRIBE acima, que uma coluna IDENTITY é obrigatória (NOT NULL). Abaixo podemos ver que o Oracle automaticamente criou uma SEQUENCE de banco de dados com o nome de ISEQ$$_19860.
SQL> select sequence_name from user_sequences; SEQUENCE_NAME ----------------- ISEQ$$_19860
Se por acaso tentarmos dropar essa SEQUENCE, o Oracle irá emitir o erro ORA-32794, ou seja, diferentemente de especificar uma SEQUENCE como DEFAULT em uma coluna, onde não há qualquer dependência entre a SEQUENCE e a coluna da tabela, no caso de uma coluna do tipo IDENTITY a SEQUENCE que é criada automaticamente faz parte dessa engenharia.
SQL> drop sequence ISEQ$$_19860; drop sequence ISEQ$$_19860 * ERRO na linha 1: ORA-32794: não é possível eliminar uma sequência gerada pelo sistema
Uma coluna IDENTITY criada com a cláusula ALWAYS sempre irá forçar a geração do valor sequencial. Caso algum valor seja informado na coluna IDENTITY, o erro ORA-32795 será emitido.
SQL> insert into t1_always values (1,'teste1'); insert into t1_always values (1,'teste1') * ERRO na linha 1: ORA-32795: não é possível inserir em uma coluna de identidade sempre gerada
GENERATED BY DEFAULT AS IDENTITY
Uma coluna IDENTITY criada com a cláusula BY DEFAULT não irá forçar a geração do valor sequencial, ou seja, caso algum valor seja informado na coluna IDENTITY, o mesmo será inserido ao invés do valor sequencial.
SQL> create table t2_by_default ( 2 id number GENERATED BY DEFAULT AS IDENTITY, 3 nome varchar2(20) 4 ); Tabela criada. SQL> insert into t2_by_default values (11,'teste11'); 1 linha criada.
GENERATED BY DEFAULT ON NULL AS IDENTITY
Uma coluna IDENTITY criada com a cláusula BY DEFAULT ON NULL não irá forçar a geração do valor sequencial, ou seja, caso algum valor seja informado na coluna IDENTITY, o mesmo será inserido ao invés do valor sequencial. Caso NULL seja informado, então o valor sequencial será gerado para a coluna.
SQL> create table t3_by_default_on_null ( 2 id number GENERATED BY DEFAULT ON NULL AS IDENTITY, 3 nome varchar2(20) 4 ); Tabela criada. SQL> insert into t3_by_default_on_null (nome) values ('teste1'); 1 linha criada. SQL> insert into t3_by_default_on_null (id,nome) values (11,'teste11'); 1 linha criada. SQL> insert into t3_by_default_on_null (id,nome) values (NULL,'teste200'); 1 linha criada. SQL> select * from t3_by_default_on_null; ID NOME ---------- -------------------- 1 teste1 11 teste11 2 teste200
Abraço,
Ronaldo
Nenhum comentário:
Postar um comentário