我有一个触发器查询,
create or replace trigger trg_upd
after update or delete or insert
on dept for each row
declare
--pragma autonomous_transaction;
begin
if inserting then
insert into deptemp values(:old.deptno,:old.dname,:old.loc);
elsif updating then
insert into deptemp values(:old.deptno,:old.dname,:old.loc);
else
insert into deptemp values(:old.deptno,:old.dname,:old.loc);
end if;
end trg_upd;
并创建表
create table deptemp as(select * from dept where 1=2);
当我在dept表中进行插入时,空值将插入deptemp表
insert into dept values(50,'OLTP','Hyd');
从deptemp中选择*;
DEPTNO DNAME LOC
------ -------------- -------------
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 OLTP Hyd
10 SALES CHICAGO
为什么在dept表中插入的值作为空值插入deptemp表?
答案 0 :(得分:0)
正如Tony评论的那样,在触发器中,OLD
伪记录将具有NULL作为值when Inserting,因为很明显 - 当您尝试插入时,记录的先前值为NULL。纠正它使用NEW,它应该没问题
create or replace trigger trg_upd
after update or delete or insert
on dept for each row
declare
--pragma autonomous_transaction;
begin
if inserting then
insert into deptemp values(:NEW.deptno,:NEW.dname,:NEW.loc);
elsif updating then
insert into deptemp values(:old.deptno,:old.dname,:old.loc);
else
insert into deptemp values(:old.deptno,:old.dname,:old.loc);
end if;
end trg_upd;
另外,我真的不知道你为什么要在UPDATING / ELSE分支条件下进行INSERT ...