図 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 SQL によるデータベースアクセス
137
図 5‒3 SQL ストアドプロシジャによる通信処理
(2) ストアドファンクションの適用
ストアドファンクションでは,条件分岐(IF 文)や SQL の繰り返し(WHILE 文)などのルーチン制御 SQL を使用し,「データベースの加工などのデータ処理」をユーザが任意に関数として定義して,データ ベースに登録できます。そのため,データ処理を部品化できます。また,プラグインを使用する場合には,
プラグインから提供される関数が,ストアドファンクションとしてデータベースに登録されます。
(3) ストアドプロシジャ,ストアドファンクションを格納するための RD エリアの作成
ストアドプロシジャ又はストアドファンクションを使用する場合は,次に示す RD エリアを作成する必要が あります。
• データディクショナリ LOB 用 RD エリア
• データディクショナリ用 RD エリア
ストアドプロシジャとストアドファンクションを格納するための RD エリアの作成については,マニュアル
「HiRDB Version 9 システム運用ガイド」を参照してください。
(4) ストアドプロシジャ,ストアドファンクションを呼び出すための UAP の作成
ストアドプロシジャ及びストアドファンクションを呼び出す方法について説明します。ストアドプロシ ジャとストアドファンクションを呼び出すための UAP の作成については,マニュアル「HiRDB Version 9 UAP 開発ガイド」を参照してください。
ストアドプロシジャの呼び出し
UAP 中に SQL のCALL 文を指定して,ストアドプロシジャを呼び出せます。
ストアドファンクションの呼び出し
SQL 中に値として「関数呼出し」を指定して,ストアドファンクションを呼び出せます。
関数の呼び出し時には引数を指定できます。さらに,SQL のRETURN 文で値が返されます。
(5) ストアドファンクションのオーバロード
パラメタの数やデータ型が異なる場合,名前が同じ複数のストアドファンクションを定義できます。名前が 同じストアドファンクションを互いにオーバロードされているといいます。このオーバロードの機能に よって,パラメタのデータ型が異なる複数の関数に同じ名前を割り当てられるため,同じ機能の関数の名前 を統一できます。ストアドファンクションを呼び出すと,「指定した名前と同じ名前で,指定した引数の数 とパラメタの数が一致する関数」の中では,次に示す関数が実行される候補となります。
• 各引数のデータ型と,対応するパラメタのデータ型が完全に一致する関数
• 各引数のデータ型と,対応するパラメタのデータ型が完全に一致しない場合には,引数とパラメタの データ型を左側から順番に比較して,より優先順位の低いパラメタの中で最も優先順位の高いパラメタ を持つ関数
呼び出す関数の決定規則については,マニュアル「HiRDB Version 9 SQL リファレンス」を参照してくだ さい。
(6) SQL での手続き,ユーザ定義関数の定義
SQL での手続き及びユーザ定義関数の定義について説明します。SQL での手続き,ユーザ定義関数の定義 方法の詳細については,マニュアル「HiRDB Version 9 UAP 開発ガイド」を参照してください。
ストアドプロシジャを作成するための手続きの定義
ストアドプロシジャを作成するためには,まず,次に示すどちらかの SQL で「手続き」を定義します。
• CREATE PROCEDURE
• CREATE TYPE で指定する「手続き本体」(抽象データ型に手続きを指定する場合)
ストアドファンクションを作成するためのユーザ定義関数の定義
ストアドファンクションを作成するためには,まず,次に示すどちらかの SQL でユーザが任意に定義 する「ユーザ定義関数」を定義します。
• CREATE FUNCTION
• CREATE TYPE で指定する「関数本体」(抽象データ型に関数を指定する場合)
なお,手続き,ユーザ定義関数及びシステム定義関数を総称してルーチンといいます。
(7) ストアドプロシジャ,ストアドファンクションのデータベースへの登録
手続き又はユーザ定義関数を定義する SQL をデータベース定義ユティリティ(pddef)で実行すると,自 動的に手続き又はユーザ定義関数がコンパイルされ,SQL オブジェクトが作成されます。さらに,SQL の 定義のソースと SQL オブジェクトは,データディクショナリ LOB 用 RD エリアに格納されます。これで,
5 SQL によるデータベースアクセス
139
ストアドプロシジャ又はストアドファンクションがデータベースに登録されたことになります。ストアド プロシジャとストアドファンクションの作成方法については,マニュアル「HiRDB Version 9 システム運 用ガイド」を参照してください。
(8) ストアドプロシジャ,ストアドファンクションの再作成
表又はインデクスの定義の変更や,DROP PROCEDURE でストアドプロシジャを削除した場合には,無 効になったストアドプロシジャを ALTER PROCEDURE で再作成する必要があります。さらに,DROP FUNCTION でストアドファンクションを削除した場合には,無効になったストアドファンクションを ALTER ROUTINE で再作成する必要があります。ストアドプロシジャ又はストアドファンクションの再 作成については,マニュアル「HiRDB Version 9 システム運用ガイド」を参照してください。