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;
/