既存のパッケージ仕様に対してパッケージ本体を作成します。
構文
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 REPLACE PACKAGE BODY は、新しいパッケージ本体を作成するか、既存のパッケージ本体を置換します。
スキーマ名を指定した場合、パッケージ本体はそのスキーマに作成されます。指定しない場合は、現在のスキーマに作成されます。新しいパッケージ本体の名前は、同じスキーマ内の既存のパッケージ仕様と一致する必要があり、同じスキーマ内の既存のパッケージ本体の名前と重複することはできません。既存のパッケージ本体の定義を更新するには、CREATE OR REPLACE PACKAGE BODY を使用します。
STRICT、LEAKPROOF、PARALLEL、COST、ROWS、およびSETキーワードは、PolarDB for PostgreSQL (Compatible with Oracle) の拡張機能を提供し、Oracle データベースではサポートされていません。
パラメーター
| パラメーター | 説明 |
|---|---|
name | パッケージ本体の名前。スキーマ修飾が可能です。 |
declaration | プライベート変数、型、カーソル、または REF CURSOR の宣言。 |
proc_name | ストアドプロシージャの名前。同じ名前とシグネチャを持つプロシージャがパッケージ仕様に存在する場合、そのプロシージャはパブリックであり、パッケージの外部からアクセスできます。そうでない場合はプライベートであり、パッケージ本体内からのみアクセスできます。 |
argname | 引数の名前。 |
IN | IN OUT | OUT | 引数モード。 |
argtype | 引数のデータ型。 |
DEFAULT value | 入力引数のデフォルト値。 |
STRICT | NULL 引数で呼び出された場合、関数は実行されません。代わりに、関数は NULL を返します。 |
LEAKPROOF | 関数は、その戻り値以外のいかなる手段によっても、引数に関する情報を漏洩しません。 |
PARALLEL { UNSAFE | RESTRICTED | SAFE } | ストアドプロシージャまたは関数が並列モードで実行できるかどうかを制御します。UNSAFE (デフォルト) — 並列モードで実行できません。このサブプログラムを含む SQL 文は、シリアル実行計画を使用します。RESTRICTED — 並列モードで実行できますが、パラレルグループリーダー上でのみ実行されます。SAFE — 制限なく並列モードで実行できます。 |
execution_cost | 推定実行コストを cpu_operator_cost の単位で指定します。セットを返す関数の場合、これは返される行あたりのコストです。デフォルト: 0.0025。 |
result_rows | プランナーが関数から返されると予測する行の推定数。デフォルト: 1000。 |
SET config_param { TO value | = value | FROM CURRENT } | 関数の実行期間中、構成パラメーターを設定します。FROM CURRENT は、関数が終了するときにパラメーターの値を復元します。 |
program_body | 関数またはストアドプロシージャの本体を構成するプラグマ、宣言、および SPL 文。プラグマには、サブプログラムを自律型トランザクションとしてマークするための PRAGMA AUTONOMOUS_TRANSACTION を指定できます。宣言には、変数、型、REF CURSOR、およびサブプログラムを含めることができます。サブプログラムの宣言は、他のすべての変数、型、および REF CURSOR の宣言の後に記述する必要があります。 |
func_name | 関数の名前。同じ名前とシグネチャを持つ関数がパッケージ仕様に存在する場合、その関数はパブリックです。そうでない場合はプライベートです。 |
rettype | 戻り値のデータ型。 |
DETERMINISTIC | 関数が同じ入力に対して常に同じ結果を返し、データベースを変更しないことを指定します。PostgreSQL の IMMUTABLE オプションに相当します。パッケージ本体のパブリック関数に DETERMINISTIC を指定する場合、パッケージ仕様の関数宣言でも指定する必要があります。プライベート関数の場合、パッケージ仕様の宣言は不要です。 |
statement | SPL プログラムの文。パッケージ初期化セクション (BEGIN...END) の文は、パッケージがセッションで最初に参照されたときに一度だけ実行されます。 |
例
次の例では、empinfo パッケージのパッケージ本体を作成します。パッケージ本体は、プライベート変数 v_counter を宣言し、get_name プロシージャと display_counter 関数を実装し、パッケージ初期化セクションで v_counter を初期化します。
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;v_counter はプライベート変数です。パッケージ本体内のすべてのサブプログラムからアクセスできますが、パッケージの外部から直接読み取ったり変更したりすることはできません。パブリック変数 emp_name とパブリック関数 display_counter は、パッケージの状態へのアクセスを制御された形で公開します。
次の 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: 1BEGIN
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初期化セクション (BEGIN v_counter := 0;) は、パッケージがセッションで最初に参照されたときに一度だけ実行されます。同じセッション内の後続の呼び出しでは初期化がスキップされるため、クエリのカウンターは両方の匿名ブロックにわたってインクリメントされます。
次のステップ
CREATE PACKAGE — このパッケージ本文が実装するパッケージ仕様を定義します。
DROP PACKAGE — パッケージおよびその本文を削除します