CREATE PACKAGEステートメントを使用して、パッケージの仕様を定義できます。 パッケージが既に存在する場合、エラーが発生します。 CREATE OR REPLACE PACKAGEステートメントを実行すると、システムはまず指定されたパッケージが存在するかどうかを確認します。 パッケージが存在しない場合、システムはパッケージの仕様を定義します。 パッケージが存在する場合、システムは、パッケージの既存の仕様を新しい仕様に置き換える。 パッケージは、データベースアプリケーションのロジックを整理およびカプセル化するために不可欠なツールです。 適切に設計および実装されたパッケージは、コードの保守性、再利用性、およびパフォーマンスを向上させます。
概要
CREATE PACKAGEステートメントは、パッケージの仕様を定義します。 パッケージは、データベースに格納された関連するプロシージャ、関数、およびその他のプログラムオブジェクトのカプセル化されたコレクションです。 パッケージ仕様は、オブジェクトを宣言します。 パッケージ本体は、オブジェクトの特定の実装を定義します。
パッケージの作成時にスキーマ名を指定すると、指定したスキーマにパッケージが作成されます。 それ以外の場合、パッケージは現在のスキーマに作成されます。 各パッケージの名前は、スキーマ内で一意である必要があります。 パッケージの仕様を更新するには、CREATE OR REPLACE packageステートメントを使用します。 パッケージを作成するユーザーは、パッケージの所有者です。
パッケージは、スタンドアロンのスキーマオブジェクトとしてプロシージャと関数を作成するための代替ソリューションです。
構文
CREATE [ OR REPLACE ] PACKAGE <package_name>
[ AUTHID { DEFINER | CURRENT_USER } ]
{ IS | AS }
[ <declaration>; ] [, ...]
[ {
PROCEDURE <proc_name>
[ (<argname> [ IN | IN OUT | OUT ] <argtype> [ DEFAULT <value> ]
[, ...]) ];
[ PRAGMA RESTRICT_REFERENCES(<proc_name>,
{ RNDS | RNPS | TRUST | WNDS | WNPS } [, ... ] ); ]
|
FUNCTION <func_name>
[ (<argname> [ IN | IN OUT | OUT ] <argtype> [ DEFAULT <value> ]
[, ...]) ]
RETURN <rettype> [ DETERMINISTIC ];
[ PRAGMA RESTRICT_REFERENCES(<func_name>,
{ RNDS | RNPS | TRUST | WNDS | WNPS } [, ... ] ); ]
}
] [, ...]
END [ <name> ]Parameters
パラメーター | 説明 |
package_name | パッケージの名前。 名前は |
DEFINER | CURRENT_USER | パッケージ内のデータベースオブジェクトにアクセスするために必要な権限。 有効な値:
|
declaration | パブリック変数、型、カーソル、または |
proc_name | パッケージのユーザーが一般にアクセスできるプロシージャの名前。 |
argname | パラメータの名前。 |
IN | IN OUT | OUT | パラメータのモード。 |
argtype | パラメーターのデータ型。 |
DEFAULT value | パラメータのデフォルト値。 |
func_name | パブリック関数の名前。 |
rettype | 返されるデータの種類。 |
尊厳 |
|
RNDS | RNPS | TRUST | WNDS | WNPS | パラメータは、互換性のために提供される。 |
構造
パッケージの仕様は、パッケージの外部で参照できる要素を定義します。 要素には、定数、変数、型、プロシージャ、および関数が含まれます。
CREATE OR REPLACE PACKAGE Employee_Pkg AS
-- Constant declaration
MAX_SALARY CONSTANT NUMBER := 100000;
-- Procedure declaration
PROCEDURE Add_Employee(
p_emp_id IN NUMBER,
p_first_name IN VARCHAR2,
p_last_name IN VARCHAR2,
p_salary IN NUMBER
);
PROCEDURE Update_Salary(
p_emp_id IN NUMBER,
p_new_salary IN NUMBER
);
-- Function declaration
FUNCTION Get_Employee_Name(
p_emp_id IN NUMBER
) RETURN VARCHAR2;
END Employee_Pkg;使用上の注意
依存関係管理: パッケージの仕様を変更する場合、パッケージに依存するすべてのオブジェクトを再コンパイルする必要があります。 パッケージ仕様を変更するときは注意して続行してください。
エラー処理: キャッチされない例外によるプログラムの中断を防ぐために、パッケージ内の例外またはエラーをできるだけ早く処理することを推奨します。
パフォーマンスの最適化: パフォーマンスを向上させるために、プライベート変数とパッケージのキャッシュメカニズムを適切に使用することを推奨します。
セキュリティ: パッケージ権限管理を使用して、機密データと機能へのアクセスを制限できます。
名前付け規則: コードの理解と保守性を向上させるために、一貫した名前付け規則を使用することを推奨します。
使用量
パッケージが正常に作成およびコンパイルされた後、PL/SQLコードでパッケージ内で定義されたプロシージャと関数を参照できます。
パッケージ内のプロシージャと関数の呼び出し
プロシージャを呼び出します。
BEGIN Employee_Pkg.Add_Employee( p_emp_id => 1001, p_first_name => 'John', p_last_name => 'Smith', p_salary => 50000 ); END;関数を設定します。
DECLARE v_emp_name VARCHAR2(100); BEGIN v_emp_name := Employee_Pkg.Get_Employee_Name(1001); DBMS_OUTPUT.PUT_LINE('Employee name: ' || v_emp_name); END;
パッケージ内で同じ名前の関数を処理する
Oracleデータベースと同様に、PolarDB for PostgreSQL (Compatible with Oracle) クラスタを使用すると、パッケージ内で同じ名前で異なるパラメータを持つ複数の関数を定義できます。
マイナーエンジンバージョンが2.0.14.26.0であるPolarDB for PostgreSQL (Compatible with Oracle) 2.0クラスターを使用すると、同じ名前で同じINパラメーターを使用し、異なるOUTパラメーターを使用する関数を作成できます。 マイナーエンジンバージョンが2.0.14.26.0より前のクラスターでこの機能を使用するには、マイナーエンジンバージョンを2.0.14.26.0以降にアップグレードする必要があります。 クラスターのマイナーエンジンバージョンを照会および更新する方法については、「バージョン管理」をご参照ください。
CREATE OR REPLACE PACKAGE Employee_Pkg AS
-- Constant declaration
MAX_SALARY CONSTANT NUMBER := 100000;
-- Function declaration
FUNCTION Get_Employee_Name(
p_emp_id IN NUMBER
) RETURN VARCHAR2;
-- Functions with the same name
FUNCTION Get_Employee_Name(
p_emp_id IN NUMBER,
res_info OUT text
) RETURN VARCHAR2;
END Employee_Pkg;同じパッケージ内の関数のパラメータのデフォルト値としてパッケージ変数を使用する
PolarDB for PostgreSQL (Oracleと互換) 2.0マイナーエンジンバージョンが2.0.14.26.0のクラスターを使用すると、同じパッケージ内の関数のパラメーターのデフォルト値としてパッケージ変数を使用できます。 マイナーエンジンバージョンが2.0.14.26.0より前のクラスターでこの機能を使用するには、マイナーエンジンバージョンを2.0.14.26.0以降にアップグレードする必要があります。 クラスターのマイナーエンジンバージョンを照会および更新する方法については、「バージョン管理」をご参照ください。
CREATE OR REPLACE PACKAGE test_package AS
a NUMBER := 1;
b NUMBER := 2;
END my_package;
CREATE OR REPLACE PACKAGE my_package AS
FUNCTION add_numbers(x NUMBER default test_package.a, y NUMBER default test_package.b) RETURN NUMBER;
PROCEDURE print_message(msg VARCHAR2);
END my_package;パッケージの維持と更新
新しいパブリックアクセス可能なオブジェクトをパッケージに追加するには、パッケージ仕様とパッケージ本体を更新する必要があります。 パッケージの仕様を変更すると、パッケージに依存するすべてのオブジェクトが無効になり、再コンパイルする必要があります。 パッケージの仕様に影響を与えずにパッケージ本体の実装のみを変更する場合、依存オブジェクトを再コンパイルする必要はありません。 パッケージボディ関連のSQL文については、「CREATE package body」をご参照ください。
パッケージに関数を追加します。
パッケージ仕様を変更します。
CREATE OR REPLACE PACKAGE Employee_Pkg AS -- Existing declaration FUNCTION Get_Employee_Department(p_emp_id IN NUMBER) RETURN VARCHAR2; END Employee_Pkg;パッケージ本体を変更します。
CREATE OR REPLACE PACKAGE BODY Employee_Pkg AS -- Existing implementation FUNCTION Get_Employee_Department(p_emp_id IN NUMBER) RETURN VARCHAR2 IS v_department VARCHAR2(100); BEGIN SELECT department INTO v_department FROM employees WHERE emp_id = p_emp_id; RETURN v_department; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN 'Not Assigned'; END Get_Employee_Department; END Employee_Pkg;
関連ドキュメント
パッケージの作成方法と使用方法の詳細については、「例」をご参照ください。