SQLRPGプリコンパイラの不思議
久々に備忘録。
滅多なことでは、SQLRPGを使わないのですが、少しハマったので備忘録を。
例えばこんな感じのD仕様書で
D result DS dim(ITEM_Row_Max) D LIKEREC(ITEMR :*INPUT)
こんな感じのC仕様書だった場合
exec SQL set Result sets Array :result for :count Rows ;
CRTSQLRPGIを実行すると、SQLのプリコンパイルで以下のようなエラー
SQL5011 30 108 桁 60 ホスト構造配列 RESULT が定義されていないか,または使用できない。
LIKERECをEXTNAMEで外部参照しても同じ結果です。
以下は、V5R4 ILE-RPG解説書のLIKERECから引用。
LIKEREC は、2 番目の任意指定パラメーターを使用できます。このパラメーターはレコードのどのフィールドをデータ構造に入れるかを指定します。これには以下のものが含まれます。
-
- *ALL 外部レコードのすべてのフィールドが抜き出されます。
- *INPUT すべての入力可能フィールドが抜き出されます。(これはデフォルトです。)
- *OUTPUT すべての出力可能フィールドが抜き出されます。
- *KEY キー・フィールドが、キーがDDS のK 指定に定義されている順番に抜き出されます。
上記によるとデフォルトは「*INPUT」との事。
自分の認識「READ/UPDATE = *INPUT」「WRITE = *OUTPUT」「KLIST = *KEY」*ALLは使わない。
こんな感じです。でも不思議とD仕様書を以下の様に、LIKERECの第二引数を省略するとSQLのプリコンパイルが出きるんですよ。これって何?確かにINPUTもするし、Result SetsでOUTもするけど、その関係で...?でも省略は*INPUTのハズ。どうにも解らない。誰か詳しい人教えて下さい。
D result DS dim(ITEM_Row_Max) D LIKEREC(ITEMR)