Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zaktualizuj za pomocą wyzwalacza po wstawieniu na tym samym stole

Jeśli chcesz przypisać prostą wartość domyślną, najłatwiejszym sposobem jest zadeklarowanie jej w tabeli za pomocą klauzuli 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>

Działa to z literałami lub pseudokolumnami, takimi jak SYSDATE lub USER. Jeśli chcesz uzyskać bardziej skomplikowaną wartość za pomocą funkcji lub sekwencji zdefiniowanej przez użytkownika, musisz użyć wyzwalacza.

Oto nowa wersja tabeli...

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>

... z wyzwalaczem:

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>

Zauważ, że chociaż każda kolumna w tabeli jest domyślna, muszę wypełnić przynajmniej jedną kolumnę, aby kod SQL był prawidłowy:

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


SQL>

Ale mogę przekazać NULL do COL4, aby uzyskać całkowicie domyślny rekord:

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>

Zastrzeżenie lektora:mój wyzwalacz używa nowej składni 11g. W poprzednich wersjach musieliśmy przypisać wartość sekwencji za pomocą instrukcji SELECT:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Logowanie Framework dla aplikacji ASP.NET

  2. Migracja z java 1.4 ,EJB 1 do Java 6 i EJB 3

  3. Oracle REGEXP_LIKE i granice słów

  4. Jak zmusić Oracle do korzystania ze skanowania zakresu indeksów?

  5. zagnieżdżone wybierz lub dołącz do zapytania?