Symfoware Parallel Server SQLビギナーズガイド |
目次
索引
![]() ![]() |
第7章 応用プログラムの実行時に動的SQL文を実行する方法 |
動的SQLは、応用プログラムの実行時にSQL文を作り出して実行させる場合に使用します。例えば、削除する行の探索条件をファイルから入力して、その条件に従って表から行を削除する応用プログラムを開発するとします。この場合、プログラムのコーディング時には、削除行の探索条件が決まっていないので、行を削除するSQL文は書くことができません。応用プログラムの実行時に、ファイルから探索条件を読み込んで、はじめてSQL文が完成します。このような応用プログラムは、埋込みSQL文では作成することができません。つまり、埋込みSQL文の場合は、コンパイル時に解釈されるため、コンパイル時にSQL文が完成している必要があるからです。このような応用プログラムには、動的SQLを使用します。動的SQLは、プログラムの実行時にSQL文を解釈し、実行させます。
本節では、動的SQLを実行するために必要な以下の要素について説明します。
SQL記述子域
準備可能文
動的パラメタ指定
USING句
SQL文を動的に変更してデータ操作を行う場合、つまり、応用プログラム外からSQL文を入力するような場合には、どのようなSQL文が入力されるのか、応用プログラムの作成時にはわかりません。例えば、データベースからデータを取り出す場合には、データを取り出すための変数を応用プログラム上に宣言する必要があります。しかし、どのようなSQL文が入力されるのかわからなければ、変数を宣言することができません。これは、データをデータベースに挿入する場合も同様です。
そこで、動的にSQL文を変更する場合には、データ操作を行うための一時的な作業域を割り当てます。この作業域を利用することにより、応用プログラムには、適当な変数を宣言しておくだけでデータ操作が行えるようになります。この作業域を“SQL記述子域”と呼びます。SQL記述子域の位置づけを以下に示します。
プログラムの実行時に作成して実行させることのできるSQL文を“準備可能文”といいます。準備可能文を以下に示します。
動的単一行SELECT文
INSERT文
UPDATE文:探索
DELETE文:探索
動的SELECT文
準備可能動的UPDATE文:位置づけ
準備可能動的DELETE文:位置づけ
スキーマ定義文
スキーマ操作文
格納構造定義文
格納構造操作文
このうち、動的単一行SELECT文、動的SELECT文、準備可能動的UPDATE文および準備可能動的DELETE文は、準備可能文としてだけ指定することができるSQL文です。動的単一行SELECT文は、問合せ指定に、また、動的SELECT文は、カーソル指定にそれぞれ構文が一致します。
なお、準備可能文を実行させるためには、実行の準備処理が必要です。実行の準備がされた準備可能文を“被準備文”と呼びます。
準備可能文の例を以下に示します。
例1
在庫表より導出する在庫数量と倉庫番号の表の、製品番号が“110”の行を取り出しの対象とする動的単一行SELECT文を指定します。
SELECT 在庫数量, 倉庫番号 FROM 在庫管理.在庫表 WHERE 製品番号 = 110
例2
在庫表より導出する製品名と在庫数量の表を在庫数量の昇順に取り出す動的SELECT文を指定します。
SELECT 製品名, 在庫数量 FROM 在庫管理.在庫表 ORDER BY 在庫数量 ASC
例3
カーソルCU1が位置づけられている行の製品名を“電池”に、および倉庫番号を“5”に変更する準備可能動的UPDATE文(位置づけ)を指定します。
UPDATE 在庫管理.在庫表 SET 製品名 = N'電池', 倉庫番号 = 5 WHERE CURRENT OF CU1
準備可能文の中で、値指定(入力変数)を指定したい場合は、値指定の部分に、“?”(疑問符)を記述します。この“?”を“動的パラメタ指定”といいます。動的パラメタ指定は、埋込みSQL文の変数指定に相当します。動的パラメタ指定は、準備可能文の以下の箇所に指定することができます。
動的SELECT文、動的単一行SELECT文、UPDATE文(探索)およびDELETE文(探索)の探索条件
UPDATE文(探索)または準備可能動的UPDATE文(位置づけ)の設定句
INSERT文の挿入値リスト
動的パラメタ指定の例を以下に示します。
例4
DELETE文(探索)の探索条件に動的パラメタ指定を指定します。
DELETE FROM 在庫管理.在庫表 WHERE 製品名 = ?
例5
UPDATE文(探索)の設定句に動的パラメタ指定を指定します。
UPDATE 在庫管理.在庫表 SET 在庫数量 = 0, 倉庫番号 = ? WHERE 製品番号 = 111
例6
INSERT文の挿入値リストに動的パラメタ指定を指定します。
INSERT INTO 在庫管理.在庫表(製品番号,製品名,在庫数量) VALUES(?, ?, ?)
被準備文の動的パラメタ指定の値の設定と実行結果の取り出しにはUSING句を用います。USING句の使用方法と指定形式を“表:USING句の使用方法と指定形式”に示します。
使用方法 |
指定できるSQL文 |
指 定 形 式 |
---|---|---|
動的パラメタ指定の値の設定 |
EXECUTE文 動的OPEN文 |
USING 引数[, 引数, …] USING SQL DESCRIPTOR 記述子名 |
実行結果の取り出し |
EXECUTE文 動的FETCH文 |
INTO 引数[, 引数, …] INTO SQL DESCRIPTOR 記述子名 |
“表:USING句の使用方法と指定形式”の中で、EXECUTE文に指定するUSING句のうち、動的パラメタ指定の値の設定に用いるUSING句を“パラメタUSING句”といいます。実行結果の取り出しに用いるUSING句を“結果USING句”といいます。
また、USING句の指定形式には引数を指定する方法と、SQL記述子域の記述子名を指定する方法の2つがあります。前者をUSING引数といい、後者を“USING記述子”といいます。
EXECUTE文にUSING記述子を指定する方法を以下に示します。
EXECUTE STM INTO SQL DESCRIPTOR 'OUTDESC' USING SQL DESCRIPTOR 'INDESC' (1) (2) |
(1) 結果USING句
(2) パラメタUSING句
目次
索引
![]() ![]() |