Oracle
 sql >> база данни >  >> RDS >> Oracle

Актуализиране с тригер след вмъкване на същата таблица

Ако искате да присвоите проста стойност по подразбиране, най-лесният начин е да я декларирате в таблицата, като използвате клаузата 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>

Това работи с литерали или псевдоколони като SYSDATE или USER. Ако искате да извлечете по-сложна стойност с дефинирана от потребителя функция или последователност, ще трябва да използвате тригер.

Ето нова версия на таблицата...

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>

... с тригер:

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>

Имайте предвид, че въпреки че всяка колона в таблицата е по подразбиране, трябва да попълня поне една колона, за да направя SQL валиден:

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


SQL>

Но мога да предам NULL на COL4, за да получа напълно запис по подразбиране:

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>

Лектор с предупреждение:моят тригер използва новия синтаксис 11g. В предишни версии трябваше да присвоим стойността на последователността с помощта на оператор 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. ODP.Net драйвер хвърля изключение на .NET Core 5.0

  2. Стартирайте exe от DBMS_SCHEDULER

  3. дизайн на база данни един към много към много

  4. Как да оптимизирате актуализиращ SQL, който работи на таблица на Oracle със 700 милиона реда

  5. Времево клеймо на Oracle с прозрачен превод на стойностите на местната часова зона