触发不用于停止表插入

时间:2015-04-08 08:57:39

标签: oracle oracle11g oracle-sqldeveloper

我使用以下代码停止使用触发器将空值插入表中。但是当我传递null值时,插入发生得很好。知道我在这里做错了什么吗?

create table test
(col1 number,
 col2 varchar2(40)
 )

create or replace trigger test_trg
after insert on test
for each row
declare
    excp exception;
    pragma autonomous_transaction;
begin
    if :new.col2 is null then
     RAISE excp;
    end if;
exception
    when excp then
         dbms_output.put_line('error');
         rollback;
end;

(请注意,我接受在col2上使用not null或check约束是一个更好的解决方案。我只是想在这个看似正确的代码中找出错误背后的原因)

2 个答案:

答案 0 :(得分:1)

你必须在触发执行之前将触发器定义为BEFORE INSERT,删除pragma autonomouse_transactionrollback(这里没有任何意义,因为你没有任何DML ),然后在异常处理程序

中重新引用异常

答案 1 :(得分:1)

不要在触发器中回滚,只需在记录后重新引发激活:

create or replace trigger test_trg
after insert on test
for each row
declare
    excp exception;
    pragma autonomous_transaction;
begin
    if :new.col2 is null then
     RAISE excp;
    end if;
exception
    when excp then
         dbms_output.put_line('error');
         raise; -- propagate error
end;

当你把“例外......结束”时阻止您对PL / SQL说的代码,管理此错误的后果是您的责任。因此,如果您没有从处理原始错误的代码中引发任何错误,对于PL / SQL,这意味着已经在您的代码中完成了有关此错误的所有操作,所有操作都正常,并且必须插入记录。

您可以在this SQLFiddle中尝试。