我使用以下代码停止使用触发器将空值插入表中。但是当我传递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约束是一个更好的解决方案。我只是想在这个看似正确的代码中找出错误背后的原因)
答案 0 :(得分:1)
你必须在触发执行之前将触发器定义为BEFORE INSERT
,删除pragma autonomouse_transaction
和rollback
(这里没有任何意义,因为你没有任何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中尝试。