PL/SQL_處理例外2(非預定義異常、自定義異常)
阿新 • • 發佈:2019-01-29
處理非預定義例外
為了提高PL/SQL程式的健壯性,應該在PL/SQL應用程式中合理地處理這些Oracle錯誤,此時就需要使用非預定義例外。使用非預定義例外的步驟如下圖所示:示例如下:
DECLARE e_integrity EXCEPTION; PRAGMA EXCEPTION_INIT(e_integrity,-2291); BEGIN UPDATE emp SET deptno = &dno WHERE empno = &eno; EXCEPTION WHEN e_integrity THEN dbms_output.put_line('該部門不存在'); END;
處理自定義例外
與預定義例外和非預定義例外不同,自定義例外必須顯式觸發。使用自定義例外的步驟如下圖所示:示例如下:
DECLARE e_integrity EXCEPTION; PRAGMA EXCEPTION_INIT(e_integrity,-2291); v_no_emp EXCEPTION; BEGIN UPDATE emp SET deptno = &dno WHERE empno = &eno; IF SQL%NOTFOUND THEN RAISE v_no_emp; END IF; EXCEPTION WHEN e_integrity THEN dbms_output.put_line('該部門不存在'); WHEN v_no_emp THEN dbms_output.put_line('該僱員不存在'); END;
使用例外函式
當在PL/SQL塊中出現Oracle錯誤時,通過使用例外函式可以取得錯誤號以及相關的錯誤訊息,其中函式SQLCODE用於取得Oracle錯誤號,而SQLERRM則用於取得與之相關的錯誤資訊。另外,通過儲存過程、函式和包中使用RAISE_APPLICATION_ERROR可以自定義錯誤號和錯誤訊息。1、SQLCODE和SQLERRM
2、RAISE_APPLICATION_ERRORDECLARE v_ename emp.ename%TYPE; BEGIN SELECT ename INTO v_ename FROM emp WHERE sal = &sal; dbms_output.put_line('僱員名:' || v_ename); EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('不存在工資為:' || &sal || '的僱員'); WHEN OTHERS THEN dbms_output.put_line('錯誤號:' || SQLCODE); dbms_output.put_line('錯誤訊息:' || SQLERRM); END;
該過程用於在PL/SQL應用程式中自定義錯誤訊息。注意,該過程只能在資料庫端的子程式(過程、函式、包、觸發器)中使用,而不能在匿名塊和客戶端的子程式中使用。使用該過程的語法如下:
raise_application_error(error_number,message[,{TRUE | FALSE }]);
示例如下:DECLARE
v_comm emp.comm%TYPE;
BEGIN
SELECT comm INTO v_comm FROM emp
WHERE empno = &eno;
IF v_comm IS NULL THEN
RAISE_APPLICATION_ERROR(-20000,'該僱員無補助');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('該僱員不存在');
END;