パッケージ作成のガイドライン

  • Oracle Databaseが提供するパッケージをよく理解して、その機能と重複する機能を持つパッケージを作成しないように注意してください。

    Oracle Databaseが提供するパッケージの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

  • 別のアプリケーションで再利用できるように、パッケージに汎用性を持たせてください。

  • パッケージ本体の前にパッケージ仕様部を設計および定義してください。

  • パッケージ仕様部では、起動元のプログラムから見える必要のある項目のみを宣言してください。

    こうすることで、他の開発者が実装の細部に不適切に依存しないようにすることができ、再コンパイルの必要性を削減できます。

    パッケージ仕様部を変更する場合は、そのパッケージのパブリック・サブプログラムを起動するすべてのサブプログラムを再コンパイルする必要があります。パッケージ本体のみ変更する場合は、サブプログラムを再コンパイルする必要はありません。

  • 例11-7に示すとおり、パブリック・カーソルはパッケージ仕様部で宣言し、パッケージ本体で定義してください。

    こうすると、カーソルの問合せをパッケージ・ユーザーに見えなくすることができ、カーソル宣言を変更せずにカーソル問合せを変更することができます。

  • 初期値は、宣言部ではなくパッケージ本体の初期化部で代入してください。

    この方法には次のメリットがあります。

    • 初期値を計算するコードをより複雑にすることができ、詳しく説明できます。

    • 初期値の計算で例外が呼び出された場合、初期化部で独自の例外ハンドラを使用して例外を処理できます。

  • データベース・アプリケーションを複数のPL/SQLパッケージ(APIを提供する1つのパッケージと機能を提供する複数のヘルパー・パッケージ)として実装する場合、例11-8に示すように、ヘルパー・パッケージをAPIパッケージに対してのみ使用可能にします。

例11-7では、カーソルc1の宣言および定義が、パッケージemp_stuffの仕様部と本体にそれぞれ置かれています。このカーソル宣言では戻り値のデータ型のみを指定し、問合せは指定せず、問合せはカーソルの定義に置かれています(構文およびセマンティクスの詳細は、「明示カーソルの宣言および定義」を参照してください)。

例11-8では、APIパッケージとヘルパー・パッケージを作成します。ヘルパー・パッケージ仕様部のACCESSIBLE BY句によって、APIパッケージのみがヘルパー・パッケージにアクセス可能となります。

例11-7 パッケージでのカーソル宣言と定義の分離

CREATE PACKAGE emp_stuff AS
  CURSOR c1 RETURN employees%ROWTYPE;  -- Declare cursor
END emp_stuff;
/
CREATE PACKAGE BODY emp_stuff AS
  CURSOR c1 RETURN employees%ROWTYPE IS
    SELECT * FROM employees WHERE salary > 2500;  -- Define cursor
END emp_stuff;
/

例11-8 ACCESSIBLE BY句

CREATE OR REPLACE PACKAGE helper
  AUTHID DEFINER
  ACCESSIBLE BY (api)
IS
  PROCEDURE h1;
  PROCEDURE h2;
END;
/
 
CREATE OR REPLACE PACKAGE BODY helper
IS
  PROCEDURE h1 IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE('Helper procedure h1');
  END;
 
  PROCEDURE h2 IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE('Helper procedure h2');
  END;
END;
/
 
CREATE OR REPLACE PACKAGE api
  AUTHID DEFINER
IS
  PROCEDURE p1;
  PROCEDURE p2;
END;
/
 
CREATE OR REPLACE PACKAGE BODY api
IS
  PROCEDURE p1 IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE('API procedure p1');
    helper.h1;
  END;
 
  PROCEDURE p2 IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE('API procedure p2');
    helper.h2;
  END;
END;
/
 

APIパッケージのプロシージャを起動します。

BEGIN
  api.p1;
  api.p2;
END;
/
 

結果:

API procedure p1
Helper procedure h1
API procedure p2
Helper procedure h2

ヘルパー・パッケージのプロシージャを起動します。

BEGIN
  helper.h1;
END;
/
 

結果:

SQL> BEGIN
  2    helper.h1;
  3  END;
  4  /
  helper.h1;
  *
ERROR at line 2:
ORA-06550: line 2, column 3:
PLS-00904: insufficient privilege to access object HELPER
ORA-06550: line 2, column 3:
PL/SQL: Statement ignored