5.3.1 ストアドプロシジャ,ストアドファンクションの概要
データベースへの一連の操作を手続きとして定義したものをストアドプロシジャ,データベースへの一連の操作を関数として定義したものをストアドファンクションといいます。
ストアドプロシジャ及びストアドファンクションを定義すると,アクセス手順を記述したSQLオブジェクトが作成され,それらの定義情報とともにデータベースに格納されます。ストアドプロシジャ及びストアドファンクションは,処理手続きをSQL,Java,又はC言語で記述できます。
SQLで記述したものをSQLストアドプロシジャ,SQLストアドファンクション,Javaで記述したものをJavaストアドプロシジャ,Javaストアドファンクション,C言語で記述したものをCストアドプロシジャ,Cストアドファンクションといいます。
また,ストアドプロシジャとストアドファンクションを総称して,ストアドルーチンといいます。さらに,すべての利用者を示すPUBLICを所有者として定義するストアドルーチンをパブリックルーチンといいます。パブリックルーチンとして定義すると,他ユーザが定義したストアドルーチンを使用する場合,UAP中からストアドルーチンを呼び出すときに,所有者の認可識別子を指定する必要がなくなります(ルーチン識別子だけ指定します)。パブリックルーチンは,CREATE PUBLIC PROCEDURE又はCREATE PUBLIC FUNCTIONで定義できます。
Javaストアドプロシジャ,Javaストアドファンクションについては,「Javaストアドプロシジャ,Javaストアドファンクション」を参照してください。Cストアドプロシジャ,Cストアドファンクションについては,「Cストアドプロシジャ,Cストアドファンクション」を参照してください。
ストアドプロシジャは,0個以上の,入力,出力又は入出力パラメタを持ち,SQLのCALL文で呼び出せます。ストアドファンクションは,0個以上の入力パラメタを持ち,戻り値を返せるため,SQL中で値式として指定して呼び出せます。ただし,ストアドファンクションでは,データの加工などのデータ処理だけで,データベース中の表へのアクセスはできません。
- 〈この項の構成〉
(1) ストアドプロシジャの業務への適用
ストアドプロシジャがどのような業務に適用できるかを説明します。例えば,商品管理業務で商品の売り上げ状況を分析するために,次に示す処理があるとします。
-
商品ごとに,月初めから月末までの1か月分の受注量の合計を計算し,商品の発売日から現在までの受注合計表に反映する
これは,次に示す複数のデータベースアクセス処理によって実現します。
-
カーソルを使用して,商品受注表から,月初めから月末までの間に登録された商品の商品NO,受注量,登録日を検索する(SELECT文)
-
カーソルを使用して,受注合計表と商品受注表とで,商品NOが同じ商品の,受注合計量を検索する(SELECT文)
-
月初めから月末までの間に登録された商品の受注量の合計と,商品の発売日から先月までの受注合計量との和を計算し,受注合計表を更新する(INSERT文,UPDATE文)
このような業務の「一連のデータベースをアクセスする処理」をUAP側に作成しないでデータベース側に登録して,複数のUAPからその処理を呼び出して使用できます。ストアドプロシジャを適用できる業務を次の図に示します。
図「ストアドプロシジャを適用できる業務」のように「商品NO」,「受注量」,「登録日」を列として持つ「商品受注表」から,「2000年6月1日から6月30日までに登録された受注量」を合計し,「商品NO」,「受注合計量」を列として持つ「受注合計表」に反映するというデータベースのアクセス処理を考えます。このような場合,次に示すようなデータベースアクセス処理をストアドプロシジャとして定義して,データベースに登録します。
- ストアドプロシジャの処理内容
-
ある一定期間の受注量を合計し,受注合計表に反映する
UAPからは,次に示す引数を指定してストアドプロシジャを呼び出すだけで,図「ストアドプロシジャを適用できる業務」に示す商品管理業務を実現できます。
- UAP側で指定する引数
-
受注量の合計を計算する期間
(最初の日付「2000年6月1日」と最後の日付「2000年6月30日」)
ストアドプロシジャの使用形態を次の図に示します。
このように,ストアドプロシジャを使用すると,データベースのアクセス処理をデータベース側に登録できるため,データベースのアクセス処理を部品化できます。また,このようなデータベースのアクセス処理が変更された場合でも,ストアドプロシジャを変更するだけで,UAP側は変更する必要がないため,UAPの開発工数が削減できます。
さらに,SQLストアドプロシジャを例にすると,複数のSQLを実行するためにはSQL実行回数分だけアプリケーションからデータベースをアクセスする必要があります。それに対して,実行する複数のSQLをストアドプロシジャとしてデータベースに登録しておけば,データベースに1回アクセスして呼び出すだけで,複数のSQL文を実行できます。これによって,HiRDBサーバとHiRDBクライアント間で生じるアプリケーションのデータ受け渡しなどの通信処理やフロントエンドサーバのSQL解析処理のオーバヘッドを削減できます。SQLストアドプロシジャによる通信処理を次の図に示します。
(2) ストアドファンクションの適用
ストアドファンクションでは,条件分岐(IF文)やSQLの繰り返し(WHILE文)などのルーチン制御SQLを使用し,「データベースの加工などのデータ処理」をユーザが任意に関数として定義して,データベースに登録できます。そのため,データ処理を部品化できます。また,プラグインを使用する場合には,プラグインから提供される関数が,ストアドファンクションとしてデータベースに登録されます。
(3) ストアドプロシジャ,ストアドファンクションを格納するためのRDエリアの作成
ストアドプロシジャ又はストアドファンクションを使用する場合は,次に示すRDエリアを作成する必要があります。
-
データディクショナリLOB用RDエリア
-
データディクショナリ用RDエリア
ストアドプロシジャとストアドファンクションを格納するためのRDエリアの作成については,マニュアル「HiRDB システム運用ガイド」を参照してください。
(4) ストアドプロシジャ,ストアドファンクションを呼び出すためのUAPの作成
ストアドプロシジャ及びストアドファンクションを呼び出す方法について説明します。ストアドプロシジャとストアドファンクションを呼び出すためのUAPの作成については,マニュアル「HiRDB UAP開発ガイド」を参照してください。
(5) ストアドファンクションのオーバロード
パラメタの数やデータ型が異なる場合,名前が同じ複数のストアドファンクションを定義できます。名前が同じストアドファンクションを互いにオーバロードされているといいます。このオーバロードの機能によって,パラメタのデータ型が異なる複数の関数に同じ名前を割り当てられるため,同じ機能の関数の名前を統一できます。ストアドファンクションを呼び出すと,「指定した名前と同じ名前で,指定した引数の数とパラメタの数が一致する関数」の中では,次に示す関数が実行される候補となります。
-
各引数のデータ型と,対応するパラメタのデータ型が完全に一致する関数
-
各引数のデータ型と,対応するパラメタのデータ型が完全に一致しない場合には,引数とパラメタのデータ型を左側から順番に比較して,より優先順位の低いパラメタの中で最も優先順位の高いパラメタを持つ関数
呼び出す関数の決定規則については,マニュアル「HiRDB SQLリファレンス」を参照してください。
(6) SQLでの手続き,ユーザ定義関数の定義
SQLでの手続き及びユーザ定義関数の定義について説明します。SQLでの手続き,ユーザ定義関数の定義方法の詳細については,マニュアル「HiRDB UAP開発ガイド」を参照してください。