
■ 動的SQL
一通り書ききったと思ったのですが、動的SQLについての記載がありませんでした。
まぁ、普通のSQL文の発行(NetCOBOLで複数のDBに接続したい! No3 SELECT文)と変わらないと思いますけど、やってみましょうかね。
■ 動的SQL
下記が、動的SELECT文を発行するサンプルです。
IDENTIFICATION DIVISION.
PROGRAM-ID. DBTEST00.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
DATA DIVISION.
*
WORKING-STORAGE SECTION.
EXEC SQL BEGIN DECLARE SECTION END-EXEC.
01 H-USERNAME PIC X(008).
01 H-PASSWD PIC X(008).
01 H-DBSTRING PIC X(003).
01 H-DBNAME PIC X(010).
*
01 H-SQL PIC X(200).
01 H-ITEM-NAME PIC X(050).
*
EXEC SQL END DECLARE SECTION END-EXEC.
EXEC SQL INCLUDE SQLCA END-EXEC.
*
PROCEDURE DIVISION.
*
* Oracle接続文字列の設定
MOVE "user01" TO H-USERNAME.
MOVE "oracle" TO H-PASSWD.
MOVE "db1" TO H-DBSTRING.
MOVE "setu1" TO H-DBNAME.
*
* Oracle接続(DWH)
EXEC SQL
CONNECT :H-USERNAME IDENTIFIED BY :H-PASSWD
AT :H-DBNAME
USING :H-DBSTRING
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
*
* SQL文作成
STRING
'SELECT RTRIM("商品名")' DELIMITED BY SIZE
' FROM "TEST商品" A' DELIMITED BY SIZE
' WHERE "商品CD"' DELIMITED BY SIZE
' =' DELIMITED BY SIZE
" '087290'" DELIMITED BY SIZE
INTO H-SQL
END-STRING.
*
* 動的SQL文を用意
EXEC SQL
AT :H-DBNAME
PREPARE STCU1 FROM :H-SQL
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
*
* カーソルオープン
EXEC SQL
AT :H-DBNAME
OPEN CU1
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
*
* フェッチ
EXEC SQL
AT :H-DBNAME
FETCH CU1
INTO :H-ITEM-NAME
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
*
* カーソルクローズ
EXEC SQL
AT :H-DBNAME
CLOSE CU1
END-EXEC.
*
* SQLCODEとメッセージを出力(エラー確認用)
DISPLAY "SQLCODE = "SQLCODE " [" SQLERRMC "]".
*
* 抽出結果を表示
DISPLAY H-ITEM-NAME.
EXIT PROGRAM.
見て分かる通り、動的カーソルの用意から最後のクローズまで、全ての処理でAT句を指定しています。
埋込みSQLの時はOPEN、FETCH、CLOSEはAT句を指定しなくても良かったんですが、動的SQLの場合は無いとダメみたいです。
なお、AT句を指定しないと「SQL-02122: データベースへ接続でのOPENまたはPREPAREが無効です。」とエラーが発生しました。
■ 後書き
「NetCOBOLで複数のDBに接続したい!」シリーズは今回で終了です。
今となっては、COBOLで新規開発なんて少ないでしょうし、古いシステムの保守くらいの用途しかないのではないかと思いますが、言い方を変えれば、保守できる人が少なくなっているとも言えるかと思います。
この記事が、周りに頼りになるベテランが居なく、古いシステムの保守を任されて四苦八苦している方の役に立つことを願っています。
シリーズ一覧
・NetCOBOLで複数のDBに接続したい! No1 始めに
・NetCOBOLで複数のDBに接続したい! No2 接続
・NetCOBOLで複数のDBに接続したい! No3 SELECT文
・NetCOBOLで複数のDBに接続したい! No4 DML文
・NetCOBOLで複数のDBに接続したい! No5 接続(複数)
・NetCOBOLで複数のDBに接続したい! No6 トランザクション
・NetCOBOLで複数のDBに接続したい! No7 同一DB複数接続
・NetCOBOLで複数のDBに接続したい! No8 動的SQL
投稿記事の一覧:http://harikofu.web.fc2.com/
--- blog end ---
スポンサードリンク


