2.2.4 可変長データについて
Cosminexus連携機能で使用できる可変長データは,「OCCURS DEPENDING ON」で指定できる可変長とは異なります。
データの形式は次のようになります。
「長さ」:後続する「バイト配列データ」のデータ長(長さエリアは含まない)
COBOL UAPでは,次のような形式です。
01 VARDATAS. 02 VARDATALEN PIC S9(9) USAGE COMP. 02 VARDATAITEM PIC X(nn). nn:データ長を指定します
COBOL UAPの引数の記述は,次の2とおりあります。
(1) 01および77レベルのアドレスデータ項目を使用した可変長データの指定
<指定例>
01 VARDATA USAGE ADDRESS.
COBOL UAPには,上記データの先頭アドレスが渡されるので,BY VALUE指定で引数を受け取ります。
PROCEDURE DIVISION USING BY VALUE VARDATA.
受け取ったデータは「アドレス」なので,内容を参照するために「アドレス名にアドレスを設定して参照する」ことになります。
: WORKING-STORAGE SECTION. 01 VARDATAS ADDRESSED BY VARDATAS-ADDR. 02 VARDATASLEN PIC S9(9) USAGE COMP. 02 VARDATASITEM PIC X(10000). : LINKAGE SECTION. 01 VARDATA USAGE ADDRESS. PROCEDURE DIVISION USING BY VALUE VARDATA. COMPUTE VARDATAS-ADDR=VARDATA. IF VARDATASLEN=ZERO THEN :
(2) 01および77レベルの英数字項目を使用した可変長データの指定
<指定例>
01 VARDATA PIC X(nn). nn:データ長を指定します 01 VARDATAS REDEFINES VARDATA. 02 VARDATASLEN PIC S9(9) USAGE COMP. 02 VARDATASITEM PIC X(10000).
ただし,このままでは「英数字項目」として扱うため,COBOLアクセス用Bean生成ツールでデータ属性に「可変長データ(byte[])」を指定する必要があります。再定義項目は,COBOL UAPでだけ使用できます。引数は BY REFERENCE で受け取ります。
PROCEDURE DIVISION USING BY REFERENCE VARDATA.
受け取ったデータは再定義項目で参照してください。
: LINKAGE SECTION. 01 VARDATA PIC X(10000). 01 VARDATAS REDEFINES VARDATA.. 02 VARDATASLEN PIC S9(9) USAGE COMP. 02 VARDATASITEM PIC X(10000). PROCEDURE DIVISION USING BY REFERENCE VARDATA. IF VARDATASLEN=ZERO THEN :
上記二つの指定方法の違いは,「可変長データの最大長をあらかじめ指定するかどうか」です。最大長がCOBOLプログラムで記述できる最大領域長を超える可能性がある場合は「アドレスデータ項目」を使用してください。最大長がCOBOLプログラムで記述できる最大領域長を超えない場合は「英数字項目」で指定することもできます。
可変長データに対するJavaプログラムでの操作は次のようになります。
setter setVardata(byte[] data, int len) getter getVardata()
setterでは,データ自身をバイト配列データで指定します。このデータは,文字列データのような「文字コード変換」は行わない点に注意してください。また,データ長をlenで指定します。
getterでは,byte配列が取得されます。byte配列の長さはlengthプロパティで取得できます。
詳細の指定は,以降の章を参照してください。