如何在触发器内引发异常?有没有办法做到这一点?

时间:2013-09-08 09:44:19

标签: database oracle exception plsql

有一种情况:如果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;

我收到错误 - 错误的触发器规范

还有其他方法可以达到这个目的吗?

2 个答案:

答案 0 :(得分:10)

你快到了;如果你想申报任何东西,你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;这是毫无意义。有人必须在那里查看每条记录的结果。如果您不希望发生某些事情,请提出异常,然后抓住它。我已经为您的异常添加了一个错误代码,以便您可以在触发器之外捕获它并按照您的意愿处理它(不要向stdout打印任何内容)。
  2. 这是一个小问题,但我增加了一点空白;不多。我最初无法看到问题出在哪里,因为你没有任何问题。
  3. 在异常声明和RAISE之后你错过了分号。
  4. the documentation

    中详细了解内部定义的例外情况

答案 1 :(得分:0)

这显然是针对Oracle的。在标题中使用Oracle会很好,所以它不会出现在每次搜索中。