4

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

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

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

4

1 回答 1

12

您快到了; 如果要声明任何内容,则需要在触发器中使用 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;

SQL小提琴

几点:

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

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

于 2013-09-08T10:04:13.387 回答