触发器中 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 中的未识别错​​误的主要内容,如果未能解决你的问题,请参考以下文章

For循环中触发失败

PlSQL 触发错误 ORA-0000 ORA-06512:

Ora-30036 Ora-06512 和 Ora-04088

错误:无法正确创建触发器(ORA-24344:编译错误 ORA-06512 成功)。甲骨文 SQL

小片段中的 ORA-06512 [重复]

ORA-13516 / ORA-06512 DBCA建库,密码特殊符号报错