Неопознанная ошибка в ORA-06512 в триггерах - PullRequest
0 голосов
/ 26 июня 2018

что не так?все вроде нормально.но ....

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"

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

ИСПОЛЬЗОВАНИЕ RAISE_APPLICATION_ERROR ТАКЖЕ ДАЕТ ОШИБКУ ORA-06512 И ВОЗМОЖНО 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>
0 голосов
/ 26 июня 2018

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.

Удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...