在触发表中插入空值

时间:2015-01-07 16:14:26

标签: oracle plsql triggers

我有一个触发器查询,

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表?

1 个答案:

答案 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 ...