スケーラブルデータベースサーバ HiRDB Version 8 解説(UNIX(R)用)
データベースへの一連の操作を手続きとして定義したものをストアドプロシジャ,データベースへの一連の操作を関数として定義したものをストアドファンクションといいます。
ストアドプロシジャ及びストアドファンクションを定義すると,アクセス手順を記述した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中で値式として指定して呼び出せます。ただし,ストアドファンクションでは,データの加工などのデータ処理だけで,データベース中の表へのアクセスはできません。
ストアドプロシジャがどのような業務に適用できるかを説明します。例えば,商品管理業務で商品の売り上げ状況を分析するために,次に示す処理があるとします。
これは,次に示す複数のデータベースアクセス処理によって実現します。
このような業務の「一連のデータベースをアクセスする処理」をUAP側に作成しないでデータベース側に登録して,複数のUAPからその処理を呼び出して使用できます。ストアドプロシジャを適用できる業務を次の図に示します。
図5-1 ストアドプロシジャを適用できる業務
図5-1のように「商品NO」,「受注量」,「登録日」を列として持つ「商品受注表」から,「2000年6月1日から6月30日までに登録された受注量」を合計し,「商品NO」,「受注合計量」を列として持つ「受注合計表」に反映するというデータベースのアクセス処理を考えます。このような場合,次に示すようなデータベースアクセス処理をストアドプロシジャとして定義して,データベースに登録します。
UAPからは,次に示す引数を指定してストアドプロシジャを呼び出すだけで,図5-1に示す商品管理業務を実現できます。
ストアドプロシジャの使用形態を次の図に示します。
図5-2 ストアドプロシジャの使用形態
このように,ストアドプロシジャを使用すると,データベースのアクセス処理をデータベース側に登録できるため,データベースのアクセス処理を部品化できます。また,このようなデータベースのアクセス処理が変更された場合でも,ストアドプロシジャを変更するだけで,UAP側は変更する必要がないため,UAPの開発工数が削減できます。
さらに,SQLストアドプロシジャを例にすると,複数のSQLを実行するためにはSQL実行回数分だけアプリケーションからデータベースをアクセスする必要があります。それに対して,実行する複数のSQLをストアドプロシジャとしてデータベースに登録しておけば,データベースに1回アクセスして呼び出すだけで,複数のSQL文を実行できます。これによって,HiRDBサーバとHiRDBクライアント間で生じるアプリケーションのデータ受け渡しなどの通信処理やフロントエンドサーバのSQL解析処理のオーバヘッドを削減できます。SQLストアドプロシジャによる通信処理を次の図に示します。
図5-3 SQLストアドプロシジャによる通信処理
ストアドファンクションでは,条件分岐(IF文)やSQLの繰り返し(WHILE文)などのルーチン制御SQLを使用し,「データベースの加工などのデータ処理」をユーザが任意に関数として定義して,データベースに登録できます。そのため,データ処理を部品化できます。また,プラグインを使用する場合には,プラグインから提供される関数が,ストアドファンクションとしてデータベースに登録されます。
ストアドプロシジャ又はストアドファンクションを使用する場合は,次に示すRDエリアを作成する必要があります。
ストアドプロシジャとストアドファンクションを格納するためのRDエリアの作成については,マニュアル「HiRDB Version 8 システム運用ガイド」を参照してください。
ストアドプロシジャ及びストアドファンクションを呼び出す方法について説明します。ストアドプロシジャとストアドファンクションを呼び出すためのUAPの作成については,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。
パラメタの数やデータ型が異なる場合,名前が同じ複数のストアドファンクションを定義できます。名前が同じストアドファンクションを互いにオーバロードされているといいます。このオーバロードの機能によって,パラメタのデータ型が異なる複数の関数に同じ名前を割り当てられるため,同じ機能の関数の名前を統一できます。ストアドファンクションを呼び出すと,「指定した名前と同じ名前で,指定した引数の数とパラメタの数が一致する関数」の中では,次に示す関数が実行される候補となります。
呼び出す関数の決定規則については,マニュアル「HiRDB Version 8 SQLリファレンス」を参照してください。
SQLでの手続き及びユーザ定義関数の定義について説明します。SQLでの手続き,ユーザ定義関数の定義方法の詳細については,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。
なお,手続き,ユーザ定義関数及びシステム定義関数を総称してルーチンといいます。
手続き又はユーザ定義関数を定義するSQLをデータベース定義ユティリティ(pddef)で実行すると,自動的に手続き又はユーザ定義関数がコンパイルされ,SQLオブジェクトが作成されます。さらに,SQLの定義のソースとSQLオブジェクトは,データディクショナリLOB用RDエリアに格納されます。これで,ストアドプロシジャ又はストアドファンクションがデータベースに登録されたことになります。ストアドプロシジャとストアドファンクションの作成方法については,マニュアル「HiRDB Version 8 システム運用ガイド」を参照してください。
表又はインデクスの定義の変更や,DROP PROCEDUREでストアドプロシジャを削除した場合には,無効になったストアドプロシジャをALTER PROCEDUREで再作成する必要があります。さらに,DROP FUNCTIONでストアドファンクションを削除した場合には,無効になったストアドファンクションをALTER ROUTINEで再作成する必要があります。ストアドプロシジャ又はストアドファンクションの再作成については,マニュアル「HiRDB Version 8 システム運用ガイド」を参照してください。
All Rights Reserved. Copyright (C) 2006, 2016, Hitachi, Ltd.