DFU, Query, SQL

81. RUNSQL で SELECT文を使う方法

RUNSQLRUNSQLSTMではSELECT文のような結果を出力するSQL文は使えない。
RUNSQLでSELECTを使おうとして何度も不明なSQLエラーにはじき返された人も
多いはずである。
STRSQLで実行してみるとSELECT文は問題なく使えるのにRUNSQLやRUNSQLSTMで
使えないと頭を抱えたことがある人も多い。
SQLのエラー・メッセージも不親切で「実行できなかった」くらいの
メッセージしか戻ってこないので原因が不明ということであるが
これは仕様として結果を出力するSQL文は使えないということである。

それでは使用頻度の多いはずのSELECT文はRUNSQLで使えないのかという
問題を解決する方法をここで紹介しよう。

RUNSQL SQL('SELECT * FROM QTRFIL/SHOHIN ORDER BY SHCODE') COMMIT(*NONE)

を実行すると

SQL ステートメントを使用することはできない。

とのエラーになる。RUNSQLなのにSQLステートメントが使用できないとは? と
日本人にとっては意味不明のエラー・メッセージとしか思えない。
IBM も
このSQL ステートメントは使用することはできない。

というエラー・メッセージなら日本人もよく理解できたはずであるが
日本語の表現としては不十分である。
「この」や「は」という区別を示す副助詞があるとないとでは意味が違ってくる。

そこで

RUNSQL SQL('CREATE TABLE QTEMP/@SHOHIN AS (SELECT * FROM QTRFIL/SHOHIN OR
DER BY SHCODE) WITH DATA') COMMIT(*NONE)                                 

として SELECTを CREATE TABLE QTEMP/@SHOHIN AS (SELECT文) WITH DATA

という実行すればこれはファイル: QTEMP/@SHHINを生成するSQLであるので
結果を出力するSQLではない。要するにSQL文の後にFETCHなどによって
さらにデータを読み取る必要のあるSQL文はRUNSQLでは実行は許されないということである。
このSQLであれば RUNSQL は文句を言うことなく問題なく実行できて

RUNQRY *N  QTEMP/@SHOHIN

を実行すれば

SELECT * FROM QTRFIL/SHOHIN ORDER BY SHCODE

を実行したのと同じ結果をRUNQRYを使って実行できたことになる。
少し工夫すればRUNQRY や RUNQRYSTM の活用方法は広がるものである。

[参考]

この方法はAI: Copilot に別件で教えてもらった方法である。