ushidayの日記

主に「IBMi」のメモに・・・

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)