2013-12-12 28 views
0

我有这个简单的触发器,它的工作,但它给了我几个错误。语法似乎是正确的。简单的oracle触发器的作品,但给我的错误

这是我的代码:

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

*

ERROR位于第1行:

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

ORA-06512:在 “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

我不是一个plsql专家,但不是你的代码抛出错误? –

+0

让我用我正在使用的pl/sql代码进行更新。 –

+4

这是你的异常被提出。抓住它并在调用块中打印一条消息。或者,如果你想继续通过其他记录,可以用'begin''异常'块来包装update语句。 – Glenn

回答

2

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

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

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