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

Sat*_*ian 4 database oracle plsql exception

有一种情况:如果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;
Run Code Online (Sandbox Code Playgroud)

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

有没有其他方法来实现这一目标?

Ben*_*Ben 10

你快到了; 你需要一个触发一个DECLARE块,如果你要申报的东西; 这意味着您的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;
Run Code Online (Sandbox Code Playgroud)

SQL小提琴

几点:

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

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