社内SEの徒然なる日記

NetCOBOLでSQLを実行してみる

単一行を返すSELECT文

SELECT文の実行においては、一般的なSQL句が使用できます。


EXEC SQL
SELECT NMWRH
INTO :H-AAA-NMWRH
FROM MAAA
WHERE CDWRH = '110'
END-EXEC.

上記のSQLは、MAAAテーブルからCDWRHが'110'であるレコードから、NMWRH列をホスト変数「H-AAA-NMWRH」に格納しています。
受け取る項目が複数の場合はカンマ(,)で区切って指定します。

SELECT文の実行結果が2件以上になる場合はエラーが発生するので、この方法で抽出する場合はPrimaryKeyのように、確実に結果が1件(か0件)になるようにWHERE句に条件を設定する必要があります。

INSERT・UPDATE・DELETE文

INSERT・UPDATE・DELETE文のそれぞれの書き方は、SELECT文と同じ要領で記述できます。


EXEC SQL
UPDATE MITM SET CDUNT = :H-MITM-CDUNT
WHERE MITM.CDITM LIKE '0%'
AND MITM.CDMKR = :H-MITM-CDMKR
END-EXEC.


上記のSQLは、MITMテーブルからCDITMが0から始まり、かつCDMKRが
ホスト変数H-MITM-CDMKRと一致する行のCDUNTをホスト変数H-MITM-CDUNTで更新しています。

見てのとおり、EXEC SQLとEND-EXECで囲っていることとホスト変数の使用以外は通常のSQLと同等になります。

複数行を取得するSELECT文

複数行を取得するSELECT文を発行する場合は、カーソルというものを使います。
...実際には、1件検索でも使用しているんですけどね。

カーソルとは

カーソルと呼ばれる識別子を使用すると、SQL文に名前を付けて処理を制御することが出来ます。

具体的には次の処理が出来ます。

  ① 問合せによって戻された最初の行以後の処理

  ② 現在どの行が処理されているかの追跡と記憶


カーソルの定義と使用の概略は、こんな感じになります。

  ① DECLARE文を使用してカーソルに名称をつけて問合せに関連付ける。

  ② OPEN文で問合せを実行する。

  ③ FETCH文を使用して②の問合せ結果から1行ずつ取り出す。

     FETCHは全ての行が取り出されるまで繰り返し実行できる。

  ④ CLOSE文によってカーソルの使用を禁止する。


静的SQL文のカーソルは明示的なカーソルと暗黙的なカーソルの2種類存在します。

  ① 明示カーソル  ・・・ OPEN、FETCH、CLOSEの3つの処理を全て記述して行う。

  ② 暗黙カーソル  ・・・ 一文でOPEN、FETCH、CLOSEの全ての処理を行う方法。

                 INTO文を使用するSELECT文、データ定義文やDML文で暗黙的に

                 カーソルが使用されている。


カーソルの宣言(DECLARE文)

DECLARE文でカーソルを定義します。
実際に実行するSQL文もここで記述します。

【制限事項】

① カーソル名を他の「DATA DIVISION」 等で記述してはならない。

② カーソル名にハイフンは使用不可

③ カーソル名は18文字まで


【構文】

EXEC SQL DECLARE 「カーソル名」
CURSOR FOR
「SELECT文」
END-EXEC.


カーソルのオープン(OPEN文)

DECLARE文で指定した問合せを実行します。

【構文】

EXEC SQL
OPEN 「カーソル名」
END-EXEC.


カーソルからのフェッチ(FETCH文)

問合せの実行結果から行を取り出して指定したホスト変数に格納します。
これが、テキストファイル読込のREADに相当する処理になります。
最終行の判断(AT ENDに相当するもの)については、エラー処理(http://harikofu.blog.fc2.com/blog-entry-53.html)にて説明します。

【構文】

EXEC SQL
FETCH 「カーソル名」
INTO ホスト変数
END-EXEC.


カーソルのクローズ

行のフェッチ終了後に、カーソルをクローズしてオープンによって取得していたリソースを開放します。

【構文】

EXEC SQL
CLOSE 「カーソル名」
END-EXEC.


追記

バージョンにもよるのかもしれませんが、複雑なSQLはプリコンパイルでエラーになる事がありますので、NetCOBOLからのSQL発行ではシンプルなSQLにすることをお勧めします。
どうしても複雑なSQLを使いたい場合は、動的SQL(記述予定)というものを使って下さい。

前回:NetCOBOLとOracleのデータ型の関係
次回:NetCOBOLでSQLのエラーを確認する
投稿記事の一覧 : http://harikofu.blog.fc2.com/blog-entry-22.html

--- blog end ---
スポンサードリンク

PageTop

コメント


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