スケーラブルデータベースサーバ HiRDB Version 8 解説(Windows(R)用)

[目次][用語][索引][前へ][次へ]

5.3 ストアドプロシジャストアドファンクション

データベースへの一連の操作を手続きとして定義したものをストアドプロシジャ,データベースへの一連の操作を関数として定義したものをストアドファンクションといいます。

ストアドプロシジャ及びストアドファンクションを定義すると,アクセス手順を記述したSQLオブジェクトが作成され,それらの定義情報とともにデータベースに格納されます。ストアドプロシジャ及びストアドファンクションは,処理手続きをSQL,Java,又はC言語で記述できます。

SQLで記述したものをSQLストアドプロシジャSQLストアドファンクション,Javaで記述したものをJavaストアドプロシジャJavaストアドファンクション,C言語で記述したものをCストアドプロシジャCストアドファンクションといいます。

また,ストアドプロシジャとストアドファンクションを総称して,ストアドルーチンといいます。さらに,すべての利用者を示すPUBLICを所有者として定義するストアドルーチンをパブリックルーチンといいます。パブリックルーチンとして定義すると,他ユーザが定義したストアドルーチンを使用する場合,UAP中からストアドルーチンを呼び出すときに,所有者の認可識別子を指定する必要がなくなります(ルーチン識別子だけ指定します)。パブリックルーチンは,CREATE PUBLIC PROCEDURE又はCREATE PUBLIC FUNCTIONで定義できます。

Javaストアドプロシジャ,Javaストアドファンクションについては,「5.4 Javaストアドプロシジャ,Javaストアドファンクション」を参照してください。Cストアドプロシジャ,Cストアドファンクションについては,「5.5 Cストアドプロシジャ,Cストアドファンクション」を参照してください。

ストアドプロシジャは,0個以上の,入力,出力又は入出力パラメタを持ち,SQLのCALL文で呼び出せます。ストアドファンクションは,0個以上の入力パラメタを持ち,戻り値を返せるため,SQL中で値式として指定して呼び出せます。ただし,ストアドファンクションでは,データの加工などのデータ処理だけで,データベース中の表へのアクセスはできません。

<この節の構成>
(1) ストアドプロシジャの業務への適用
(2) ストアドファンクションの適用
(3) ストアドプロシジャ,ストアドファンクションを格納するためのRDエリアの作成
(4) ストアドプロシジャ,ストアドファンクションを呼び出すためのUAPの作成
(5) ストアドファンクションのオーバロード
(6) SQLでの手続き,ユーザ定義関数の定義
(7) ストアドプロシジャ,ストアドファンクションのデータベースへの登録
(8) ストアドプロシジャ,ストアドファンクションの再作成

(1) ストアドプロシジャの業務への適用

ストアドプロシジャがどのような業務に適用できるかを説明します。例えば,商品管理業務で商品の売り上げ状況を分析するために,次に示す処理があるとします。

これは,次に示す複数のデータベースアクセス処理によって実現します。

  1. カーソルを使用して,商品受注表から,月初めから月末までの間に登録された商品の商品NO,受注量,登録日を検索する(SELECT文)
  2. カーソルを使用して,受注合計表と商品受注表とで,商品NOが同じ商品の,受注合計量を検索する(SELECT文)
  3. 月初めから月末までの間に登録された商品の受注量の合計と,商品の発売日から先月までの受注合計量との和を計算し,受注合計表を更新する(INSERT文,UPDATE文)

このような業務の「一連のデータベースをアクセスする処理」をUAP側に作成しないでデータベース側に登録して,複数のUAPからその処理を呼び出して使用できます。ストアドプロシジャを適用できる業務を次の図に示します。

図5-1 ストアドプロシジャを適用できる業務

[図データ]

図5-1のように「商品NO」,「受注量」,「登録日」を列として持つ「商品受注表」から,「2000年6月1日から6月30日までに登録された受注量」を合計し,「商品NO」,「受注合計量」を列として持つ「受注合計表」に反映するというデータベースのアクセス処理を考えます。このような場合,次に示すようなデータベースアクセス処理をストアドプロシジャとして定義して,データベースに登録します。

ストアドプロシジャの処理内容
ある一定期間の受注量を合計し,受注合計表に反映する

UAPからは,次に示す引数を指定してストアドプロシジャを呼び出すだけで,図5-1に示す商品管理業務を実現できます。

UAP側で指定する引数
受注量の合計を計算する期間
(最初の日付「2000年6月1日」と最後の日付「2000年6月30日」)

ストアドプロシジャの使用形態を次の図に示します。

図5-2 ストアドプロシジャの使用形態

[図データ]

このように,ストアドプロシジャを使用すると,データベースのアクセス処理をデータベース側に登録できるため,データベースのアクセス処理を部品化できます。また,このようなデータベースのアクセス処理が変更された場合でも,ストアドプロシジャを変更するだけで,UAP側は変更する必要がないため,UAPの開発工数が削減できます。

