RPGエラーと組み込みSQLを処理する
こんにちは、Ted。
RPG and DB2 Summitで教わった新たなテクニックの使い方に苦労しています。以下は、私が書いているプログラムのスクリーン ショットです。コンパイラーが何を気に入らないのか見当が付きません。宣言が失敗する原因になっていそうなものが何か分からないでしょうか。
-- Mike
Mike氏のコードにざっと目を通したところ、SELECTおよびWHERE節で相関名を使用していることに気付きましたが、以下のように、どの表についても、その相関名を定義していなかったようです。
SELECT x.onefield, x.twofield, x.redfield, x.bluefield
FROM MYTABLE
WHERE x.onefield = :TestValue;
Mike氏はFROMに相関名を追加しましたが、それで問題が完全に解決したわけではありませんでした。もう少しコードを見てみて、私が気付くべきだったことを見てみましょう。
dcl-s TestValue dec(3);
正解です。データ型は、decではなく、packedであるべきです。 私が気付かなかった理由は、私がしっくりくるのはdecだったからです。複数のプログラミング言語を使用しているプログラマーは、そのような構文エラーに気付かないままソース コードを読んでしまいがちであり、私はCLプログラムでいつも*DECを使用しているということも一因だったようです。運よく、Mike氏の同僚が間違いに気付き、めでたしめでたしで終わりました。プログラムはコンパイルされ、正常に動作しました。
私が自問した疑問は、システムがなぜ、そのような単純なエラーをきちんと指摘してくれなかったのかということです。Mike氏がSEUを使用してソース コードを編集していたのなら納得できます。SEUは、DCL-Sを理解しません。理解したこともなければ、今後理解することもないでしょう。けれども、Mike氏が使用していたのはRDiでした。
答えは、こういうことになります。SQLプレコンパイラー、さらにはRDi構文チェッカーが、組み込みSQLがあるRPGプログラムでRPG構文チェックを完全に行うというのは現実的ではないということです。できることにも限度があります。
それでは、RPG構文の違反からエラーが生じたときに、どのようにすれば、そうした理想的とは言えないSQLプリコンパイラーのメッセージの原因を突き止められるのでしょうか。特に、SQL0312(Variable &1 not defined or not usable(変数 &1 が未定義か使用できない))やSQL5011(Host structure array &1 not defined or not usable(ホスト構造配列 &1 が未定義か使用できない))の場合です。
簡単な方法の1つは、SQLステートメントをコメント アウトし、バインドRPGプログラム作成(CRTBNDRPG:Create Bound RPG Program)コマンドなど、RPGコンパイラーを起動するコマンドでプログラムのコンパイルを試みることです。私の場合は、各ステートメントをコメント アウトするのではなく、未定義のコンパイラー ディレクティブを使用します。
dcl-s RecCount dec(3);
*inlr = *on;
/if defined(xyz)
exec sql select count(*) into :RecCount
from qiws.qcustcdt;
/endif
return;
RPGコンパイラー リストが、問題点を示してくれます。
1 dcl-s RecCount dec(3);
======> bbbbbbbb aaa
*RNF3308 20 a 000100 Keyword name is not valid; the keyword is ignored.
ついでになりますが、良いお知らせがあります。IBMは、SQLプリコンパイラーから送られるメッセージの品質改善を行いました。バージョン7.2および7.3での機能強化により、プリコンパイラーはメッセージSQL0312およびSLQ5011に理由の説明を付加するようになりました。こうした機能強化を有効にするには、PTFをインストールする必要があります。
7.2 | SI67777 |
7.3 | SI67615 |
次のリリースでは、理由が、理由コードとともにメッセージ テキストに統合されるようになります。
これらの機能強化の詳細については、以下のリンクを参照してください。
SQL Precompiler SQL0312 and SQL5011 message enhancement
この素晴らしいお知らせについて、IBMのScott ForstieとSue Romanoの両氏に感謝の意を表します。