SQL方式
- 1 SQL方式
-
復習ですが、A−VXのCOBOLからA−VX/RDB上のデータを読み書きする方法として、
・拡張READ/WRITE方式
・SQL方式
の2種類があります。
拡張READ/WRITE方式の方は今まで説明してきました。ここではSQL方式の方を説明します。なお、SQL方式ですが、NECの説明書によってはSQL−DML、埋め込みSQL方式といった記述をしていることもあります。同じ意味です。
世間のCOBOLでは一般的なSQLですが、NECのオフコンのプログラミングではあまり使われないようです。
私自身も1,2か所の会社で使っているのを見たことがあるぐらいです。おそらくNECのオフコン業界全体で1%も使っていないのではないでしょうか。99%は拡張READ/WRITE方式の方を使っていると思います。私も「使っているプログラムを見たことがある」程度で、実際にNECのオフコンでSQL方式でCOBOLプログラミングしたことはありません。という訳で、私も「説明します」というほどのノウハウはありません。これからの説明はNECの説明書に毛が生えたようなものですので、ご承知おきください。
なぜあまり使われないかの理由は想像することができます。
拡張READ/WRITE方式を使ってのRDBアクセスが便利なことや、SQLをコンパイルする為にはCOBOLコンパイラとは別にSQLプリコンパイラというものを買わなければならないことなどが原因だと思います。あまり使われていない為に性能チューニングやトラブル時のノウハウなどがあまり蓄積されていない、ということもあるのかもしれません。(いままで説明してきたようにA−VX/RDBは独特の部分があり、細かいところでオープン系のノウハウが使えるのかどうかわからない。単純にテストプログラムレベルの簡単なものを作って実行します程度なら同じだと思いますが、実際に運用レベルとして使おうと思うと今まで同じで済んでいたような細かい差が問題になるということは皆さんご存じだと思います。)
- 2 使用できるSQLの範囲
-
使えるSQLは、基本的にSQL86の規格の範囲です。
また、今まで説明したようにDDL SQLは一切使用できません。CREATE TABLEとかDROP VIEWとかGRANTとかは使えないということです。そういうことは表定義保守のユーティリティ(#DDM)というものを使います。プログラム中でテーブルを作りたいような時はこの表定義保守のユーティリティを呼び出して使います。
- 3 埋め込みSQL
-
A−VXのCOBOLでSQLを使用する場合には、埋め込みSQLという方法を使います。メインフレーム系やオープン系のCOBOLでも一般的に使うやり方です。
A−VXの埋め込みSQLも一般的なものと同じで「EXEC SQL」と「END−EXEC」でSQL文を囲むような形です。
EXEC SQL INSERT INTO JINJI (TNO,TNAME,TAGE) VALUES (2000,YAMADA TARO,30) END-EXEC.
Oracle社のPro*COBOLと言語仕様はほとんど同じです。Pro*COBOLを使ったことのある人ならすぐわかるのではないでしょうか。
下にSQL方式のプログラミング例を載せます。カーソル操作を使った場合の例です。説明書から丸写しです。
IDENTIFICATION DIVISION. PROGRAM-ID. PG091. * ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. SYSTEM 3100. OBJECT-COMPUTER. SYSTEM 3100. * DATA DIVISION. WORKING-STORAGE SECTION. EXEC SQL BEGIN DECLARE SECTION END-EXEC. → ホスト変数定義 77 HS-NAME PIC X(10). 77 HU-SURYO PIC X(04). EXEC SQL END DECLARE SECTION END-EXEC. * EXEC SQL INCLUDE SQLCA END-EXEC. → SQLCA宣言 * PROCEDURE DIVISION. WHENEVER-PROC. EXEC SQL → 埋め込み例外条件宣言 WHENEVER SQLERROR GOTO:SQL-ERROR END-EXEC. * START-PROC. EXEC SQL → カーソル定義 DECLARE CI CURSOR FOR SELECT SNAME SURYO FROM URIAGE WHERE TANKA = 40 END-EXEC. EXEC SQL OPEN CI END-EXEC. → 定義したカーソルのOPEN PERFORM L-FETCH THRU L-FETCH-END UNTIL SQLCODE = 100. EXEC SQL CLOSE CI END-EXEC. → 処理終了カーソルのCLOSE PROC-END. STOP RUN. * SQL-ERROR. DISPLAY "SQL ERRORCODE" SQLCODE. GOTO PROC-END. * L-FETCH. EXEC SQL FETCH CI INTO:HS-NAME, :HS-SURYO END-EXEC → データ取り出し IF SQLCODE = 100 GOTO L-FETCH-END. DISPLAY "ショウヒンメイ:" HS-NAME " ウリアゲスウリョウ:" HU-SURYO. L-FETCH-END. EXIT.
[リレーショナル型データベース(2009年11月版)−第4部 利用編−1.2 SQL]よりカーソルを使わず(非カーソル操作)に、INSERTやUPDATE、DELETEでデータを操作することもできます。
例えばレコードを削除するときに、「カーソルを使って1行ずつFETCHして削除条件のレコードならDELETEする」ということもできるし、カーソルを使わずに「DELETEのWHEREに削除条件を書いて1回のSQLで一気に削除する」というプログラムを組むこともできます。