Oracle 12c - CURRVAL e NEXTVAL de uma sequence como valor DEFAULT para uma coluna de uma tabela.

Pessoal,

Bom dia!
Para os desenvolvedores que já trabalharam com Oracle e precisaram criar registros sequenciais em uma tabela, com certeza já se depararam com a utilização do objeto SEQUENCE, disponível no banco de dados Oracle, com o objetivo de simular a criação de colunas do tipo auto-incremento. Realmente, até a versão 11g, não havia no Oracle um tipo de coluna auto-incremento, mas, no Oracle 12c, isso agora é possível.


Até a versão 11g, o Oracle não permite definir um objeto SEQUENCE na cláusula DEFAULT de uma coluna de tabela, como demonstrado abaixo:

SQL*Plus: Release 11.2.0.1.0 Production on Qua Out 2 19:00:08 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

Conectado a:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create sequence seq_teste;

Seqüência criada.

SCOTT> desc minha_tabela
Nome                   Nulo?    Tipo
---------------------- -------- ----------------------
ID                     NOT NULL NUMBER
DESCRICAO              NOT NULL VARCHAR2(100)

SQL> alter table minha_tabela modify id DEFAULT SEQ_TESTE.NEXTVAL;
alter table minha_tabela modify id DEFAULT SEQ_TESTE.NEXTVAL
*
ERRO na linha 1:
ORA-00984: coluna não permitida aqui

À partir do Oracle 12c, é possível especificar uma SEQUENCE de banco de dados e utilizar as pseudo-colunas NEXTVAL e CURRVAL na cláusula DEFAULT de uma coluna de tabela como demonstrado abaixo:

SQL*Plus: Release 12.1.0.1.0 Production on Qua Out 2 19:03:54 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Conectado a:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> create sequence seq_teste;

Sequência criada.

SQL> create table minha_tabela (
2  id number constraint pk_minha_tabela primary key,
3  nome varchar2(60) not null);

Tabela criada.

SQL> alter table minha_tabela modify id DEFAULT SEQ_TESTE.NEXTVAL;

Tabela alterada.

SQL> insert into minha_tabela (nome) values ('Nome_1');

1 linha criada.

SQL> insert into minha_tabela (nome) values ('Nome_2');

1 linha criada.

SQL> insert into minha_tabela (nome) values ('Nome_3');

1 linha criada.

SQL> select * from minha_tabela order by 1;

ID NOME
---------- -----------------------------------------
1 Nome_1
2 Nome_2
3 Nome_3

No exemplo abaixo, podemos ver que é possível inserir uma valor de ID explícito, como por exemplo ID=10.

SQL> insert into minha_tabela values (10,'Nome_10');

1 linha criada.

SQL> select * from minha_tabela order by 1;

ID NOME
---------- -----------------------------------------
1 Nome_1
2 Nome_2
3 Nome_3
10 Nome_10

Caso a coluna aceite valores nulos, e um valor NULL for inserido, então o valor DEFAULT não será utilizado. Para que isso não aconteça, a coluna deverá ser criada utilizando a cláusula ON NULL conforme exemplo do comando abaixo:

create table t1 (
id    number DEFAULT ON NULL SEQ_TESTE.NEXTVAL,
nome  varchar(10)   
);

Se tentarmos dropar a sequence, o Oracle não irá fazer uma verificação de dependência entre a tabela e a sequence, ou seja, conseguiremos dropar a sequence sem o menor problema. Consequentemente, as operações de INSERT irão falhar com a emissão do erro ORA-02289 conforme demonstração abaixo:

SQL> drop sequence seq_teste;

Sequência eliminada.

SQL> insert into minha_tabela (nome) values ('Nome_4');
insert into minha_tabela (nome) values ('Nome_4')
*
ERRO na linha 1:
ORA-02289: a sequência não existe

Abraço,

Ronaldo

Nenhum comentário:

Postar um comentário