# Exception Handle ###### tags: `Oracle` `SQL` ORACLE 有三種類型的異常 1.Predefined 異常 >標準ORACLE錯誤 ORACLE自動拋出 2.非Predefined異常 >標準ORACLE錯誤 但須由使用者定義後 ORACLE拋出 3.自定義異常 >使用者自定義 自行拋出 三種方式拋出異常 通過PL/SQL執行時 拋出ORACLE異常 使用RAISE語法 拋出自定義異常 使用RAISE_APPLICATION_ERROR SP 拋出自定義異常 BEGIN ... EXCEPTION WHEN NO_DATA_FOUND THEN ... WHEN OTHERS THEN ... END; Oracle已存在Exception例外處理(但自定Exception名稱) //非Predefined異常 DECLARE l_row abc%ROWTYPE; my_no_data_found_exp EXCEPTION; PRAGMA EXCEPTION_INIT(my_no_data_found_exp, -01403); --no data found Exception BEGIN BEGIN select * INTO l_row from abc where abc01='123@asd'; EXCEPTION WHEN my_no_data_found_exp THEN DBMS_OUTPUT.put_line('--> NO_DATA_FOUND err is ' || SQLERRM); WHEN OTHERS THEN DBMS_OUTPUT.put_line('--> OTHER err is ' || SQLERRM); END; END; 使用者自訂例外處理1 DECLARE l_ex_error EXCEPTION; BEGIN BEGIN IF (條件式) THEN RAISE l_ex_error; END IF; EXCEPTION WHEN l_ex_error THEN DBMS_OUTPUT.put_line('--> l_ex_error err is ' || SQLERRM); WHEN OTHERS THEN DBMS_OUTPUT.put_line('--> other err is ' || SQLERRM); END; END; 使用者自訂例外處理2 PACKAGE DBMS_STANDARD.RAISE_APPLICATION_ERROR 可將錯誤訊息轉回客戶端 RAISE_APPLICATION_ERROR(error_number, error_message, [keep_errors] ); error_number –20,000 到 –20,999 error_message <2048 BYTE keep_errors TRUE則新的ERROR加入舊的ERROR中 DECLARE l_ex_error EXCEPTION; PRAGMA EXCEPTION_INIT(l_ex_error, -20001); BEGIN BEGIN RAISE_APPLICATION_ERROR(-20001, 'this is my application error!'); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line('--> err is ' || SQLERRM); END; END;