【发布时间】:2018-04-15 23:10:27
【问题描述】:
我正在学习如何使用 Oracle 11g XE 在触发器中编写用户定义的异常,似乎this question 的答案就是一个很好的例子:
create or replace trigger trig1
before update
of sal
on emp
for each row
when (new.sal < old.sal)
declare
user_xcep EXCEPTION;
PRAGMA EXCEPTION_INIT( user_xcep, -20001 );
begin
raise user_xcep;
end;
/
但是,当我尝试更新一条值为sal 低于原始值的记录时,我收到以下错误:
从第 24 行开始的错误命令 -
更新 emp set sal = 1100 其中 id = 1001
错误报告 -
ORA-20001:
ORA-06512:在“USER01.TRIG1”,第 5 行
ORA-04088: 执行触发器“USER01.TRIG1”时出错
我从网上查到,这意味着触发器代码中存在运行时错误。但问题出在哪里?由于上面的代码来自2013年写的答案,因为我使用的是新版本的Oracle,所以原来的触发器不再工作了?我该如何解决?
【问题讨论】:
-
我认为它按预期工作。您在触发器内引发异常,该异常会传播到触发语句。
-
@KaushikNayak 但是当我在
begin之后但在raise之前放置一行dbms_output.put_line('Hi');时,然后重新编译触发器,然后再次执行更新查询,'Hi' 行永远不会显示在 DBMS 输出窗口中。为什么? -
SET SERVEROUTPUT ON运行更新语句,并发出回滚。它应该会出现。 -
@GreenPenguin 尝试在
new和old之前添加冒号: -
@BarbarosÖzhan 在触发器中,当您将新旧元素放入
when子句时,不需要:。它会抛出错误。
标签: oracle exception plsql triggers