PRAGMA EXCEPTION_INIT將使用者定義的錯誤碼與異常相關聯。PRAGMA EXCEPTION_INIT聲明可包含在任何塊、子塊或包中。只能在聲明異常後將錯誤碼分配給該異常(使用PRAGMA EXCEPTION_INIT)。
文法
PRAGMA EXCEPTION_INIT聲明的格式如下:
PRAGMA EXCEPTION_INIT(exception_name,
{exception_number | exception_code})其中:
exception_name是關聯異常的名稱。
Exception_number是使用者定義的錯誤碼,與pragma關聯。如果您指定未映射的exception_number,伺服器將返回一條警告。
Exception_code是預定義異常的名稱。有關有效異常的完整列表,請參見Postgres 樞紐文件。
樣本
在使用者定義的異常中提供了一個樣本,其中示範了如何在包中聲明使用者定義的異常。以下樣本使用了相同的基本結構,新增了PRAGMA EXCEPTION_INIT聲明:
CREATE OR REPLACE PACKAGE ar AS overdrawn EXCEPTION; PRAGMA EXCEPTION_INIT (overdrawn, -20100); PROCEDURE check_balance(p_balance NUMBER, p_amount NUMBER); END; CREATE OR REPLACE PACKAGE BODY ar AS PROCEDURE check_balance(p_balance NUMBER, p_amount NUMBER) IS BEGIN IF (p_amount > p_balance) THEN RAISE overdrawn; END IF; END; END;以下預存程序 (purchase) 調用check_balance預存程序。如果p_amount大於p_balance,則check_balance會引發異常,purchase會捕獲ar.overdrawn異常。
CREATE PROCEDURE purchase(customerID int, amount NUMERIC) AS BEGIN ar.check_balance(getcustomerbalance(customerid), amount); record_purchase(customerid, amount); EXCEPTION WHEN ar.overdrawn THEN DBMS_OUTPUT.PUT_LINE ('This account is overdrawn.'); DBMS_OUTPUT.PUT_LINE ('SQLCode :'||SQLCODE||' '||SQLERRM ); END;當ar.check_balance引發異常時,執行會跳到purchase中定義的例外處理常式。
EXCEPTION WHEN ar.overdrawn THEN DBMS_OUTPUT.PUT_LINE ('This account is overdrawn.'); DBMS_OUTPUT.PUT_LINE ('SQLCode :'||SQLCODE||' '||SQLERRM );該例外處理常式會返回一條錯誤訊息,後跟SQLCODE資訊:
This account is overdrawn. SQLCODE: -20100 User-Defined Exception以下樣本示範了如何使用預定義的異常。代碼為no_data_found異常建立了一個更有意義的名稱,如果給定的客戶不存在,代碼會捕獲異常,調用DBMS_OUTPUT.PUT_LINE以報告錯誤,然後重新引發原始異常:
CREATE OR REPLACE PACKAGE ar AS unknown_customer EXCEPTION; PRAGMA EXCEPTION_INIT (unknown_customer, no_data_found); PROCEDURE check_balance(p_customer_id NUMBER); END; CREATE OR REPLACE PACKAGE BODY ar AS PROCEDURE check_balance(p_customer_id NUMBER) IS DECLARE v_balance NUMBER; BEGIN SELECT balance INTO v_balance FROM customer WHERE cust_id = p_customer_id; EXCEPTION WHEN unknown_customer THEN DBMS_OUTPUT.PUT_LINE('invalid customer id'); RAISE; END; END;