すべてのプロダクト
Search
ドキュメントセンター

PolarDB:CREATE PACKAGE

最終更新日:Dec 11, 2024

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

パッケージの名前。 名前はschema修飾できます。

DEFINER | CURRENT_USER

パッケージ内のデータベースオブジェクトにアクセスするために必要な権限。 有効な値:

  • DEFINER (デフォルト): 所有者の権限。

  • CURRENT_USER: 現在のユーザー権限。

declaration

パブリック変数、型、カーソル、またはREF CURSORの宣言。

proc_name

パッケージのユーザーが一般にアクセスできるプロシージャの名前。

argname

パラメータの名前。

IN | IN OUT | OUT

パラメータのモード。

argtype

パラメーターのデータ型。

DEFAULT value

パラメータのデフォルト値。

func_name

パブリック関数の名前。

rettype

返されるデータの種類。

尊厳

DETERMINISTICは、IMMUTABLEの同義語です。 DETERMINISTICキーワードは、関数がデータベースを変更せず、同じ入力パラメーターセットに対して常に同じ結果を返すことを指定します。 DETERMINISTICとして定義されている関数は、データベース検索を実行せず、既存のパラメーター情報のみを使用します。 データベースは、特定の入力パラメーターに対して関数を1回計算し、同じ入力パラメーターを持つ後続の呼び出しで結果を再使用します。

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」をご参照ください。

パッケージに関数を追加します。

  1. パッケージ仕様を変更します。

    CREATE OR REPLACE PACKAGE Employee_Pkg AS
       -- Existing declaration
       FUNCTION Get_Employee_Department(p_emp_id IN NUMBER) RETURN VARCHAR2;
    END Employee_Pkg;
  2. パッケージ本体を変更します。

    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;

関連ドキュメント

パッケージの作成方法と使用方法の詳細については、「」をご参照ください。