Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Atualizar com o gatilho após a inserção na mesma tabela


Se você deseja atribuir um valor padrão simples, a maneira mais fácil é declará-lo na tabela, usando a cláusula DEFAULT.
SQL> create table t42
  2    ( col1 number default 1 not null
  3      , col2 date)
  4  /

Table created.

SQL> insert into t42 (col2) values (sysdate)
  2  /

1 row created.

SQL> select * from t42
  2  /

      COL1 COL2
---------- ---------
         1 03-AUG-11

SQL>

Isso funciona com literais ou pseudocolunas como SYSDATE ou USER. Se você quiser derivar um valor mais complicado com uma função definida pelo usuário ou uma sequência, precisará usar um gatilho.

Aqui está uma nova versão da tabela...
SQL> create table t42
  2    ( col1 number default 1 not null
  3      , col2 date default sysdate
  4      , col3 varchar2(30) default user
  5      , col4 number )
  6  /

Table created.

SQL>

... com um gatilho:
SQL> create or replace trigger t42_trg
  2      before insert or update
  3      on t42
  4      for each row
  5  begin
  6      if :new.col4 is null
  7      then
  8          :new.col4 := my_seq.nextval;
  9      end if;
 10  end;
 11  /

Trigger created.

SQL> insert into t42 (col1, col2, col3)
  2  values (99, sysdate, 'MR KNOX')
  3  /

1 row created.

SQL> select * from t42
  2  /

      COL1 COL2      COL3                                 COL4
---------- --------- ------------------------------ ----------
        99 03-AUG-11 MR KNOX                               161

SQL>

Observe que, embora todas as colunas da tabela sejam padrão, tenho que preencher pelo menos uma coluna para tornar o SQL válido:
SQL> insert into t42 values ()
  2  /
insert into t42 values ()
                        *
ERROR at line 1:
ORA-00936: missing expression


SQL>

Mas posso passar NULL para COL4 para obter um registro completamente padrão:
SQL> insert into t42 (col4) values (null)
  2  /

1 row created.

SQL> select * from t42
  2  /

      COL1 COL2      COL3                                 COL4
---------- --------- ------------------------------ ----------
        99 03-AUG-11 MR KNOX                               161
         1 03-AUG-11 APC                                   162

SQL>

Leitor de advertência:meu gatilho usa a nova sintaxe 11g. Nas versões anteriores, temos que atribuir o valor da sequência usando uma instrução SELECT:
select my_seq.nextval
into :new.col4
from dual;