i5/OS Ver7.1~では標準で RUNSQL(SQLの実行)コマンドが提供されている。
この RUNSQLコマンドはライブラリーQSYSに保管されているので
対話式SQL(STRSQL)が導入されていない IBM iであっても使用することができる。
ただし紛らわしいのだが RUNSQLコマンドで SQLの代表的な SELECTコマンドを
実行することはできない。
例えば、
SQL の実行 (RUNSQL) 選択項目を入力して,実行キーを押してください。 SQL . . . . . . . . . . . . . . > 'SELECT *FROM QTRFIL/SHOHIN WHERE SHCODE='NV -CF1' ... コミットメント制御 . . . . . . *CHG *CHG, *UR, *CS, *ALL, *RS... 命名 . . . . . . . . . . . . . *SYS *SYS, *SQL
と、やれそうな気がするのだがこれはエラーとなる。
RUNSQLコマンドはSQLのデータ選択機能(SELECT)を実行するのではなく
SQLのいくつかの命令を実行するために作られた機能であるからだ。
それでは RUNSQLはどのようなSQL命令を実行できるのだろうか?
またRUNSQLはどのように利用すればよいのだろうか?
RUNSQLで実行可能な代表的なSQL命令をいくつか挙げてみると
CALL
COMMIT
CREATE TABLE
CREATE VIEW
DELETE
DROP
INSERT
LABEL
RENAME
ROLLBACK
UPDATE
…CREATE TABLE は 物理ファイルの作成で CRTPF と同じである。
CREATE VIEW は論理ファイルの作成で CRTLF と同じである。
データの更新としてINSERT(追加), UPDATE(更新), DELETE(削除)
DROPは SQLの削除。LABELはテキストの付与。
次にRUNSQLを利用する用途であるが CLPの中でこのようなSQL命令を実行するために
利用される。
[例1] CLP内でレコードを追加する
0001.00 PGM 0002.00 RUNSQL SQL('INSERT INTO QTRFIL/HINSHU + 0003.00 VALUES(''0009'', '' スマートホン '')') + 0004.00 COMMIT(*NONE) 0005.00 ENDPGM
[例2] SELECTで選択したレコードを使ってファイルを作成する
0001.00 PGM 0002.00 RUNSQL SQL('CREATE TABLE QTEMP/HINSHU AS (SELECT * + 0003.00 FROM QTRFIL.HINSHU WHERE HNSCOD = + 0004.00 ''0008'') WITH DATA') 0005.00 ENDPGM
このようにRUNSQLはSQLの命令が使えるとはいうものの肝心のSELECTやFETCHが使えないため
SQLの用途としては需要のわずかでしかない。
RUNSQLで使えるSQL命令の大半はIBM i コマンドで代替できるものばかりで
SQLの独自性はほとんど生かされていない。
RUNSQLの紹介では
・RUNSQLSTM のように SQLステートメントを予めソースに保管しておく必要がない。
・RUNSQLSTM のようにスプールが出力されない。
というような利点を挙げているが SELECTが使えないのでは SQLとは言いがたい。
実はSQLは API: QSQROUTE というAPIによってすべてが処理されているので
RUNSQLでも当然 QSQROUTE を内部的に使っているはずなので
SELECT文も使うことに技術的な問題はないはずである。
RUNSQLコマンドで SELECTが使えてしまうとユーザーは対話式SQLライセンス・プログラムを
契約する必要は無くなってしまう。
どうもこのあたりが原因で SELECT文の使用を制約してしまったのではないかと
思える。
IBM も SQLを普及させるのであれば対話式SQLと RUNSQLとでは使用目的が
異なるのだから SELECTくらいは RUNSQLでサポートしてもよかったのではないか?
筆者は以前に対話式SQLを開発したことがある。
このサイトのToolsで「14.ただでできる対話式SQL」として公開している。
これは SQLの UPDATE/INSERT/DELETE命令はもちろんSELECT命令も動作する。
このように技術的にSELECT文が動作しない理由はない。
IBM もケチくさい。
SELECT文も動作するRUNSQLコマンドを作るつもりである。