简单的oracle Trigger有效但却给我带来了错误

时间:2013-12-12 01:12:28

标签: sql oracle plsql

我有这个简单的触发器,它可以工作,但它给了我一些错误。语法似乎正确。

这是我的代码:

create or replace 
TRIGGER max_raise
BEFORE UPDATE ON empcopy
FOR EACH ROW
DECLARE
v_max NUMBER := 3000;
BEGIN
 IF :new.sal > v_max THEN
  raise_application_error(-20002, 'Cannot exceed max value of ' || v_max);
 END IF;
END;

这是我的错误:

  

DECLARE

     

*

     

第1行的错误:

     

ORA-20002:不能超过3000的最大值

     

ORA-06512:at“SYSTEM.MAX_RAISE”,第5行

     

ORA-04088:执行触发器'SYSTEM.MAX_RAISE'

时出错      

ORA-06512:第11行

这是我正在使用的pl / sql代码。

DECLARE
  v_raise   NUMBER;
  CURSOR cur1 IS
   SELECT a.deptno, a.sal, a.empno, a.ename 
   FROM empcopy a;

BEGIN
  FOR emp IN cur1 LOOP  

    v_raise := external_raise(emp.deptno, emp.sal);

    DBMS_OUTPUT.PUT_LINE('The Employee: ' || emp.ename || ' new salary: ' 
    || v_raise || ' the previous one was: ' || emp.sal);

    UPDATE empcopy SET sal = v_raise WHERE empno = emp.empno;
      END LOOP;  
END;

1 个答案:

答案 0 :(得分:2)

代码中的问题不是你的触发器,而是它背后的业务逻辑。我可以看到,根据您的问题,您的所有代码都按照预期正常运行。这里的问题是你不知道期望是什么。

这是使用触发器强制执行高级审核的简单案例。您的业​​务分析师或在此代码之前为您工作的编码员认为,员工的工资不得超过一定数额。他们希望确保没有人输入错误的值,即使跳过前端并直接查询数据库。因此,此触发器已编程。

您现在可以做的是修改您的前端以向用户显示此例外。或者,与您的业务分析师交谈,如果他认为您不需要强制执行此逻辑,则可以简单地放弃触发器。