CREATE PACKAGE BODY ステートメントは、ストアドプロシージャパッケージのパッケージ本体を作成または置き換えるために使用されます。
適用対象
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
このプログラムパッケージは、関連するストアドプロシージャ、関数、およびその他のプログラムオブジェクト(データベース内で単一のユニットとして格納される)のカプセル化された集合です。パッケージ本体はこれらのオブジェクトを定義します。CREATE PACKAGE ステートメントで定義されたプログラムパッケージのパッケージヘッダーでは、これらのオブジェクトがすでに宣言されています。
前提条件
スキーマ内でプログラムパッケージを作成または置き換えるには、CREATE PACKAGE のシステム権限が必要です。他のユーザーのスキーマ内でプログラムパッケージを作成または置き換えるには、CREATE ANY PACKAGE のシステム権限が必要です。
構文
create_package_body の構文は次のとおりです:
CREATE [ OR REPLACE ] PACKAGE BODY
plsql_package_body_source
ここで:
plsql_package_body_sourceの構文は次のとおりです:[ schema. ] package { IS | AS } declare_section [ initialize_section ] END [ package_name ] ;initialize_sectionの構文は次のとおりです:BEGIN statement... [ EXCEPTION exception_handler... ]
セマンティクス
| 構文 | キーワードまたは構文ノード | 説明 |
|---|---|---|
| create_package_body | OR REPLACE | パッケージ本体を再作成し(存在する場合)、再コンパイルします。パッケージ本体を再定義する前にプログラムパッケージの権限が付与されたユーザーは、再度権限を取得することなく引き続きそのプログラムパッケージにアクセスできます。 |
| plsql_package_body_source | schema | プログラムパッケージが属するスキーマ名。デフォルト値は現在のユーザーのスキーマです。 |
| plsql_package_body_source | package_name | 作成するプログラムパッケージ名。 |
| plsql_package_body_source | declare_section | パッケージヘッダー内で、各カーソルとサブルーチンの宣言に対応する定義を行います。宣言と定義は、スペースを除いて完全に一致している必要があります。 |
| initialize_section | -- | 変数を初期化し、一度だけ実行される手順を設定します。 |
例
プログラムパッケージ obdemo_pack のパッケージ本体を作成し、宣言されたパッケージヘッダーを実装します。
CREATE OR REPLACE PACKAGE BODY obdemo_pack
IS
FUNCTION add_obdept(dept_no NUMBER, dept_name VARCHAR2, location VARCHAR2)
RETURN NUMBER
IS
deptno_remaining EXCEPTION;
PRAGMA EXCEPTION_INIT(deptno_remaining, -1); -- -1は一意性制約違反のエラーコードです
BEGIN
INSERT INTO obdept VALUES(dept_no, dept_name, location);
IF SQL%FOUND THEN
RETURN 1;
END IF;
EXCEPTION
WHEN deptno_remaining THEN
RETURN 0;
WHEN OTHERS THEN
RETURN -1;
END add_obdept;
FUNCTION remove_obdept(dept_no NUMBER)
RETURN NUMBER
IS
BEGIN
DELETE FROM obdept WHERE deptno=dept_no;
IF SQL%FOUND THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
EXCEPTION
WHEN OTHERS THEN
RETURN -1;
END remove_obdept;
PROCEDURE query_obdept (dept_no IN NUMBER)
IS
BEGIN
SELECT * INTO obDeptRec FROM obdept WHERE deptno=dept_no;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('データベースには、部門コードが'||dept_no||'の部門が存在しません');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('プログラム実行エラー!');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE||'----'||SQLERRM);
END query_obdept;
BEGIN
Null;
END obdemo_pack;
/