在同一个表上使用插入触发器更新

Nav*_*vin 1 sql oracle triggers

我有一个在tableA上写一个插入触发器.它将使用相同的表但不同的列执行更新.这样做我收到错误.我的触发器是

create or replace trigger trigger_A
after insert on table_A
begin
  update table_A set col1=1 where col1 is null;
end;
Run Code Online (Sandbox Code Playgroud)

我有一个应用程序将执行col2单独插入,col1将保持为null.因此,一旦插入行,我的触发器将为col1赋值.但是当插入一行时,我收到错误说"触发器失败并且无效".这该怎么做.TIA.

APC*_*APC 6

如果要分配一个简单的默认值,最简单的方法是使用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>
Run Code Online (Sandbox Code Playgroud)

这适用于文字或伪列,如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>
Run Code Online (Sandbox Code Playgroud)

......带触发器:

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>
Run Code Online (Sandbox Code Playgroud)

请注意,尽管表上的每一列都是可默认的,但我必须填充至少一列以使SQL有效:

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


SQL>
Run Code Online (Sandbox Code Playgroud)

但我可以将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>
Run Code Online (Sandbox Code Playgroud)

警告lector:我的触发器使用新的11g语法.在以前的版本中,我们必须使用SELECT语句分配序列值:

select my_seq.nextval
into :new.col4
from dual;
Run Code Online (Sandbox Code Playgroud)