1. 程式人生 > >pl/sql 內部程式塊 &異常處理

pl/sql 內部程式塊 &異常處理

DECLARE
   		--子程式宣告部分,例如定義變數,常量,遊標
   		BEGIN
   		--	子程式編寫sql語句
   		EXECTPTION
   			--	子程式處理異常
   			END;
SQL> DECLARE
  2   v_x NUMBER :=30; --全域性變數
  3   BEGIN
  4     DECLARE
  5             v_x VARCHAR2(40):='ABC'; --區域性變數,只能在內部程式塊中使用
  6             v_y NUMBER:=30;
  7     BEGIN
  8             DBMS_OUTPUT.put_line('內部程式塊中輸出: v_x ='||v_x);
  9             DBMS_OUTPUT.put_line('內部程式塊中輸出: v_y ='||v_y);
 10     END;
 11     DBMS_OUTPUT.put_line('外部程式塊中輸出: v_x ='||v_x);
 12  END;
 13  /
內部程式塊中輸出: v_x =ABC
內部程式塊中輸出: v_y =30
外部程式塊中輸出: v_x =30

PL/SQL 過程已成功完成。

異常處理語法
WHEN 異常型別 | 使用者定義異常 | 異常程式碼 | OTHERS THEN
異常處理;

SQL> DECLARE
  2     v_result NUMBER;
  3     BEGIN
  4     v_result :=10/0;
  5     EXCEPTION
  6             WHEN zero_divide THEN
  7             DBMS_OUTPUT.put_line('被除數不能為0');
  8             DBMS_OUTPUT.put_line('SQLCODE = '|| SQLCODE );
  9  END;
 10  /
被除數不能為0
SQLCODE = -1476

PL/SQL 過程已成功完成。

使用者定義異常
方式1:
宣告異常物件並用名稱來引用它,使用others 異常捕獲使用者定義的異常
方式2:
宣告異常物件並將他與有效的Oracle錯誤程式碼對映,需要編寫單獨的WHEN
語句捕獲

SQL> DECLARE
  2     v_data NUMBER;
  3     v_myexp EXCEPTION;
  4     BEGIN
  5     v_data:=&inputdata;
  6     IF v_data >10 THEN
  7     RAISE v_myexp;
  8     END IF;
  9     EXCEPTION
 10             WHEN others THEN
 11             DBMS_OUTPUT.put_line('輸入資料錯誤');
 12             DBMS_OUTPUT.put_line('SQLCODE = '|| SQLCODE );
 13                     DBMS_OUTPUT.put_line('SQLERRM = '|| SQLERRM );
 14  END;
 15  /
輸入 inputdata 的值:  20
原值    5:      v_data:=&inputdata;
新值    5:      v_data:=20;
輸入資料錯誤
SQLCODE = 1
SQLERRM = User-Defined Exception

PL/SQL 過程已成功完成。

為自定義異常設定異常程式碼
PRAGMA EXCEPTION_INIT(異常名稱,Oracle錯誤程式碼);

SQL> DECLARE
  2     v_data NUMBER;
  3     v_myexp EXCEPTION;
  4     PRAGMA EXCEPTION_INIT(v_myexp,-20789);
  5     BEGIN
  6     v_data:=&inputdata;
  7     IF v_data >10 THEN
  8     RAISE v_myexp;
  9     END IF;
 10     EXCEPTION
 11             WHEN others THEN
 12             DBMS_OUTPUT.put_line('輸入資料錯誤');
 13             DBMS_OUTPUT.put_line('SQLCODE = '|| SQLCODE );
 14                     DBMS_OUTPUT.put_line('SQLERRM = '|| SQLERRM );
 15  END;
 16  /
輸入 inputdata 的值:  20
原值    6:      v_data:=&inputdata;
新值    6:      v_data:=20;
輸入資料錯誤
SQLCODE = -20789
SQLERRM = ORA-20789:

PL/SQL 過程已成功完成。

動態異常
RAISE_APPLICATION_ERROR(錯誤號,錯誤資訊[,是否新增到錯誤棧])
錯誤號:只接受-20000 - -20999範圍內的錯誤號,與宣告的錯誤號一致
錯誤資訊:用於定義在使用SQLERRM輸出時的錯誤提升資訊.
是否新增錯誤到錯誤棧,如果設定為TRUE,則表示將錯誤新增到任意已有錯誤棧,可選

SQL> DECLARE
  2     v_data NUMBER;
  3     v_myexp EXCEPTION;
  4     PRAGMA EXCEPTION_INIT(v_myexp,-20789);
  5     BEGIN
  6     v_data:=&inputdata;
  7     IF v_data >10 THEN
  8             RAISE_APPLICATION_ERROR(-20789,'資料有誤');
  9     END IF;
 10     EXCEPTION
 11             WHEN others THEN
 12             DBMS_OUTPUT.put_line('輸入資料錯誤');
 13             DBMS_OUTPUT.put_line('SQLCODE = '|| SQLCODE );
 14                     DBMS_OUTPUT.put_line('SQLERRM = '|| SQLERRM );
 15  END;
 16  /
輸入 inputdata 的值:  20
原值    6:      v_data:=&inputdata;
新值    6:      v_data:=20;
輸入資料錯誤
SQLCODE = -20789
SQLERRM = ORA-20789: 資料有誤

PL/SQL 過程已成功完成。