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