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

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

第33回 「【コラム2】PL/SQLパッケージの本質について ~これが私のパッケージ観~」

2012.08.27

このところずっとPL/SQLのパッケージの用途について具体例を挙げてきました。
結局、このパッケージという機能の本質を一言でいうと、どういうことになるのでしょうか?

そんなことを今回は私見も交えて書いてみます。

PL/SQLのパッケージの本質は、一言でいうと「グローバルな宣言部である」ということだと思っています。

一般論として、無名ブロックや、プロシージャやファンクションのローカルな宣言部で宣言したことは、そのPL/SQLブロックの中でしか使えません。
その意味でローカルな宣言部といいます。
ローカルな宣言部とは、無名ブロックの場合は、DECLAREからBEGINの間、プロシージャやファンクションの場合は、ISからBEGINまでの間でしたね。

復習として下に簡単な例を示します。

<<無名ブロック>>
DELCARE
  ローカルな宣言部
BEGIN
  実行部
END;

<<プロシージャ>>
CREATE PROCEDURE プロシージャ名 (仮パラメータ データ型)
IS
   ローカルな宣言部
BEGIN
  実行部
END;

ローカルな宣言部で宣言したことは、そのPL/SQLブロック(無名ブロック、プロシージャ、ファンクション)の中でしか使えないわけです。
では、PL/SQLブロックの枠を超えて共通の宣言をしたい場合、どこで宣言すればいいのか? 
それがすなわち、パッケージということです。

思い出していただきたいのは、パッケージは、構文的に全体が仕様部です。

<<パッケージ仕様部>>
CREATE PACKAGE パッケージ名
IS
   様々な宣言(変数、定数、例外、カーソル、型、プロシージャ、ファンクションなど)
END;

例えば上記は、パッケージ仕様部の構文です。
一般にISの後ろは宣言部ですが、パッケージ仕様部の場合は最後まで、全体が宣言部です。
つまり、パッケージ仕様部とは、宣言部のみの変な(?)PL/SQLブロックと言えるわけです。

もし、パッケージ仕様部にプロシージャ、ファンクションを含むときは、それは完全な定義ではないので、本体が必要でしたね。
パッケージ本体も仕様部と同様に全体が宣言部と言えるわけです。

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

上記のようにパッケージ本体もISから最後まですべて宣言部と言えます。

※実はパッケージ本体の最後にBEGINで始まる実行部が述可能ですがその話は別の機会にします。

先ほど、PL/SQLのパッケージの本質とは「グローバルな宣言部である」と言いましたが、パッケージ本体の場合は、そこに記述したものはユーザが直接使用することはできないので、その意味でグローバルな宣言部とは言えませんね。
しかし本体は存在しないこともあるので、本体の性質はパッケージの本質とは言えません。
どちらにしろ、パッケージ機能を利用するユーザの観点からは、パッケージ仕様部で宣言したものが、直接グローバルに利用可能なので、そういう意味でPL/SQLのパッケージの本質とは「グローバルな宣言部である」と言っていいと思います。

すこし説明がごちゃごちゃと蛇足だったかもしれませんが、結局PL/SQLブロックの枠を超えた共通の宣言部がパッケージと言えると思います。

パッケージの本質は宣言部だから、宣言可能なものは基本的になんでもパッケージに格納できるわけです。
変数、定数、カーソル、型、例外、プロシージャ、ファンクションなどなど。
(補足すると、私の知る限り、カーソル変数だけはパッケージに格納できません。カーソル変数についてはまだ触れていなかったと思いますが別の機会に触れます)

前回まパッケージの具体例をいくつか紹介してきたわけですが、パッケージの本質とは「グローバルな宣言部である」ということをベースにしたものがいくつもあります。
(第30回 変数の永続性、第31回 定数の宣言、第32回 ユーザ定義例外など)

ということで、パッケージの本質とは「グローバルな宣言部である」というのが私の私見です。

今回は私のPL/SQLパッケージ観をとりとめもなく書いてみました。
参考になったでしょうか?

ではまた次回もご期待ください。

先頭へ戻る