CREATE PACKAGE文
CREATE
PACKAGE
文は、データベースに1つの単位として格納される、関連するプロシージャやファンクション、その他のプログラム・オブジェクトをカプセル化したコレクションである、ストアド・パッケージの仕様部を作成するか、または置き換えます。
パッケージ仕様部でこれらのオブジェクトを宣言します。その後に指定するパッケージ本体で、これらのオブジェクトを定義します。
ここでのトピック
前提条件
自分のスキーマ内にパッケージを作成するか、または自分のスキーマ内のパッケージを置き換えるには、CREATE
PROCEDURE
システム権限が必要です。他のユーザーのスキーマ内にパッケージを作成または再作成する場合は、CREATE
ANY
PROCEDURE
システム権限が必要です。
Oracleデータベースのプリコンパイラ・プログラム内にCREATE
PACKAGE
文を埋め込む場合は、キーワードEND-EXEC
に続けて、各言語の埋込みSQL文の終了記号を記述して文を終了する必要があります。
構文
create_package ::=
plsql_package_source ::=
( sharing_clause ::= , default_collation_clause ::= , invoker_rights_clause ::= , accessible_by_clause ::= , )
package_item_list ::=
(cursor_declaration ::=、item_declaration ::=、type_definition ::=)
package_function_declaration ::=
( function_heading ::=、accessible_by_clause ::=、deterministic_clause ::=、pipelined_clause ::=、shard_enable_clause ::=、parallel_enable_clause ::=、result_cache_clause ::=)
package_procedure_declaration ::=
セマンティクス
create_package
OR REPLACE
パッケージが存在する場合は、パッケージを再作成し、再コンパイルします。
再定義する前のパッケージに対する権限を付与されていたユーザーは、権限を再付与される必要なく、パッケージにアクセスできます。
ファンクション索引がパッケージに依存している場合、索引にDISABLED
のマークが付きます。
[ EDITIONABLE | NONEDITIONABLE ]
schema
でスキーマ・オブジェクト・タイプPACKAGE
に対してエディションが有効になっている場合に、パッケージがエディション・オブジェクトまたは非エディション・オブジェクトのどちらになるかを指定します。デフォルト: EDITIONABLE
。エディション・オブジェクトと非エディション・オブジェクトの詳細は、『Oracle Database開発ガイド』を参照してください。
IF NOT EXISTS
パッケージがまだ存在しない場合は作成します。同じ名前のパッケージが存在する場合、文はエラーなしで無視され、元のパッケージは変更されません。
IF NOT EXISTS
は、OR REPLACE
と組み合せて使用することはできません。
plsql_package_source
schema
パッケージが含まれているスキーマの名前。デフォルト: 自分のスキーマ。
package_name
データベースに格納されたパッケージを識別します。ネーミング規則については、「Identifiers」を参照してください。
package_item_list
パッケージ内のすべてのタイプを定義し、パッケージ内のすべてのカーソルとサブプログラムを宣言します。多相テーブル・ファンクションを除いて、すべての宣言には、対応する定義がパッケージ本体に含まれている必要があります。対応する宣言と定義のヘッダーは、空白以外の一語一語が一致している必要があります。パッケージの多相テーブル・ファンクションは同じパッケージ内にその実装パッケージとして宣言する必要があります。
package_item_listの制限
PRAGMA
AUTONOMOUS_TRANSACTION
は、ここには記述できません。
例
例15-20 emp_mgmtパッケージの仕様部の作成
この文は、emp_mgmt
パッケージの仕様を作成します。
CREATE PACKAGE IF NOT EXISTS emp_mgmt AS
FUNCTION hire (last_name VARCHAR2, job_id VARCHAR2,
manager_id NUMBER, salary NUMBER,
commission_pct NUMBER, department_id NUMBER)
RETURN NUMBER;
FUNCTION create_dept(department_id NUMBER, location_id NUMBER)
RETURN NUMBER;
PROCEDURE remove_emp(employee_id NUMBER);
PROCEDURE remove_dept(department_id NUMBER);
PROCEDURE increase_sal(employee_id NUMBER, salary_incr NUMBER);
PROCEDURE increase_comm(employee_id NUMBER, comm_incr NUMBER);
no_comm EXCEPTION;
no_sal EXCEPTION;
END emp_mgmt;
/
emp_mgmt
パッケージの仕様部では、次のようなパブリック・プログラム・オブジェクトを宣言します。
-
ファンクション
hire
およびcreate_dept
-
プロシージャ
remove_emp
、remove_dept
、increase_sal
およびincrease_comm
-
例外
no_comm
およびno_sal
パッケージにアクセスできるユーザーは、これらすべてのオブジェクトを使用できます。パッケージの作成後、これらのパブリック・プロシージャまたはパブリック・ファンクションのいずれかを起動したり、パッケージの任意のパブリック例外を呼び出すアプリケーションを開発できます。
オプションのIF NOT EXISTS
句は、文が冪等であることを確認するために使用されます。結果として生成される出力メッセージ(この場合は、「パッケージが作成されました。」
)は、パッケージが作成されるか文が無視されるかに関係なく同じです。
このパッケージのプロシージャおよびファンクションを起動するには、これらのプロシージャおよびファンクションをパッケージ本体で定義しておく必要があります。emp_mgmt
パッケージの本体を作成するCREATE
PACKAGE
BODY
文の例は、「CREATE PACKAGE BODY文」を参照してください。