---
# System prepended metadata

title: Exception Handle
tags: [SQL, Oracle]

---

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