pl/sql 內部程式塊 &異常處理
阿新 • • 發佈:2018-11-23
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 過程已成功完成。