可変長テーブルは、OCCURS 文節の形式 2 を使用して指定されます。
OCCURS 文節 - 形式 2 - 可変長テーブル >>-OCCURS--整数-1--TO--整数-2--+-------+--DEPENDING--+----+-----> '-TIMES-' '-ON-' >--データ名-1---------------------------------------------------> .-----------------------------------------------------. V | >----+-------------------------------------------------+-+------> | .------------. | | V | | '-+-ASCENDING--+--+-----+--+----+----データ名-2-+-' '-DESCENDING-' '-KEY-' '-IS-' >--+-------------------------------+--------------------------->< | .----------. | | V | | '-INDEXED--+----+----指標名-1-+-' '-BY-'
サブジェクト項目の長さは固定されています。 可変であるのは、そのサブジェクト項目の反復回数だけです。
整数-1 の値は、ゼロかそれ以上でなければならず、 また、整数-2 の値より小さくなければなりません。
OCCURS DEPENDING ON 文節のオブジェクトは、どのテーブルの範囲内のどの記憶位置 (すなわち、テーブルの最初の文字位置からテーブルの最後の文字位置までのすべての記憶位置) も占めてはなりません。
OCCURS DEPENDING ON 文節のオブジェクトは、位置が可変でない場合があります。 このオブジェクトは、OCCURS DEPENDING ON 文節を含んでいる項目の後に置くことはできません。
グループ項目 (あるいは、従属した OCCURS DEPENDING ON 項目を含んでいるデータ項目、 または OCCURS DEPENDING ON 項目の後にあるが、この項目に従属していないデータ項目) を参照するときには、OCCURS DEPENDING ON 文節のオブジェクトの値は、 整数-1 から整数-2 までの範囲内になければなりません。 グループの位置が可変でないとすれば、参照されるグループが CALL BY REFERENCE ステートメントで使われているときには、この規則は適用されません。
EXTERNAL 文節の入ったレコード記述記入項目に含まれるデータ記述記入項目に OCCURS 文節を指定するときは、 データ名-1 は、同じデータ部に記述された EXTERNAL 属性を持つデータ項目を参照しなければなりません。
データ記述記入項目が GLOBAL 文節の入ったものに従属するときは、 データ名-1 はグローバル名でなければならず、同じデータ部に記述されたデータ項目を参照しなければなりません。
従属 OCCURS DEPENDING ON 項目を含むグループ項目が参照される場合、 テーブル域のどの部分が処理に使用されるかは、次のように判別されます。
可変長テーブルの入ったグループ項目に対して参照変更を加えると、その参照変更で参照されるデータ項目から固有データ項目が作成されます。 その参照されるデータ項目の長さは、まず前の規則を適用して判別されます。 その後、参照変更の規則が適用され、その固有データ項目の長さが判別されます。
CALL ステートメントの USING 句で引数として可変長テーブルの入ったグループ項目が使用されると、 呼び出し先プログラムの立場から見たそのパラメーターのストレージ・サイズは、その引数の渡し方によって異なります。 引数が BY REFERENCE で渡されるとき、最大サイズは、呼び出し側プログラム内の引数のデータ記述によって記述されます。 引数が BY CONTENT で渡されるとき、グループ項目は送り出し項目とみなされます。
グループ項目の後に非従属項目が続く場合、実際の長さ (最大長ではなく) が使用されます。 項目のサブジェクト (あるいは、項目のサブジェクトに従属するデータ項目、または項目のサブジェクトの上位のデータ項目) を参照するときには、OCCURS DEPENDING ON 文節のオブジェクトの値は、整数-1 から整数-2 までの範囲内になければなりません。
OCCURS 文節のサブジェクトは、OCCURS 文節を含むデータ項目のデータ名です。 OCCURS 文節のサブジェクトがタイプ名に従属する場合があります。 OCCURS 文節そのものを除いて、サブジェクトに対して使用されるデータ記述文節は、記述される項目のそれぞれのオカレンスに適用されます。
サブジェクトが SEARCH または USE FOR DEBUGGING 以外のステートメントで使用されているときはいつでも、サブジェクトが REDEFINES 文節のオブジェクトでないかぎり、添え字や指標を付ける必要があります。 この場合、サブジェクトはテーブル・エレメントの中の 1 つのオカレンスを指します。
サブジェクトが SEARCH で使用されている場合、USE FOR DEBUGGING ステ ートメントで使用されている場合、あるいは、サブジェクトが REDEFINES 文節 のオブジェクトの場合は、添え字および指標を付けてはなりません。 この場合、サブジェクトはテーブル・エレメント全体を表します。
上記の 2 つの制限は LENGTH OF 特殊レジスターには適用されないことに注意してください。
1 つのレコード記述記入項目では、OCCURS DEPENDING ON 文節を含む記入項目の後には、それに従属する項目またはレベル 66 の項目だけしか続けることはできません。
OCCURS DEPENDING ON 文節は、別の OCCURS 文節に従属するものとして指定することはできません。
+----------------------------------IBM 拡張----------------------------------+
複合 OCCURS DEPENDING ON は、以下のように構成されます。
複合 OCCURS DEPENDING ON について詳しくは 付録 H, 複合 OCCURS DEPENDING ONを参照してください。
+------------------------------End of IBM 拡張-------------------------------+
OCCURS 文節に使用するすべてのデータ名は修飾できますが、そのデータ名に添え字または指標を付けることはできません。
OCCURS または OCCURS DEPENDING ON 文節は、次のようなデータ記述記入項目には指定できません。
ASCENDING/DESCENDING および INDEXED BY 文節については 固定長テーブルで説明されています。
+----------------------------------IBM 拡張----------------------------------+
複合 OCCURS DEPENDING ON は COBOL 85 標準の拡張としてサポートされます。 コンパイラーによって許可される複合 ODO の基本形式を以下に示します。
複合 ODO は使用が容易でなく、コードの維持管理を困難にする可能性があります。 ディスク・スペースを節約するために使用する場合には 付録 H, 複合 OCCURS DEPENDING ONに示したガイドラインに従ってください。
+------------------------------End of IBM 拡張-------------------------------+