BLOG

Aprimoramento da Cláusula DEFAULT – ORACLE 12c

Escrito por Francisco Cavalin

25 jul, 2017 | 13:56

Com a nova cláusula DEFAULT você tem melhor desempenho e poder para definir valores padrão.

Imagine uma tabela onde a chave primária (PK) é uma SURROGATE KEYS. Para garantir que a PK seja corretamente preenchida, até a versão 11g do Oracle, criava-se uma TRIGGER para preencher essas SURROGATE KEYS, como o TRIGGER abaixo:

SQL> create or replace
2 trigger TRG_SALES_SURROGATE_KEY
3 before insert on SALES
4 for each row
5 when (new.SALE_SEQ is null)
6 begin
7 :new.SALE_SEQ := SEQ_SALES.nextval;
8 end;
9 /

Trigger created.

Mas o grande desafio dessa solução é o tempo extra gasto para executar a TRIGGER.
No exemplo abaixo temos a inclusão de 10.000.000 de linhas em 6 minutos e 38 segundos.

SQL> insert /*+ APPEND */ into SALES
2 select rownum, …
3 from
4 ( select 1 from dual connect by level <= 10000 ),
5 ( select 1 from dual connect by level <= 1000 ) 6

/

10000000 rows created.

Elapsed: 00:06:37.75

Desabilitando a TRIGGER, descobrimos o enorme tempo gasto, quando o tempo de execução cai drasticamente para menos de 5 segundos.

SQL> alter trigger SALES_SURROGATE_KEY disable;

Trigger altered.

SQL> insert /*+ APPEND */ into SALES
2 select rownum, …
3 from
4 ( select 1 from dual connect by level <= 10000 ),
5 ( select 1 from dual connect by level <= 1000 ) 6

/

10000000 rows created.

Elapsed: 00:00:04.73

Com a cláusula DEFAULT do Oracle 12c não é mais necessário o uso de TRIGGERS para implementar SURROGATE KEYS.

SQL> alter table SALES modify SALE_SEQ default SEQ_SALES.nextval;

Table altered.

A nova cláusula também permite o uso de valores DEFAULT quando o comando explicitamente inclui um valor nulo.

insert into SALES ( INVOICE_NUM, INVOICE_DATE, QUANTITY, … )
values ( :invoice_num, null, :quantity, … );

O uso da cláusula ON NULL faz com que a coluna se torne automaticamente NOT NULL, e é necessário remover os valores nulos da coluna antes de executar o ALTER TABLE.

SQL> alter table SALES modify INVOICE_DATE default on null sysdate;

Table altered.

Traduzido e resumido do artigo de Connor McDonald da revista Oracle Magazine May/June 2016

Quer saber mais?

ENTRE EM CONTATO