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

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

第17回 「ストアド・プロシージャ作成構文」

2012.04.16

前回はストアドプロシージャの概要について解説しました。
無名PL/SQLブロックに名前を付けてデータベースに格納する代表例がストアド・プロシージャです。

今回からはスアドプロシージャの文法について解説します。

まずは作成構文です。ポイントを以下にまとめます。

<<ストアド・プロシージャ作成の基本構文 >>
1 CERATE OR REPLACE PROCEDURE プロシージャ名 (仮パラメータ名 モード データ型, ・・・・)
2 IS
3   宣言部
4 BEGIN
5   実行部
6 EXCEPTION
7   例外処理部
8 END;

では、大事な点を解説します。

●プロシージャ作成のキーワード
1行目ですが、ストアドプロシージャを作成するには、CREATE PROCEDURE文を使います。
この時、すでに存在するプロシージャである場合は、OR REPLACE をつけなければエラーになります。
存在していない場合でも OR REPLACEをつけて問題になることはありませんので、上記の例のように、常に「CREATE OR REPLACE PROCEDURE」という形で覚えたほうが良いでしょう。

●仮パラメータについて
同じく1行目で、仮パラメータですが、通常、プロシージャはパラメータを持ちます。
パラメータは呼び出し元から値をもらったり、逆に呼び出し元に値を戻すためのものです。
たとえ話をすれば、プロシージャを呼び出す(コールする)ということは、人に仕事を依頼することと同じです。
人に仕事を依頼するときは必要な情報をその人に渡してあげる必要があります。
また、仕事の結果がどうであったか、その人から情報をもらう必要も場合によりあります。
まさにプロシージャコールもこれと同じです。
このような呼び出し元との間の値のやり取りにパラメータが使用されます。
ここで定義するパラメータを仮パラメータといい、実際にコールするときに使うパラメータを実パラメータといいます。

●仮パラメータのモード
同じく1行目の仮パラメータですが、仮パラメータには、モードとデータ型を指定する必要があります。
モードは、「IN」、「OUT」、「IN OUT」の三種類です。
呼び出し元から値をもらうための仮パラメータのモードは「IN」です。
逆に呼び出し元に値を戻す場合はモードが「OUT」です。
両方可能なパラメータのモードは「IN OUT」です。
モードは省略できるのですが、省略すると「IN」とみなされます。

●仮パラメータのデータ型【重要】
次に仮パラメータのデータ型ですが、これは省略できません。必ず指定する必要があります。
ここで非常に重要なことがあります。
それは仮パラメータのデータ型には、サイズの指定はできないということです。
例えば、「NUMBER(5)」というデータ型を仮パラメータに指定するとコンパイルエラーになります。
サイズを指定せずに「NUMBER」とだけ指定する場合はOKです。
同様に「VARCHAR2(10)」はエラーであり、「VARCHAR2」はOKです。
なお、仮パラメータのデータ型に「%TYPE」や「%ROWTYPE」を指定する場合は、元になっているデータ型にサイズが指定されていてもOKです。

※%TYPEは、主に「表名.列名%TYPE」という形で用いて、その表のその列のデータ型と同じであるという意味の指定です。
%ROWTYPEは、「表名%ROWTYPE」、「カーソル名%ROWTYPE」という形で用いてその表やカーソルの一行と同じ構造のレコード型であるという意味です。

●宣言部【IS と BEGINの間】
プロシージャもPL/SQLブロックですから、宣言部があります。
AS またはIS(2行目)から、BEGIN(4行目)の間が宣言部であり、この場所でプロシージャの中で使用する変数などが宣言できます。
ここで宣言する変数のデータ型は、仮パラメータと違って、サイズを指定しても大丈夫です。
また何も宣言しない場合であっても、キーワードIS(またはAS)は必要です。

●実行部【BEGIN と EXCEPITON の間】
無名ブロックと同じように、BEGIN以下が実行部です。

●例外処理部
無名ブロックと同じように、EXCEPTION以下が例外処理部です。例外処理部は省略可能です。

●ブロックの終わり
ブロックの終わりの END; (8行目)は、「END プロシージャ名;」でもOKです。
このようプロシージャ名を明記することでそのプロシージャの終わりであるということがわかりやすくなります。

今回はここまでにします。
前回のサンプル例を、今回の解説に照らし合わせれば、グッと理解が深まると思います。
次回以降はこれに肉付けをしてさまざまな具体例を解説します。

先頭へ戻る