我有一个在tableA上写一个插入触发器。它将使用相同的表但不同的列执行更新。这样做我收到错误。我的触发器是
create or replace trigger trigger_A
after insert on table_A
begin
update table_A set col1=1 where col1 is null;
end;
我有一个应用程序将单独执行col2将被插入并且col1将保持为null。因此,一旦插入行,我的触发器将为col1赋值。但是当插入一行时,我收到错误说“触发器失败并且无效”。 这该怎么做。 TIA。
答案 0 :(得分: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>
这适用于文字或伪列,例如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>
警告lector:我的触发器使用新的11g语法。在以前的版本中,我们必须使用SELECT语句分配序列值:
select my_seq.nextval
into :new.col4
from dual;
答案 1 :(得分:0)
您无法更新调用触发器的表:
在存储的函数或触发器中,不允许修改a 已经被使用(用于读或写)的表 调用函数或触发器的语句。
这样做会产生错误1442:
Error Code: 1442
Can't update table 'MyTable' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
简而言之,我们不允许更新正在使用的表 - 但是你的情况很简单,只想更新字段,如果它是NULL,为此选择BEFORE INSERT ON触发器,这样你就可以更新新/当前条目/行的所有字段(因为尚未输入):
DELIMITER //
DROP TRIGGER IF EXISTS trigger_A//
CREATE TRIGGER trigger_A BEFORE INSERT ON table_A
FOR EACH ROW BEGIN
IF NEW.col1 IS NULL THEN
set NEW.col1 = <some-value>;
ENF IF;
END;
//
DELIMITER ;