社内SEの徒然なる日記

NetCOBOLで動的SQLを使ってみる

動的SQLってなに?

これまでに記載したSQLの実行方法では、SQL文自体が固定されていたため、できる事と言ったら、抽出条件の値を変更する位で、条件に応じでSQL文を書き換えるような処理はできませんでした。

動的SQLを使うことで、文字通りプログラムの実行中にSQL文を編集することが出来るようになります。

動的SQLの使用方法

基本的な考え方は、カーソルを使った抽出方法と同じです。
今回は、「習うより慣れろ」の格言に基づきサンプルを提示します。

まず、WORKING-STORAGE SECTION. にSQL文格納用のホスト変数を準備します。

WORKING-STORAGE SECTION.
*
* ホスト変数
* 埋込みSQL宣言節の開始
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
* 動的SQL
01 H-SQL-STRING PIC X(20000).
01 H-HEAD-CDZIP PIC X(10).
01 H-HEAD-ADR1 PIC X(10).
* 埋込みSQL宣言節の終了
EXEC SQL END DECLARE SECTION END-EXEC.


PROCEDURE DIVISION. で動的SQLのカーソル定義を行ないます。

* *> 動的SQLの設定クリア
MOVE SPACE TO H-SQL-STRING.
*
* *> 動的SQL作成
STRING
"SELECT " DELIMITED BY SIZE
"NVL(HEAD.CDZIP, ' '), " DELIMITED BY SIZE
"NVL(HEAD.ADR1, ' ') " DELIMITED BY SIZE
"FROM " DELIMITED BY SIZE
"HEAD " DELIMITED BY SIZE
"WHERE " DELIMITED BY SIZE
" HEAD.TESTITEM = '200' " DELIMITED BY SIZE
INTO H-SQL-STRING
END-STRING.
*
* *> 動的SQLを用意します
EXEC SQL
PREPARE STCU01 FROM :H-SQL-STRING
END-EXEC.
*
* *> 動的カーソル宣言を行ないます
EXEC SQL
DECLARE CU01 CURSOR FOR STCU01
END-EXEC.
*
* *> 動的カーソルを開きます(SQLの実行)
EXEC SQL
OPEN CU01
END-EXEC.


あとは普通のカーソルと同じで、FETCHでデータを取得して、最後にカーソルをクローズします。

EXEC SQL
FETCH CU1
INTO
:H-HEAD-CDZIP ,
:H-HEAD-ADR1
END-EXEC.

* カーソルクローズ
EXEC SQL
CLOSE CU1
END-EXEC.


埋込みSQLとの違い

まず、SQL実行の前処理としてPREPARE文の記述が必要です。

構文

PREPARE <SQL文識別子> FROM <SQL文変数>

「SQL文識別子」は、実行するSQLを識別するための名前です。
上記のサンプルでは「STCU01」となっています。
カーソル名と同じく、WORKING-STORAGE SECTIONで定義する必要はありません。

次に、PREPARE文で用意した動的SELECT文のカーソルを定義します(動的カーソル宣言)。

構文

DECLARE <カーソル名> CURSOR FOR <SQL文識別子>


あとは、特に変わりません。

追記

サンプルではPROCEDURE DIVISIONでSTRINGを使用して直接SQL文を作成しましたが、WORKING-STORAGE SECTIONで準備したり、あるいはテキストファイルにSQL文を記述しておいてREADで読み込むといった実装も考えられます。

他の利点として動的SQLの場合、プリコンパイラでSQLのチェックが行われないという点があります。

どこかで書いたかもしれませんが、SQL*PLUSとかでは実行できるSQLが、プリコンパイラではエラーになる場合があります。
このような時に、動的SQLを使うことで問題を回避することが出来ます。


前回:NetCOBOLでのコミットとロールバックの考察
次回:NetCOBOLのコンパイルエラー集
投稿記事の一覧 : http://harikofu.blog.fc2.com/blog-entry-22.html

--- blog end ---

スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する