1. 程式人生 > >PL/SQL_處理例外2(非預定義異常、自定義異常)

PL/SQL_處理例外2(非預定義異常、自定義異常)

處理非預定義例外

為了提高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
DECLARE
  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;
2、RAISE_APPLICATION_ERROR
該過程用於在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;