全部產品
Search
文件中心

PolarDB:PRAGMA EXCEPTION_INIT

更新時間:Sep 25, 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是使用者定義的錯誤碼,與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;