パッケージの実装の詳細は、パッケージ本体にあります。 パッケージ本体には、パッケージユーザーから見えないオブジェクトが含まれている場合があります。

次の構文は、パッケージ本体を定義するために使用されます。

CREATE [ OR REPLACE ] PACKAGE BODY package_name
  { IS | AS }
  [ private_declaration; ] ...
  [ procedure_or_function_definition ] ...
  [ package_initializer ]
 [ package_name ] ;

ここでは、

procedure_or_function_definition :=
procedure_definition | function_definition

ここでは、

procedure_definition :=
PROCEDURE proc_name[ argument_list ]
  [ options_list ]
  { IS | AS }
 procedure_body
 END [ proc_name ] ;

ここでは、

procedure_body :=
[ declaration; ] [, ...]
BEGIN
 statement; [...]
[ EXCEPTION
   { WHEN exception [OR exception] [...]] THEN statement; }
   [...]
]

ここでは、

function_definition :=
FUNCTION func_name [ argument_list ]
  RETURN rettype [DETERMINISTIC]
  [ options_list ]
  { IS | AS }
 function_body
 END [ func_name ] ;

ここでは、

function_body :=
[ declaration; ] [, ...]
BEGIN
 statement; [...]
[ EXCEPTION
  { WHEN exception [ OR exception ] [...] THEN statement; }
  [...]
]

ここでは、

argument_list :=
( argument_declaration [, ...] )

ここでは、

argument_declaration :=
argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ]

ここでは、

options_list :=
option [ ... ]

ここでは、

option :=
STRICT
LEAKPROOF
COST execution_cost
ROWS result_rows
SET config_param { TO value | = value | FROM CURRENT }

ここでは、

package_initializer :=
BEGIN
 statement; [...]
END;

パラメーター

パラメーター 説明
package_name このパッケージ本体が属するパッケージの名前。 この名前でパッケージ仕様を定義しておく必要があります。
private_declaration パッケージ内の任意のプロシージャまたは関数からアクセスできるプライベート変数の識別子。 ゼロ、1、またはそれ以上のプライベート変数が存在します。 有効値:
  • 変数宣言
  • レコード宣言
  • コレクション宣言
  • REF CURSOR および CURSOR 変数宣言
  • レコード、コレクション、および REF CURSOR の TYPE 定義
  • 例外
  • オブジェクト変数宣言
proc_name 作成するプロシージャの名前。
PRAGMA AUTONOMOUS_TRANSACTION 関数を自律型トランザクションとして設定するコマンド。
declaration 変数、型、REF CURSOR、またはサブプログラム宣言。 サブプログラム宣言が含まれている場合は、他のすべての変数、型、および REF CURSOR 宣言の後に宣言する必要があります。
statement 構造化プロセス言語 (SPL) プログラム文。 DECLARE-BEGIN-END ブロックは、SPL 文の一部と見なされます。 したがって、関数本体にはネストされたブロックが含まれる場合があります。
exception 例外条件名。 例: NO_DATA_FOUND、OTHERS。
func_name 作成する関数の名前。
rettype 戻り値のデータ型は、argtype でリストされた任意の型です。 argtype は、rettype の長さを指定することはできません。
DETERMINISTIC 同じ引数値を入力すると、関数は常に同じ結果を返すことを指定します。 DETERMINISTIC 関数を使用してデータベースを変更することはできません。
  • DETERMINISTIC キーワードは、PostgreSQL の IMMUTABLE オプションと同等です。
  • パッケージ本体のパブリック関数に DETERMINISTIC を指定する場合は、パッケージ仕様部の関数宣言にも DETERMINISTIC を指定する必要があります。 プライベート関数の場合、パッケージ仕様には関数宣言はありません。
PRAGMA AUTONOMOUS_TRANSACTION 関数を自律型トランザクションとして設定するコマンド。
declaration 変数、型、REF CURSOR、またはサブプログラム宣言。 サブプログラム宣言が含まれている場合は、他のすべての変数、型、および REF CURSOR 宣言の後に宣言する必要があります。
argname 仮引数の名前。 引数は、プロシージャ本体内でこの名前によって参照されます。
IN | IN OUT | OUT 引数モード。 IN: 引数は入力にのみ使用されます。 この値がデフォルトです。 IN OUT: 引数は、値を受け取り、値を返すために使用されます。 OUT: 引数は出力にのみ使用されます。
argtype 引数のデータ型。 引数の型は、基本データ型、%TYPE を使用する既存の列の型のコピー、またはネストしたテーブルやオブジェクト型などのユーザー定義型にすることができます。 基本データ型には長さを指定することはできません。 たとえば、データ型として VARCHAR2(10) ではなく VARCHAR2 を指定する必要があります。

tablename.columnname%TYPE を記述して、列の型を参照します。 これにより、プロシージャをテーブルの定義の変更から独立させることができます。

DEFAULT value プロシージャを呼び出すときに入力引数が指定されていない場合には、DEFAULT 句は入力引数のデフォルト値を提供します。 IN OUT または OUT モードの引数に DEFAULT を指定することはできません。
次のオプションは、Oracle データベースと互換性がありません。 これらは、ApsaraDB PolarDB によって提供される Oracle パッケージ構文の拡張機能にすぎません。
STRICT STRICT キーワードは、NULL 引数を指定して関数を呼び出した場合に、関数が実行されないことを指定します。 関数は代わりに NULL を返します。
LEAKPROOF LEAKPROOF キーワードは、戻り値を除いて、関数が引数に関する情報を公開しないことを指定します。
PARALLEL { UNSAFE | RESTRICTED | SAFE } PARALLEL 句を使用すると、並列モードで並列順次スキャンを使用することができます。 シリアル順次スキャンとは異なり、並列順次スキャンは複数のワーカーを使用して、照会中にリレーションを並行してスキャンします。 有効値:
  • UNSAFE: プロシージャまたは関数は並列モードでは実行することはできません。 この場合、並列実行プランが実装されます。 これは、PARALLEL 句を省略した場合のデフォルト値です。
  • RESTRICTED: プロシージャまたは関数は並列モードで実行できますが、実行は並列グループリーダーに制限されています。 特定の関係の資格に並列制限がある場合には、その関係を並列処理に選択することはできません。
  • SAFE: プロシージャまたは関数は、制限なしに並列モードで実行することができます。
execution_cost このパラメーターは、関数の推定実行コストを指定します。 値は正の整数である必要があります。 単位: cpu_operator_cost。 関数がセットを返す場合には、これは返された行ごとの実行コストのコレクションです。 デフォルト値は 0.0025 です。
result_rows クエリプランナーが関数が返すと予想する行の推定数。 デフォルト値は 1000 です。
SET SET 句は、関数の実行中にパラメーター値を設定するのに役立ちます。
  • config_param: パラメーター名を指定します。
  • value: パラメーターの値を指定します。
  • FROM CURRENT: 関数の終了時にパラメーター値が復元されることを保証します。
package_initializer package_initializer の文は、パッケージが最初に参照されるときに、セッションごとに 1 回実行されます。
STRICT、LEAKPROOF、PARALLEL、COST、ROWS、SET キーワードは、ApsaraDB PolarDB に拡張機能を提供できますが、Oracle ではサポートされていません。