PL/SQL 例外處理採用類似 Ada 的全包含錯誤管理機制。執行期錯誤發生時,程式無條件跳轉至 EXCEPTION 區塊,將錯誤處理邏輯與主流程分離,確保代碼清晰。僅執行期例外可被捕捉,編譯錯誤不在此列。
RAISE 陳述式: RAISE exception_name; 可拋出預定義或自訂例外。RAISE_APPLICATION_ERROR 預存程序: 攜帶自訂錯誤碼(-20999 至 -20000)與訊息拋出例外。EXCEPTION
WHEN exception_name1 THEN
handling_code1;
WHEN exception_name2 THEN
handling_code2;
WHEN OTHERS THEN
default_handling_code;
WHEN 子句。WHEN OTHERS 必須置於最後作為預設處理器。EXCEPTION 區。EXCEPTION,未捕捉則向上傳播。EXCEPTION 區。RAISE 無參數呼叫在例外處理器中執行紀錄、清理等動作後,使用 RAISE; 重新拋出原例外,使其繼續傳播。注意 DBMS_OUTPUT (512 bytes) 與 UTL_FILE (1000 bytes) 輸出長度限制,避免處理器內再次拋出未處理例外。
Oracle 內建例外宣告於 STANDARD 套件,如 NO_DATA_FOUND、ZERO_DIVIDE 等。
DECLARE
my_exception EXCEPTION;
BEGIN
RAISE my_exception;
EXCEPTION
WHEN my_exception THEN ...
END;
作用域遵循變數規則:外層宣告的例外可被內層存取,內層宣告的例外不可被外層處理。同名自訂例外會遮蔽內建例外。
PRAGMA EXCEPTION_INITDECLARE
invalid_table EXCEPTION;
PRAGMA EXCEPTION_INIT(invalid_table, -942);
BEGIN
...
EXCEPTION
WHEN invalid_table THEN ...
END;
SQLCODE / SQLERRMSQLCODE:回傳當前資料庫錯誤碼(NO_DATA_FOUND 為 +100,其餘為負數)。SQLERRM:回傳錯誤文字描述。RAISE_APPLICATION_ERROR 才能獲得有意義的 SQLCODE/SQLERRM。RAISE_APPLICATION_ERROR 完整語法RAISE_APPLICATION_ERROR(error_number, error_message [, {TRUE | FALSE}]);
error_number:-20999 至 -20000。error_message:最長 2048 位元組。TRUE 疊加至錯誤堆疊,FALSE (預設) 覆蓋。GOTO 無法在執行區與例外區之間跳轉。WHEN OTHERS 記錄未預期錯誤,並重新拋出或轉換為應用層例外。