パッケージ仕様部

パッケージ仕様部ではパブリック項目を宣言します。パブリック項目の有効範囲は、パッケージのスキーマです。パブリック項目はスキーマ内のあらゆる場所から参照できます。有効範囲内にあっても参照できないパブリック項目を参照するには、パッケージ名で修飾します。(有効範囲、可視性および修飾の詳細は、「識別子の有効範囲と可視性」を参照してください。)

各パブリック項目の宣言には、その項目を使用するうえで必要なすべての情報を含めます。たとえば、パッケージ仕様部でファンクションfactorialを次の方法で宣言するとします。

FUNCTION factorial (n INTEGER) RETURN INTEGER; -- returns n!

この宣言は、factorialという名前のファンクションがINTEGER型の引数を1つ取り、INTEGER型の値を戻すことを示しており、起動者がfactorialを起動するうえで知っておく必要のある情報です。起動者はfactorialがどのように実装されているか(たとえば、それが反復を利用しているのか、再帰を利用しているのかなど)を知る必要はありません。

ノート:

パッケージの使用を指定したPL/SQLユニットに制限するために、パッケージ仕様部にACCESSIBLE BY句を含めます。

ここでのトピック

適切なパブリック項目

適切なパブリック項目は次のとおりです。

  • 複数のサブプログラムで使用される型、変数、定数、サブプログラム、カーソルおよび例外

    パッケージ仕様部で定義される型は、ユーザー定義のPL/SQLサブタイプ(「ユーザー定義のPL/SQLサブタイプ」を参照)またはPL/SQLコンポジット型(「PL/SQLのコレクションおよびレコード」を参照)のいずれかです。

    ノート:

    パッケージ仕様部で定義されたPL/SQLコンポジット型は、同一定義のローカル型またはスタンドアロン型と互換性がありません(例6-37例6-38および例6-44を参照)。

  • スタンドアロン・サブプログラム・パラメータの連想配列型

    スキーマ・レベルでは結合配列型を宣言できません。そのため、連想配列の変数をパラメータとしてスタンドアロン・サブプログラムに渡すには、その変数の型をパッケージ仕様部で宣言する必要があります。こうすると、起動されるサブプログラム(この型の仮パラメータを宣言する側)と起動元のサブプログラムまたは無名ブロック(この型の変数を宣言する側)の両方でこの型を使用できます。例11-2を参照してください。

  • 同じセッション内のサブプログラム起動間で使用可能な状態に保つ必要がある変数

  • パブリック変数の読取りおよび書込みを実行するサブプログラム("get"および"set"サブプログラム)

    これらのサブプログラムは、パッケージ・ユーザーにパブリック変数の読取りおよび書込みを直接実行させないために提供します。

  • 相互に起動し合うサブプログラム

    互いに起動し合うスタンドアロン・サブプログラムの場合はコンパイルの順序を気にする必要がありますが、パッケージ・サブプログラムの場合はとらわれる必要はありません。

  • オーバーロードされたサブプログラム

    オーバーロードされたサブプログラムとは、同じサブプログラムのバリエーションです。つまり、名前は同じですが、仮パラメータが異なります。詳細は、「オーバーロードされたサブプログラム」を参照してください。

ノート:

リモート・パッケージのパブリック変数は、間接的であっても参照できません。たとえば、サブプログラムがパッケージのパブリック変数を参照する場合、データベース・リンクを通じてサブプログラムを起動することはできません。

パッケージ仕様部の作成

パッケージ仕様部を作成するには、「 CREATE PACKAGE文」を使用します。

例11-1および例11-2のパッケージ仕様部ではカーソルまたはサブプログラムを宣言していないため、パッケージtrans_dataおよびaa_pkgに本体は不要です。

例11-1 単純なパッケージ仕様部

この例では、パッケージtrans_dataの仕様部で2つのパブリック型と3つのパブリック変数を宣言しています。

CREATE OR REPLACE PACKAGE trans_data AUTHID DEFINER AS
  TYPE TimeRec IS RECORD (
    minutes SMALLINT,
    hours   SMALLINT);
  TYPE TransRec IS RECORD (
    category VARCHAR2(10),
    account  INT,
    amount   REAL,
    time_of  TimeRec);
  minimum_balance     CONSTANT REAL := 10.00;
  number_processed    INT;
  insufficient_funds  EXCEPTION;
  PRAGMA EXCEPTION_INIT(insufficient_funds, -4097);
END trans_data;
/

例11-2 スタンドアロン・サブプログラムへの連想配列の受渡し

この例では、パッケージaa_pkgの仕様部で連想配列型のaa_typeを宣言しています。その後、スタンドアロン・プロシージャprint_aaで型aa_typeの仮パラメータを宣言しています。次に、無名ブロックで型aa_typeの変数を宣言してこれに移入し、この変数を出力するプロシージャprint_aaに変数を渡しています。

CREATE OR REPLACE PACKAGE aa_pkg AUTHID DEFINER IS
  TYPE aa_type IS TABLE OF INTEGER INDEX BY VARCHAR2(15);
END;
/
CREATE OR REPLACE PROCEDURE print_aa (
  aa aa_pkg.aa_type
) AUTHID DEFINER IS
  i  VARCHAR2(15);
BEGIN
  i := aa.FIRST;
 
  WHILE i IS NOT NULL LOOP
    DBMS_OUTPUT.PUT_LINE (aa(i) || '  ' || i);
    i := aa.NEXT(i);
  END LOOP;
END;
/
DECLARE
  aa_var  aa_pkg.aa_type;
BEGIN
  aa_var('zero') := 0;
  aa_var('one') := 1;
  aa_var('two') := 2;
  print_aa(aa_var);
END;
/

結果:

1  one
2  two
0  zero