e-learning、オラクル研修、LMS(学習管理システム)のiStudy

e-learning、オラクル研修、LMS(学習管理システム)のiStudy

第28回 「パッケージ化の意味と作成構文」

2012.07.09

前回、PL/SQLの概要を説明しましたので今回からは詳細説明です。

前回解説したように、PL/SQLはプロシージャやファンクション、変数などをまとめたものであり、仕様部と本体のふたつでワンセットです。
(実は仕様部のみのパッケージがありますが、それは別な機会に紹介します)

仕様部と本体の意味合いですが、仕様部は、「ユーザーやアプリケーションが使用可能なものをまとめたもの」ということができます。
それに対して、本体に記述されたものはユーザーやアプリケーションが直接、使用することはできません。

仕様部に記述されたプロシージャやファンクションは、ユーザーにとって、利用するために必要なインターフェースの情報だけとなっています。
したがって、仕様部でプロシージャや、ファンクションの完全な定義の記述は書かない(書けない)ことになっています。
その代わり、プロシージャやファンクションの完全な定義は、本体に記述するのです。

パッケージは利用者(ユーザー)にとって必要なインターフェイスの情報と、実行に必要なプログラムロジックを、仕様部、本体という形で分離しているわけです。

仕様部に記述するプロシージャやファンクションのインターフェイスの情報とは、具体的にいうと、プロシージャやファンクション定義の「 IS 」よりも前の部分です。

つまり、プロシージャやファンクションの名前、仮パラメータの名前、モード、データ型、さらにファンクションの場合はリターンするデータ型です。
この部分のことをそのプロシージャやファンクションの「仕様」といいます。
まさに、パッケージの仕様部はプロシージャやファンクションの仕様を記述します。

これらのことを踏まえて、パッケージ作成の基本構文を以下にまとめました。
仕様部は CREATE [OR REPLACE] PACKAGE文で作成し、本体は CREATE [OR REPLACE] PACKAGE BODY文で作成します。

<< パッケージ仕様部の作成構文>>
CREATE OR REPLACE PACKAGE パッケージ名
IS
    変数などの宣言;
    プロシージャやファンクションの仕様の宣言; -- 定義の「IS」よりも前の部分
END;

<<パッケージ本体の作成構文>>
CREATE OR REPLACE PACKAGE BODY パッケージ名
IS
    変数などの宣言;
    プロシージャやファンクションの完全な定義;
END;

以下は具体例です。処理内容に意味はありません。
ここでは、パラメータで受け取った値に1加算して画面出力するPROCAプロシージャをパッケージPAC1に格納している例です。
敢えて、パッケージの本質がわかりやすいように、値に1加算する処理を別プロシージャPROCBで行い、その結果を変数V1にいったん格納する内容としてます。

<< パッケージ仕様部の作成>>
SQL> CREATE OR REPLACE PACKAGE PAC1
  2  IS
  3      -- PROCAプロシージャの仕様の宣言
  4      PROCEDURE PROCA ( PA IN NUMBER);
  5 END;
  6 /

パッケージが作成されました。

<<パッケージ本体の作成>>
SQL> CREATE OR REPLACE PACKAGE BODY PAC1
  2 IS
  3      -- 変数 V1の宣言
  4      V1   NUMBER;
  5      -- PROCBプロシージャの完全な定義
  6      PROCEDURE PROCB ( PB IN NUMBER)
  7      IS
  8      BEGIN
  9          V1 := PB + 1;
10      END PROCB;
11      -- PROCAプロシージャの完全な定義
12      PROCEDURE PROCA ( PA IN NUMBER)
13      IS
14      BEGIN
15         PROCB(PA); --PROCBプロシージャをコール
16         DBMS_OUTPUT.PUT_LINE(V1);
17      END PROCA;
18  END;
19 /

パッケージ本体が作成されました。

<<パッケージのプロシージャの実行例>>
SQL> SET SERVEROUTPUT ON -- 画面出力を有効にして、
SQL> EXEC PAC1.PROCA(99) -- パラメータ99で、PAC1パッケージのPROCAをコール
100 -- 1加算された100が表示された

PL/SQLプロシージャが正常に完了しました。

ここで、パッケージ仕様部のPROCA(仕様部4行目)は、パッケージ本体のPROCAの定義(本体12-17行目)のIS(本体13行目)よりも前の部分と完全に一致していることがわかると思います。
また、本体のPROCBプロシージャは、仕様部では宣言されていないことに注目してください。
つまり、PROCBプロシージャは、ユーザがコールすることはできません。
ユーザがコール可能なのは、PROCAであり、PROCBはそのPROCAからコールされる関係となっています。
また同様に、本体に宣言された変数V1(本体4行目)は、ユーザが直接参照することはできません。
変数V1は本体の中のPROCBやPROCAによってのみ使われる変数です。

このように、処理の都合上必要な変数やプロシージャであり、ユーザが直接使用することのないものは、本体にのみ記述しておけばいいのです。
したがって、変数V1や、PROCBプロシージャはパッケージ仕様部に記述する必要はないわけです。

繰り返しになりますが、パッケージは利用者(ユーザー)にとって必要なインターフェイスの情報と、実行に必要なプログラムロジックを、仕様部、本体という形で分離していることがわかると思います。

(注 パッケージ内の記述順に注意)
仕様部でも本体でも変数宣言の前にプロシージャやファンクションの記述があるとコンパイルエラーとなります。
例えば上記の本体の例で、変数V1の宣言の前にPROCAやPROCBの定義があるとコンパイルエラーとなります。
また、仕様部にはないプロシージャやファンクションは、仕様部にあるプロシージャやファンクションよりも本体の中で先に定義されている必要があります。
したがって、上記の本体の例で、PROCBの定義がPROCAの定義の後であるとコンパイルエラーとなります。

今回はここまでにします。
次回はパッケージ化することで初めて可能となる機能を中心に紹介しますので、楽しみにしてください。

先頭へ戻る