RUNSQLやRUNSQLSTMでは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 に別件で教えてもらった方法である。
