すべてのプロダクト
Search
ドキュメントセンター

PolarDB:PRAGMA EXCEPTION_INIT

最終更新日:Sep 26, 2024

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;