パッケージ本体を作成します。
構文
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 句は、並列順次スキャン (並列モード) の使用を有効にします。 並列順次スキャンは、シリアル順次スキャンとは対照的に、クエリ中に複数のワーカーを使用してリレーションを並行してスキャンします。
|
execution_cost | execution_cost は、関数の推定実行コストを示す正の値です。 単位は cpu_operator_cost です。 関数がセットを返す場合、これは返された各行のコストです。 デフォルト値は 0.0025 です。 |
result_rows | result_rows は正の値であり、プランナーが関数が返すと予想する行の推定数を示します。 既定値は 1000 です。 |
SET | SET 句を使用して、関数の期間のパラメーター値を指定することができます。
|
program_body | 関数またはストアドプロシージャの本体を構成するプラグマ、宣言、および SPL 文。
プラグマを PRAGMA AUTONOMOUS_TRANSACTION にして、関数またはストアドプロシージャを自律型トランザクションとして設定することができます。 宣言には、変数、型、REF CURSOR、およびサブプログラムの宣言を含めることができます。 サブプログラム宣言が含まれている場合は、他のすべての変数、型、および REF CURSOR 宣言の後に宣言する必要があります。 |
func_name | パブリックまたはプライベート関数の名前。 同じ署名を持つ func_name がパッケージ仕様に存在する場合、関数はパブリックです。 それ以外の場合、関数は呼び出されません。 |
rettype | 戻り値のデータ型。 |
DETERMINISTIC | DETERMINISTIC を使用すると、同じ引数値が指定されている場合、関数が常に同じ結果を返すように指定できます。 DETERMINISTIC 関数はデータベースを変更しません。
注
|
statement | SPL プログラム文。 パッケージが初めて参照される場合、パッケージ初期化セクションの文は、セッションごとに 1 回実行されます。 |
STRICT
、LEAKPROOF
、PARALLEL
、COST
、ROWS
、および 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