我有这个简单的触发器,它可以工作,但它给了我一些错误。语法似乎正确。
这是我的代码:
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;
答案 0 :(得分:2)
代码中的问题不是你的触发器,而是它背后的业务逻辑。我可以看到,根据您的问题,您的所有代码都按照预期正常运行。这里的问题是你不知道期望是什么。
这是使用触发器强制执行高级审核的简单案例。您的业务分析师或在此代码之前为您工作的编码员认为,员工的工资不得超过一定数额。他们希望确保没有人输入错误的值,即使跳过前端并直接查询数据库。因此,此触发器已编程。
您现在可以做的是修改您的前端以向用户显示此例外。或者,与您的业务分析师交谈,如果他认为您不需要强制执行此逻辑,则可以简单地放弃触发器。