触发器中 ORA-06512 中的未识别错误
Posted
技术标签:
【中文标题】触发器中 ORA-06512 中的未识别错误【英文标题】:Unidentified error in ORA-06512 in triggers 【发布时间】:2018-06-26 01:46:19 【问题描述】:怎么了?一切似乎都很好。但是....
CREATE OR REPLACE TRIGGER salary_change
BEFORE UPDATE
OF emp_salary
ON employee
FOR EACH ROW
WHEN (((NEW.emp_salary-OLD.emp_salary)/OLD.emp_salary)>0.2)
DECLARE
limit NUMBER(7);
BEGIN
limit:=:OLD.emp_salary*1.2;
RAISE_APPLICATION_ERROR (-20000,'rule violated. cannot increase beyond : '|| limit);
END;
我有错误:
第 3 行出现错误: ORA-20000: 违反规则。不能超过:3360 ORA-06512: 在 "SYSTEM.SALARY_CHANGE" 第 5 行 ORA-04088: 执行触发器 'SYSTEM.SALARY_CHANGE' 期间出错
【问题讨论】:
【参考方案1】:ORA-06512 只是告诉您代码中的哪一行导致了错误。在这种情况下,它是触发器中的第 5 行,显然对应于 RAISE_APPLICATION_ERROR 调用。
所以,显然((NEW.emp_salary - OLD.emp_salary) / OLD.emp_salary
大于 0.2。鉴于消息中的限制值为 3360,这意味着 OLD.EMP_SALARY 为 2800,而 NEW.EMP_SALARY 大于 3360。
祝你好运
【讨论】:
【参考方案2】:USING RAISE_APPLICATION_ERROR ALSO GIVES ERROR ORA-06512 AND POSSIBLY ORA-04088
CREATE OR REPLACE TRIGGER hr.salary_change
before UPDATE
OF salary
ON hr.employees
FOR EACH ROW
WHEN (((NEW.salary-OLD.salary)/OLD.salary)>0.2)
DECLARE
limit NUMBER(8,2);
salary_high exception;
pragma exception_init(salary_high ,-20001);
BEGIN
limit:=:OLD.salary*1.2;
RAISE_APPLICATION_ERROR (-20001,' rule violated. cannot increase beyond :'||to_char(limit));
exception
when salary_high then
:NEW.salary:=:OLD.salary;
dbms_output.put_line(dbms_utility.format_error_stack);
END;
SQL> SET SERVEROUT ON
SQL> select salary from hr.employees where employee_id=198;
SALARY
----------
3900
SQL> update hr.employees set salary=5900 where employee_id=198;
ORA-20001: rule violated. cannot increase beyond :4680
1 row updated.
SQL> select salary from hr.employees where employee_id=198;
SALARY
----------
3900
SQL>
【讨论】:
以上是关于触发器中 ORA-06512 中的未识别错误的主要内容,如果未能解决你的问题,请参考以下文章
PlSQL 触发错误 ORA-0000 ORA-06512:
Ora-30036 Ora-06512 和 Ora-04088