触发执行期间出错-ORA-04088?

时间:2016-07-28 07:47:22

标签: oracle triggers

如果更新值超出员工薪水的范围,则触发器将起作用。

这是我的触发器代码:

CREATE OR REPLACE TRIGGER check_sal_range_12483
  BEFORE UPDATE OF min_salary, max_salary ON cux_jobs_12483
  FOR EACH ROW
DECLARE
  v_num NUMBER;
BEGIN

  SELECT e.employee_id
    INTO v_num
    FROM cux_employees_12483 e
   WHERE e.job_id = 'SA_MAN'
     AND e.salary NOT BETWEEN :NEW.min_salary AND :NEW.max_salary;

  IF SQL%ROWCOUNT >= 1 THEN
    raise_application_error(-20901, 'Salary out of range!');
  END IF;

EXCEPTION
  WHEN no_data_found THEN
    dbms_output.put_line(SQLCODE || SQLERRM);
  WHEN too_many_rows THEN
    dbms_output.put_line(SQLCODE || SQLERRM);
  WHEN OTHERS THEN
    dbms_output.put_line(SQLCODE || SQLERRM);
    raise_application_error(-20901, 'Salary out of range!');
END;

这是电话:

BEGIN
  UPDATE cux_jobs_12483
     SET min_salary = 500, max_salary = 10000
   WHERE job_id = 'SA_MAN';
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line(SQLCODE || SQLERRM);
END;

错误代码是:

-20901ORA-20901: Salary out of range!
ORA-06512: at "CHECK_SAL_RANGE_12483", line 12
ORA-04088: error during execution of trigger 'CHECK_SAL_RANGE_12483'

如果我没有在触发器的EXCEPTION中添加raise_application_error,则更新将成功并触发dosen-to工作。

1 个答案:

答案 0 :(得分:0)

这就是异常的工作方式:如果你抓住它们,它们就不会自动被提升到调用者。所以不要(去)抓住他们;)如果这就是你想要的。

  IF SQL%ROWCOUNT >= 1 THEN
    raise_application_error(-20901, 'Salary out of range!');
  END IF;

您的触发器会中断更新,异常阻止:

EXCEPTION
  WHEN ...
  WHEN OTHERS THEN
    dbms_output.put_line(SQLCODE || SQLERRM);
    raise_application_error(-20901, 'Salary out of range!');
END;

但你这里做错了什么!

...因为如果没有与金额相关联,您就会提高工资错误事件!你可以在任何“OTHERS”情况下提出它。

在任何情况下,你必须删除这个引发错误错误的东西,所以:

EXCEPTION
  WHEN no_data_found THEN
    dbms_output.put_line(SQLCODE || SQLERRM);
  WHEN too_many_rows THEN
    dbms_output.put_line(SQLCODE || SQLERRM);
  WHEN OTHERS THEN
    dbms_output.put_line(SQLCODE || SQLERRM);
    raise;
END;