fev 132016
 

A maior parte dos bancos de dados existentes no mercado possuem uma funcionalidade chamada Identity, basicamente um Auto incremento para campos numéricos.

Para implementarmos tal funcionalidade no Oracle 11g e anteriores era necessário usar uma sequence e chamar seu método “next_val” por meio de uma trigger, ou chamando diretamente no comando (eg. insert). Mas não havia nada automático.

Temos novidades no 12c ?

Sim, no Oracle 12c finalmente temos a mesma propriedade identity.

Todo campo identity no Oracle tem um sequência por trás, criada automaticamente. A única diferença é que ela será gerenciada automaticamente.

A sintaxe do comando é a seguinte:

GENERATED
[ ALWAYS | BY DEFAULT [ ON NULL ] ]
AS IDENTITY [ ( identity_options ) ]

Temos então basicamente as seguinte maneiras de identificar a coluna como identity:

GENERATED ALWAYS AS IDENTITY

CREATE TABLE test_table (
   id NUMBER GENERATED ALWAYS AS IDENTITY, 
   description VARCHAR2(20));

Dessa maneira o campo identity, no exemplo o campo id, sempre é preenchido pelo Oracle:

SQL> insert into test_table (description) 
     values ('Exemplo numero 1');

1 row created.

Elapsed: 00:00:00.01
SQL> select * from test_table;

	ID DESCRIPTION
---------- --------------------
	 1 Exemplo numero 1

Elapsed: 00:00:00.00

Mas se tentarmos especificar o campo identify, seja com nulo ou qualquer outro valor vamos receber um erro:

SQL> insert into test_table (id,description) 
     values (2,'Exemplo numero 2');
insert into test_table (id,description) 
values (2,'Exemplo numero 2')
                        *
ERROR at line 1:
ORA-32795: cannot insert into a generated 
           always identity column

Elapsed: 00:00:00.01

GENERATED BY DEFAULT AS IDENTITY

CREATE TABLE test_table (
   id NUMBER GENERATED BY DEFAULT AS IDENTITY, 
   description VARCHAR2(20));

Assim como no exemplo acima, o campo identity, no exemplo o campo id, sempre é preenchido pelo Oracle.
No entanto criando a identity dessa forma podemos especificar o valor do campo identity:

SQL> insert into test_table (id,description) 
     values (2,'Exemplo numero 2');  2  

1 row created.

Elapsed: 00:00:00.00

SQL> select * from test_table;

	ID DESCRIPTION
---------- --------------------
	 2 Exemplo numero 2

Elapsed: 00:00:00.00

Mas tome cuidado, pois os números podem se repetir:


SQL> insert into test_table (description) 
     values ('Exemplo');  2  

1 row created.

Elapsed: 00:00:00.01
SQL> insert into test_table (description) 
     values ('Exemplo');  2  

1 row created.

Elapsed: 00:00:00.00

SQL> select * from test_table;

	ID DESCRIPTION
---------- --------------------
	 2 Exemplo numero 2
	 1 Exemplo
	 2 Exemplo

Elapsed: 00:00:00.00

É claro que eu posso criar uma constraint, mas a aplicação levaria um erro.
Desta forma, se você precisa especificar a sequência, tome cuidado pois em algum momento a sequência vai chegar naquele valor e não vai saber que ele já foi usado. Tudo depende da lógica da aplicação….
Por isso que a Oracle fornece várias opções para o campo identity…..

Mas nesse exemplo, embora você possa especificar o valor do campo identity, não é possível colocar null:

SQL> insert into test_table (id,description) 
     values (null,'Exemplo');
  2       values (null,'Exemplo')
             *
ERROR at line 2:
ORA-01400: cannot insert NULL into ("SYS"."TEST_TABLE"."ID")


Elapsed: 00:00:00.00

GENERATED BY DEFAULT ON NULL AS IDENTITY

CREATE TABLE test_table (
   id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY, 
   description VARCHAR2(20));

Nesse caso não é só possível especificar o campo identity, como também defini-lo como null:

SQL> CREATE TABLE test_table (
   id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY, 
   description VARCHAR2(20));  2    3  

Table created.

Elapsed: 00:00:00.05
SQL> insert into test_table (id,description) 
     values (null,'Exemplo');  2  

1 row created.

Elapsed: 00:00:00.00
SQL> select * from test_table;

	ID DESCRIPTION
---------- --------------------
	 1 Exemplo

Elapsed: 00:00:00.00

É claro que o campo não fica com null na tabela, mas o Oracle usa a sequência para definir um valor.

Para resumir:

Sintaxe Sequência automática Aceita especificar manualmente Aceita null
GENERATED ALWAYS AS IDENTITY Sim Não Não
GENERATED BY DEFAULT AS IDENTITY Sim Sim Não
GENERATED BY DEFAULT ON NULL AS IDENTITY Sim Sim Sim

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)