Oracle
 sql >> Base de données >  >> RDS >> Oracle

Mettre à jour avec le déclencheur après insertion sur la même table

Si vous souhaitez affecter une simple valeur par défaut, le plus simple est de la déclarer sur la table, à l'aide de la clause 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>

Cela fonctionne avec des littéraux ou des pseudo-colonnes telles que SYSDATE ou USER. Si vous souhaitez dériver une valeur plus compliquée avec une fonction définie par l'utilisateur ou une séquence, vous devrez utiliser un déclencheur.

Voici une nouvelle version du tableau...

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>

... avec un déclencheur :

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>

Notez que bien que chaque colonne de la table soit par défaut, je dois remplir au moins une colonne pour rendre le SQL valide :

SQL> insert into t42 values ()
  2  /
insert into t42 values ()
                        *
ERROR at line 1:
ORA-00936: missing expression


SQL>

Mais je peux passer NULL à COL4 pour obtenir un enregistrement complètement par défaut :

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>

Avertissement lecteur :mon déclencheur utilise la nouvelle syntaxe 11g. Dans les versions précédentes, nous devions attribuer la valeur de séquence à l'aide d'une instruction SELECT :

select my_seq.nextval
into :new.col4
from dual;