CREATE OR REPLACE TRIGGER trg_dept_time
BEFORE INSERT OR DELETE OR UPDATE
ON hr.employees
BEGIN
IF (TO_CHAR(sysdate,'DAY') IN ('星期六', '星期日') )
OR (TO_CHAR(sysdate, 'HH24:MI') NOT BETWEEN '08:30' AND '16:00') THEN
RAISE_APPLICATION_ERROR(-20001, '不是上班时间,不能修改departments表');
END IF;
END;
BEGIN
delete from hr.employees where EMPLOYEE_ID='198' ;
exception
when others then
DBMS_OUTPUT.PUT_LINE(SQLCODE || '-->'|| SQLERRM );
end;
結果:
-20001-->ORA-20001: 不是上班时间,不能修改departments表
ORA-06512: 在 "XX.TRG_DEPT_TIME", line 4
ORA-04088: 執行觸發程式 'XX.TRG_DEPT_TIME' 時發生錯誤
請問:
1.EXCEPTION 中 OTHER 已經有 抓到 others的 ERROR 了,為何還 PRINT 出其他2行
ORA-06512: 在 "XX.TRG_DEPT_TIME", line 4
ORA-04088: 執行觸發程式 'XX.TRG_DEPT_TIME' 時發生錯誤
2.有辦法在EXCEPTION 中,直接用錯誤碼的數字 嗎?
EXCEPTION
WHEN -20001 THEN
...
WHEN OTHERS THEN
...
謝謝!
------解决思路----------------------
输出的时候可以利用换行符截取SQLERRM,只输出SQLERRM第一行的内容
试试下面的语句
DBMS_OUTPUT.PUT_LINE(SQLCODE
------解决思路----------------------
'-->'
------解决思路----------------------
substr(SQLERRM,1,instr(SQLERRM,chr(10))-1);
第2個問題,只能是用 WHEN OTHER 來抓全部EXPTION
再用 if SQLCODE='-20001' then 等分别处理了
oracle只接受内部预定义的异常,直接写-20001,oracle是不能识别的