DFU, Query, SQL

43. RUNSQLコマンド

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(削除)
DROPSQLの削除。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                                                  

このようにRUNSQLSQLの命令が使えるとはいうものの肝心のSELECTFETCHが使えないため
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を普及させるのであれば対話式SQLRUNSQLとでは使用目的が
異なるのだから SELECTくらいは RUNSQLでサポートしてもよかったのではないか?

筆者は以前に対話式SQLを開発したことがある。
このサイトのToolsで14.ただでできる対話式SQLとして公開している。
これは SQLの UPDATE/INSERT/DELETE命令はもちろんSELECT命令も動作する。
このように技術的にSELECT文が動作しない理由はない。
IBM もケチくさい。

SELECT文も動作するRUNSQLコマンドを作るつもりである。