当前位置: 代码迷 >> Oracle管理 >> TRIGER RAISE /CATCH 問題,该如何处理
  详细解决方案

TRIGER RAISE /CATCH 問題,该如何处理

热度:127   发布时间:2016-04-24 04:13:32.0
TRIGER RAISE /CATCH 問題
本帖最后由 wayout99 于 2014-10-01 16:52:02 编辑
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是不能识别的