ページの先頭行へ戻る
Symfoware Server V10.0.0/V10.0.1 アプリケーション開発ガイド(埋込みSQL編)

4.1 動的SQLの概念

動的SQLは、アプリケーションの実行時にSQL文を作り出して実行させる場合に使用します。たとえば、削除する行の探索条件をファイルから入力して、その条件に従って表から行を削除するアプリケーションを開発するとします。この場合、プログラムのコーディング時には、削除行の探索条件が決まっていないので、行を削除するSQL文は書くことができません。アプリケーションの実行時に、ファイルから探索条件を読み込んで、はじめてSQL文が完成します。このようなアプリケーションは、埋込みSQL文では作成することができません。つまり、埋込みSQL文の場合は、コンパイル時に解釈されるため、コンパイル時にSQL文が完成している必要があるからです。このようなアプリケーションには、動的SQLを使用します。動的SQLは、プログラムの実行時にSQL文を解釈し、実行させます。

本節では、動的SQLを実行するために必要な以下の要素について説明します。

SQLDA構造体およびSQL記述子域

SQL文を動的に変更してデータ操作を行う場合、つまり、アプリケーション外からSQL文を入力するような場合には、どのようなSQL文が入力されるのか、アプリケーションの作成時にはわかりません。たとえば、データベースからデータを取り出す場合には、データを取り出すための変数をアプリケーション上に宣言する必要があります。しかし、どのようなSQL文が入力されるのかわからなければ、変数を宣言することができません。これは、データをデータベースに挿入する場合も同様です。

そこで、動的にSQL文を変更する場合には、データ操作を行うための一時的な記述子領域を割り当てます。この記述子領域を利用することにより、アプリケーションには、適当な変数を宣言しておくだけでデータ操作が行えるようになります。

この記述子領域は、SQLDA構造体として利用する方法とSQL記述子域として利用する方法があります。なお、SQLDA構造体はC言語の場合に利用できます。

SQLDA構造体

SQLDA構造体の領域は、利用者がアプリケーション内で動的に割り当てて使用します。したがって、利用者はSQLDA構造体の情報を直接操作することができます。SQLDA構造体を使用する場合は、動的パラメタ指定や選択リストの情報を、SQLDA構造体のメンバに設定、またはメンバから取得するという操作だけで処理が簡単になります。

SQLDA構造体の位置づけを以下に示します。


SQL記述子域

SQL記述子域は、被準備文中に含まれる動的パラメタ指定や選択リストに関する情報を格納する利用者定義の記述子領域です。利用者はこの領域を介して、被準備文中に含まれる動的パラメタ指定の値を設定したり、選択リストの結果を取り出したりすることができます。

この操作はALLOCATE DESCRIPTOR文を実行することで割り当てられるSQL記述子を介して行われます。このSQL記述子の領域は、Symfoware/RDBの内部情報として獲得されるため、SQL記述子に対して利用者が直接アクセスを行うことはできません。SQL記述子に対するデータ操作はSET DESCRIPTOR文やGET DESCRIPTOR文を実行することで行います。

SQL記述子域の位置づけを以下に示します。


準備可能文

プログラムの実行時に作成して実行させることのできるSQL文を“準備可能文”といいます。準備可能文を以下に示します。

このうち、動的単一行SELECT文、動的SELECT文、準備可能動的UPDATE文および準備可能動的DELETE文は、準備可能文としてだけ指定することができるSQL文です。動的単一行SELECT文は、問合せ指定に、また、動的SELECT文は、カーソル指定にそれぞれ構文が一致します。

利用者制御文のSET USER PASSWORD文およびアクセス制御文のSET ROLE文は準備可能文として実行できません。

なお、準備可能文を実行させるためには、実行の準備処理が必要です。実行の準備がされた準備可能文を“被準備文”と呼びます。

準備可能文の例を以下に示します。

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文の変数指定に相当します。動的パラメタ指定は、準備可能文の以下の箇所に指定することができます。

動的パラメタ指定の例を以下に示します。

4

DELETE文:探索の探索条件に動的パラメタ指定を指定します。

DELETE FROM 在庫管理.在庫表 WHERE 製品名 = ?

5

UPDATE文:探索の設定句に動的パラメタ指定を指定します。

UPDATE 在庫管理.在庫表

SET 在庫数量 = 0, 倉庫番号 = ? WHERE 製品番号 = 111

6

INSERT文の挿入値リストに動的パラメタ指定を指定します。

INSERT INTO 在庫管理.在庫表(製品番号,製品名,在庫数量) VALUES(?, ?, ?)

USING

被準備文の動的パラメタ指定の値の設定と実行結果の取り出しにはUSING句を用います。USING句の使用方法と指定形式を以下に示します。

表4.1 USING句の使用方法と指定形式

使用方法

指定できるSQL

動的パラメタ指定の値の設定

EXECUTE文
動的OPEN文

USING 引数[, 引数, …]
USING SQL DESCRIPTOR 記述子名

実行結果の取り出し

EXECUTE文
動的FETCH文

INTO 引数[, 引数, …]
INTO SQL DESCRIPTOR 記述子名

表4.1 USING句の使用方法と指定形式”の中で、EXECUTE文に指定するUSING句のうち、動的パラメタ指定の値の設定に用いるUSING句を“パラメタUSING句”といいます。実行結果の取り出しに用いるUSING句を“結果USING句”といいます。

また、USING句の指定形式には以下があります。

前者を“USING引数”といい、後者を“USING記述子”といいます。

EXECUTE文にUSING記述子を指定する方法を以下に示します。

EXECUTE STM INTO SQL DESCRIPTOR 'OUTDESC' USING SQL DESCRIPTOR 'INDESC' 
                 (1)                             (2)

(1) 結果USING句

(2) パラメタUSING句