パッケージ本体を作成します。

構文

CREATE [ OR REPLACE ] PACKAGE BODY name
{ IS | AS }
  [ declaration; ] [, ...]
  [ { PROCEDURE proc_name
      [ (argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ]
        [, ...]) ]
      [ STRICT ]
      [ LEAKPROOF ]
      [ PARALLEL { UNSAFE | RESTRICTED | SAFE } ]
      [ COST execution_cost ]
      [ ROWS result_rows ]
      [ SET config_param { TO value | = value | FROM CURRENT } ]
    { IS | AS }
        program_body
      END [ proc_name ];
    |
      FUNCTION func_name
      [ (argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ]
        [, ...]) ]
      RETURN rettype [ DETERMINISTIC ]
      [ STRICT ]
      [ LEAKPROOF ]
      [ PARALLEL { UNSAFE | RESTRICTED | SAFE } ]
      [ COST execution_cost ]
      [ ROWS result_rows ]
      [ SET config_param { TO value | = value | FROM CURRENT } ]
    { IS | AS }
        program_body
      END [ func_name ];
    }
  ] [, ...]
  [ BEGIN
      statement; [, ...] ]
  END [ name ]

説明

CREATE PACKAGE BODY は、パッケージ本体を作成します。 CREATE OR REPLACEPACKAGE BODY は、新しいパッケージ本体を作成するか、または既存の本体を置き換えます。

スキーマ名を指定すると、指定したスキーマにパッケージ本体が作成されます。 それ以外の場合は、パッケージ本体は現在のスキーマに作成されます。 新しいパッケージ本体の名前は、同じスキーマ内の既存のパッケージ仕様と一致する必要があります。 新しいパッケージ本体の名前は、同じスキーマ内の既存のパッケージ本体と同じにすることはできません。 既存のパッケージ本体の定義を更新する場合は、CREATE OR REPLACE PACKAGE BODY コマンドを使用します。

パラメーター

パラメーター 説明
name 作成するパッケージ本体の名前。 名前はスキーマで修飾できます。
declaration プライベート変数、型、カーソル、または REF CURSOR 宣言。
proc_name パブリックストアドプロシージャまたはプライベートストアドプロシージャの名前。 同じ署名を持つ proc_name がパッケージ仕様に存在する場合、ストアドプロシージャはパブリックです。 それ以外の場合は、ストアドプロシージャはプライベートです。
argname 引数の名前。
IN | IN OUT | OUT 引数モード。
argtype プログラム引数のデータ型。
DEFAULT value 入力引数のデフォルト値。
STRICT STRICT キーワードを指定すると、NULL パラメーターを使用して関数を呼び出した場合、関数が実行されません。 逆に、関数は NULL を返します。
LEAKPROOF LEAKPROOF キーワードは、関数が戻り値による方法以外に、引数に関する情報を公開しないことを指定します。
PARALLEL { UNSAFE | RESTRICTED | SAFE } PARALLEL 句は、並列順次スキャン (並列モード) の使用を有効にします。 並列順次スキャンは、シリアル順次スキャンとは対照的に、クエリ中に複数のワーカーを使用してリレーションを並行してスキャンします。
  • このパラメーターが UNSAFE に設定されている場合は、ストアドプロシージャまたは関数は並列モードで実行できません。 このようなストアドプロシージャまたは関数が SQL 文に存在する場合は、シリアル実行プランが実施されます。 PARALLEL 句が省略されている場合は、この動作デフォルト設定です。
  • このパラメーターが RESTRICTED に設定されている場合は、ストアドプロシージャまたは関数は並列モードで実行できますが、実行は並列グループリーダーに制限されています。 特定の関係の資格に並列制限されたコンテンツがある場合は、その関係は並列実行用に選択されません。
  • このパラメーターが SAFE に設定されている場合は、ストアドプロシージャまたは関数は、制限なしに並列モードで実行することができます。
execution_cost execution_cost は、関数の推定実行コストを示す正の値です。 単位は cpu_operator_cost です。 関数がセットを返す場合、これは返された各行のコストです。 デフォルト値は 0.0025 です。
result_rows result_rows は正の値であり、プランナーが関数が返すと予想する行の推定数を示します。 既定値は 1000 です。
SET SET 句を使用して、関数の期間のパラメーター値を指定することができます。
  • config_param はパラメーター名を指定します。
  • value はパラメーター値を指定します。
  • FROM CURRENT は、関数の終了時にパラメーター値が確実に復元されるようにします。
program_body 関数またはストアドプロシージャの本体を構成するプラグマ、宣言、および SPL 文。

プラグマを PRAGMA AUTONOMOUS_TRANSACTION にして、関数またはストアドプロシージャを自律型トランザクションとして設定することができます。

宣言には、変数、型、REF CURSOR、およびサブプログラムの宣言を含めることができます。 サブプログラム宣言が含まれている場合は、他のすべての変数、型、および REF CURSOR 宣言の後に宣言する必要があります。

func_name パブリックまたはプライベート関数の名前。 同じ署名を持つ func_name がパッケージ仕様に存在する場合、関数はパブリックです。 それ以外の場合、関数は呼び出されません。
rettype 戻り値のデータ型。
DETERMINISTIC DETERMINISTIC を使用すると、同じ引数値が指定されている場合、関数が常に同じ結果を返すように指定できます。 DETERMINISTIC 関数はデータベースを変更しません。
  • DETERMINISTIC キーワードは、PostgreSQL の IMMUTABLE オプションと同等です。
  • パッケージ本体のパブリック関数に DETERMINISTIC キーワードを指定した場合は、パッケージ仕様の関数宣言にもこのキーワードを指定する必要があります。 プライベート関数の場合、関数宣言はパッケージ仕様に含まれていません。
statement SPL プログラム文。 パッケージが初めて参照される場合、パッケージ初期化セクションの文は、セッションごとに 1 回実行されます。
STRICTLEAKPROOFPARALLELCOSTROWS、および SET キーワードは、Oracle 互換の PolarDB データベースの拡張機能です。 ただし、これらのキーワードは Oracle データベースではサポートされていません。

以下は、empinfo パッケージのパッケージ本体です。

CREATE OR REPLACE PACKAGE BODY empinfo
IS
    v_counter INTEGER;
    PROCEDURE get_name (
        p_empno NUMBER
    )
    IS
    BEGIN
        SELECT ename INTO emp_name FROM emp WHERE empno = p_empno;
        v_counter := v_counter + 1;
    END;
    FUNCTION display_counter
    RETURN INTEGER
    IS
    BEGIN
        RETURN v_counter;
    END;
BEGIN
    v_counter := 0;
    DBMS_OUTPUT.PUT_LINE('Initialized counter');
END;

次の 2 つの匿名ブロックは、empinfo パッ ケージのストアドプロシージャと関数を実行し、パブリック変数を表示します。

BEGIN
    empinfo.get_name(7369);
    DBMS_OUTPUT.PUT_LINE('Employee Name : ' || empinfo.emp_name);
    DBMS_OUTPUT.PUT_LINE('Number of queries: ' || empinfo.display_counter);
END;

Initialized counter
Employee name: SMITH
Number of queries: 1

BEGIN
    empinfo.get_name(7900);
    DBMS_OUTPUT.PUT_LINE('Employee Name : ' || empinfo.emp_name);
    DBMS_OUTPUT.PUT_LINE('Number of queries: ' || empinfo.display_counter);
END;

Employee name: JAMES
Number of queries: 2