# 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;