如果更新值超出员工薪水的范围,则触发器将起作用。
这是我的触发器代码:
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工作。
答案 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;