Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Aktualisieren Sie mit After-Insert-Trigger in derselben Tabelle

Wenn Sie einen einfachen Standardwert zuweisen möchten, ist es am einfachsten, ihn mit der DEFAULT-Klausel in der Tabelle zu deklarieren.

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>

Dies funktioniert mit Literalen oder Pseudospalten wie SYSDATE oder USER. Wenn Sie einen komplizierteren Wert mit einer benutzerdefinierten Funktion oder einer Sequenz ableiten möchten, müssen Sie einen Trigger verwenden.

Hier ist eine neue Version der Tabelle...

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>

... mit einem Auslöser:

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>

Beachten Sie, dass, obwohl jede Spalte in der Tabelle standardmäßig zulässig ist, ich mindestens eine Spalte füllen muss, um die SQL gültig zu machen:

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


SQL>

Aber ich kann NULL an COL4 übergeben, um einen vollständig voreingestellten Datensatz zu erhalten:

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>

Vorsichtsmaßnahme:Mein Trigger verwendet die neue 11g-Syntax. In früheren Versionen müssen wir den Sequenzwert mit einer SELECT-Anweisung zuweisen:

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