【问题标题】:How to raise an Exception inside a Trigger? Is there a way to do this?如何在触发器中引发异常?有没有办法做到这一点?
【发布时间】:2013-09-12 00:05:47
【问题描述】:

有这样的情况:如果 Salary 列的更新值小于其原始值,则打印错误消息并让更新不发生。这是我到目前为止所写的:

CREATE OR REPLACE TRIGGER TRIG1
BEFORE UPDATE OF SAL ON EMP
for each row
  USER_XCEP EXCEPTION
  WHEN (NEW.SAL<OLD.SAL)
BEGIN
  RAISE USER_XCEP

EXCEPTION
  WHEN USER_XCEP THEN
       DBMS_OUTPUT.PUT_LINE('UPDATION NOT ALLOWED - ILLEGAL VALUES');
END;

我得到了错误 - 不正确的触发器规范

还有其他方法可以实现吗?

【问题讨论】:

  • 是 sql server 还是 oracle ?做好决定!看起来像甲骨文
  • Oracle - 抱歉,我添加了错误的标签!

标签: database oracle exception plsql


【解决方案1】:

你快到了;你need a DECLARE block in a trigger如果你想声明什么;这意味着您的 WHEN 子句位于错误的位置。

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;

SQL Fiddle

几点:

  1. 从不捕获异常然后调用 DBMS_OUTPUT.PUT_LINE;没有用。必须有人在那里查看每条记录的结果。如果您不希望发生某些事情,请引发异常然后捕获它。我在您的异常中添加了一个错误代码,以便您可以在触发器之外捕获它并按照您的意愿处理它(不要将任何内容打印到标准输出)。
  2. 这是一个小问题,但我添加了一些空格;不多。我一开始看不出你的代码有什么问题,因为你没有。
  3. 您在异常声明和 RAISE 之后缺少分号。

the documentation中阅读有关内部定义异常的更多信息

【讨论】:

  • 这条线是做什么用的? - PRAGMA EXCEPTION_INIT( user_xcep, -20001 );
  • 答案底部的链接@WontSay :-)。它将错误代码分配给异常,因此您知道如果要捕获异常要查找的错误代码。
猜你喜欢
  • 1970-01-01
  • 2011-10-04
  • 2021-07-09
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 2020-11-23
  • 2011-12-13
相关资源
最近更新 更多