さらに,SQLストアドプロシジャを例にすると,複数のSQLを実行するためにはSQL実行回数分だけアプリケーションからデータベースをアクセスする必要があります。それに対して,実行する複数のSQLをストアドプロシジャとしてデータベースに登録しておけば,データベースに1回アクセスして呼び出すだけで,複数のSQL文を実行できます。これによって,HiRDBサーバとHiRDBクライアント間で生じるアプリケーションのデータ受け渡しなどの通信処理やフロントエンドサーバのSQL解析処理のオーバヘッドを削減できます。SQLストアドプロシジャによる通信処理を次の図に示します。

図5-3 SQLストアドプロシジャによる通信処理

[図データ]

(2) ストアドファンクションの適用

ストアドファンクションでは,条件分岐(IF文)やSQLの繰り返し(WHILE文)などのルーチン制御SQLを使用し,「データベースの加工などのデータ処理」をユーザが任意に関数として定義して,データベースに登録できます。そのため,データ処理を部品化できます。また,プラグインを使用する場合には,プラグインから提供される関数が,ストアドファンクションとしてデータベースに登録されます。

(3) ストアドプロシジャ,ストアドファンクションを格納するためのRDエリアの作成

ストアドプロシジャ又はストアドファンクションを使用する場合は,次に示すRDエリアを作成する必要があります。

ストアドプロシジャとストアドファンクションを格納するためのRDエリアの作成については,マニュアル「HiRDB Version 8 システム運用ガイド」を参照してください。

(4) ストアドプロシジャ,ストアドファンクションを呼び出すためのUAPの作成

ストアドプロシジャ及びストアドファンクションを呼び出す方法について説明します。ストアドプロシジャとストアドファンクションを呼び出すためのUAPの作成については,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。

ストアドプロシジャの呼び出し
UAP中にSQLのCALL文を指定して,ストアドプロシジャを呼び出せます。

ストアドファンクションの呼び出し
SQL中に値として「関数呼出し」を指定して,ストアドファンクションを呼び出せます。
関数の呼び出し時には引数を指定できます。さらに,SQLのRETURN文で値が返されます。

(5) ストアドファンクションのオーバロード

パラメタの数やデータ型が異なる場合,名前が同じ複数のストアドファンクションを定義できます。名前が同じストアドファンクションを互いにオーバロードされているといいます。このオーバロードの機能によって,パラメタのデータ型が異なる複数の関数に同じ名前を割り当てられるため,同じ機能の関数の名前を統一できます。ストアドファンクションを呼び出すと,「指定した名前と同じ名前で,指定した引数の数とパラメタの数が一致する関数」の中では,次に示す関数が実行される候補となります。

呼び出す関数の決定規則については,マニュアル「HiRDB Version 8 SQLリファレンス」を参照してください。

(6) SQLでの手続き,ユーザ定義関数の定義

SQLでの手続き及びユーザ定義関数の定義について説明します。SQLでの手続き,ユーザ定義関数の定義方法の詳細については,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。

ストアドプロシジャを作成するための手続きの定義
ストアドプロシジャを作成するためには,まず,次に示すどちらかのSQLで「手続き」を定義します。
  • CREATE PROCEDURE
  • CREATE TYPEで指定する「手続き本体」(抽象データ型に手続きを指定する場合)

ストアドファンクションを作成するためのユーザ定義関数の定義
ストアドファンクションを作成するためには,まず,次に示すどちらかのSQLでユーザが任意に定義する「ユーザ定義関数」を定義します。
  • CREATE FUNCTION
  • CREATE TYPEで指定する「関数本体」(抽象データ型に関数を指定する場合)

なお,手続き,ユーザ定義関数及びシステム定義関数を総称してルーチンといいます。

(7) ストアドプロシジャ,ストアドファンクションのデータベースへの登録

手続き又はユーザ定義関数を定義するSQLをデータベース定義ユティリティ(pddef)で実行すると,自動的に手続き又はユーザ定義関数がコンパイルされ,SQLオブジェクトが作成されます。さらに,SQLの定義のソースとSQLオブジェクトは,データディクショナリLOB用RDエリアに格納されます。これで,ストアドプロシジャ又はストアドファンクションがデータベースに登録されたことになります。ストアドプロシジャとストアドファンクションの作成方法については,マニュアル「HiRDB Version 8 システム運用ガイド」を参照してください。

(8) ストアドプロシジャ,ストアドファンクションの再作成

表又はインデクスの定義の変更や,DROP PROCEDUREでストアドプロシジャを削除した場合には,無効になったストアドプロシジャをALTER PROCEDUREで再作成する必要があります。さらに,DROP FUNCTIONでストアドファンクションを削除した場合には,無効になったストアドファンクションをALTER ROUTINEで再作成する必要があります。ストアドプロシジャ又はストアドファンクションの再作成については,マニュアル「HiRDB Version 8 システム運用ガイド」を参照してください。