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は、プラグマに関連付けられたユーザー定義のエラーコードです。 マップされていないexception_number値を指定すると、サーバーは警告を返します。
exception_codeは、事前定義された例外の名前です。 有効な例外の一覧については、「PostgreSQLコアドキュメント」をご参照ください。
ユーザー定義例外には、パッケージでユーザー定義例外を宣言する方法を示す例が含まれていました。 次の例では、同じ基本構造を使用しますが、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;次のプロシージャ (購入) は、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が例外を発生すると、実行は購入で定義された例外ハンドラーにジャンプします。
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;