OCCURS 句

OCCURS 句は、同じデータ項目が繰り返される際に、その記述項をその都度指定する手間を省き、添え字や指標を付けるために必要な情報を提供する。

書き方 1 の一般形式


*

書き方 2 の一般形式

OCCURS の書き方 2

書き方 3 の一般形式


*

指令

  1. 予約語リストのフラグ設定および修正を行うコンパイラ指令に加えて、以下の指令が、本セクションに記載の構文または意味内容に影響を与える可能性がある。
    • ODOOSVS - OCCURS DEPENDING ON 句について、OS/VS COBOL と互換性のある処理を行うよう要求する。
    • ODOSLIDE - 入れ子構造の OCCURS DEPENDING ON 句およびその後続の固定データの処理を制御する。
    • REENTRANT - プログラムをマルチスレッド環境で使用できるようにする。

構文規則

  1. integer-1 および integer-2 を両方指定する場合、integer-1 は 1 以上とし、

    ANS85OSVS または 0 と等しくする。

    integer-2 は integer-1 よりも大きいものとする

    OSVSVSC2 。または等しくする

    OSVSVSC2MF 書き方 2 では、「integer-1 TO」を省略すると、デフォルト値として 1 が想定される。

  2. data-name-1 のデータ記述は整数とする。
  3. data-name-1、data-name-2、data-name-3 は修飾できる。
  4. data-name-2 は、OCCURS 句を含む記述項の名前とするか、その下位に属する記述項の名前とする。

    OSVS 現在、この制限は廃止されている。

  5. data-name-3 などは、この記述項の左辺である集団項目の下位に属する記述項の名前とする。

    OSVS 現在、この制限は廃止されている。

  6. この記述項の左辺またはその下位に属する記述項を、指標付けによって参照する場合は、INDEXED BY を指定する。

    OSVSVSC2MF ただし、他の表用に定義した指標を使用する場合は、その必要はない (「COBOL 言語の概念」の章の「指標付け」セクションを参照)。

    この句で識別される指標名は、他の場所では定義されず、データとして扱われず、データ階層に関連付けることもできない。

  7. レコード記述内で、書き方 2 の OCCURS 句を含むデータ記述項の後ろに続けられるのは、その下位に属するデータ記述項のみである。

    OSVSVSC2MF レコード記述内で、書き方 2 の OCCURS 句を含むデータ記述項の後ろには、その下位に属さないデータ記述項も続けられる。data-name-1 が参照するデータ項目の値が変更されると、その表の後に続くが従属はしないデータ項目の位置が変更される。これらの項目に含まれるデータは失われる場合がある。

    MF ただし NOODOSLIDE コンパイラ指令を設定した場合は例外的に、data-name-1 の値にかかわらず、その表を含むすべての集団項目は常に最大反復数を持つものと見なされるため、表に続くデータ項目の位置は変更されない。

  8. OCCURS 句は、次のデータ記述項には指定できない。
    1. レベル番号が 66 または 88 であるデータ記述項
    2. 可変サイズの項目を記述するデータ記述項。可変サイズの項目とは、下位項目のデータ記述に、書き方 2 の OCCURS 句を含むものである。

      OSVSVSC2 OCCURS 句は、書き方 2 の OCCURS 句を指定した別の項目の下位に属するデータ記述に指定できる。

  9. OCCURS 句は、レベルが 01 またはレベル番号が 77 であるデータ記述項には指定できない。

    MF 現在、この制限は廃止されている。

  10. 書き方 2 では、data-name-1 で定義されるデータ項目は、OCCURS 句を含むデータ記述項が定義する最初の文字位置から、OCCURS 句を含むレコード記述項が定義する最後の文字位置までの範囲内には配置できない。

    OSVSVSC2 ODOSLIDE コンパイラ指令を設定した場合は、data-name-1 は固定位置とする。

  11. data-name-2 がこの記述項の左辺ではない場合は、以下のようにする。
    1. KEY IS 指定のデータ名で識別される項目はすべて、この記述項の左辺である集団項目に含まれているものとする。
    2. KEY IS 指定のデータ名で識別される項目には、OCCURS 句は含められない。
    3. KEY IS 指定のデータ名で識別される項目と、この記述項の左辺の間には、OCCURS 句を含む記述項は配置できない。
  12. index-name-1 や index-name-2 などは、ソース要素内で一意の語とする。

    OSVS index-name-1 や index-name-2 などは一意である必要はなく、この記述項の左辺であるデータ名によって修飾できる。

  13. OSVSVSC2MF 外部または内部浮動小数点数データ項目に対して、OCCURS 句を指定できる。
  14. ISO2002 KEY 句は、字類がオブジェクトであるデータ項目に対して指定できない。
  15. NETJVM 書き方 3 の OCCURS 句は、レベル 01 のデータ記述項で指定する必要がある。
  16. NETJVM ANY を指定する場合、OCCURS が繰り返されるかどうかにかかわらず、すべての次元に対して ANY 句を指定する必要がある。
  17. NETJVM 書き方 3 の OCCURS 句の記述項の左辺は、「言語の基礎」の章の「.NET の概念」セクションの「.NET ネイティブ型」のトピックで指定されている .NET ネイティブ型にする必要がある。

一般規則

  1. OCCURS 句は、表またはその他の反復される同形のデータ項目を定義するために使用する。OCCURS 句を使用する場合、文内で参照する際は常に、この記述項の左辺であるデータ名には添え字または指標を付ける。ただし、SEARCH、

    MF SORT

    または USE FOR DEBUGGING 文は例外とする。さらに、この記述項の左辺が集団項目の名前である場合、その集団に属するデータ名を作用対象として使用する際には、すべて添え字または指標を付ける。ただし、REDEFINES 句の右辺として用いる場合は例外とする。「COBOL 言語の概念」の章の「添え字付け」、「指標付け」、および「一意名」トピックを参照。

  2. OCCURS 句自体を除き、記述に OCCURS 句を含む項目に関連するすべてのデータ記述句は、記述された項目の各反復に適用される。
  3. UNBOUNDED を使用して、無制限の表 (反復回数が無制限である表) を指定できる。また、表を参照できる場所であればどこでも参照できる。
  4. 無制限集団とは、1 つ以上の無制限の表を含む集団である。無制限集団は連絡節でのみ指定でき、英数字または各国文字型とする。
  5. 次の例外を除き、英数字または各国文字の集団を参照できる場所であれば、COBOL 構文の無制限集団を参照できる。
    • 無制限集団は、CALL 文の BY CONTENT 引数として指定できない。
    • 手続き部の RETURNING 指定では、無制限集団を data-name-2 として指定できない。
    • LENGTH 組み込み関数の引数を除き、組み込み関数の引数として無制限集団は指定できない。
  6. data-name-1 は固定位置に置く。したがって、OCCURS DEPENDING ON 句を含む項目の後ろには配置できない。
  7. 記述項の左辺の反復回数は、次のとおり定義される。
    1. 書き方 1 では、integer-2 の値が厳密な反復回数を表す。
    2. 書き方 2 では、data-name-1 が参照するデータ項目の現在の値が反復回数を表す。

      この書き方では、この記述項の左辺の反復回数が可変となる。integer-2 の値は最大反復回数を表し、integer-1 の値は最小反復回数を表す。つまり、この記述項の左辺の長さは必ずしも可変ではなく、反復回数が可変となる。

      data-name-1 が参照するデータ項目の値は、integer-1 から integer-2 の範囲内とする。このデータ項目の値を小さくすると、反復回数が data-name-1 で参照されるデータ項目の値を超えるデータ項目の内容が予測不可能となる。

  8. ANS85  書き方 2 の OCCURS 句を指定する項目が従属する集団項目を参照すると、操作に使用される表領域部分は次のように決定される。
    1. data-name-1 が参照するデータ項目が集団の外にある場合、処理開始時に data-name-1 が参照するデータ項目の値が指定する表領域部分のみが使用される。
    2. data-name-1 が参照するデータ項目が同じ集団に含まれており、集団データ項目が送信側項目として参照される場合、処理開始時に data-name-1 が参照するデータ項目の値が指定する表領域部分のみが処理で使用される。集団が受信側項目である場合は、集団の最大長が使用される。
  9. KEY IS 指定は、data-name-2、data-name-3 などに含まれる値に従って、昇順または降順で反復データを配置することを指定する。昇順または降順の順序は、作用対象の比較の規則に従って決定される (「手続き部」の章の「比較条件」トピックの「数字作用対象の比較」および「文字作用対象の比較」トピックを参照)。これらのデータ名は降順でリストされる。
  10. index-name-1 や index-name-2 などに割り当てられる記憶域の種類は、プログラムが再帰的であるかどうか (つまり、局所記憶節が定義されているかどうか)、および REENTRANT コンパイラ指令が指定されているかどうかによって異なる。

    以下の最初の表は、非再帰プログラムに記憶域を割り当てる方法を示す。その次の表は、再帰プログラムに記憶域を割り当てる方法を示す。

    表 1. 非再帰プログラムの指標名に割り当てられる記憶域
    指標名を定義する節 指標名を割り当てる節
    NOREENTRANT REENTRANT (1) REENTRANT (2)
    作業場所 作業場所 作業場所 スレッド局所
    スレッド局所 スレッド局所 スレッド局所 スレッド局所
    連絡 作業場所 局所記憶 局所記憶
    表 2. 再帰プログラムの指標名に割り当てられる記憶域
    指標名を定義する節 指標名を割り当てる節
    NOREENTRANT REENTRANT (1) REENTRANT (2)
    作業場所 作業場所 作業場所 スレッド局所
    スレッド局所 スレッド局所 スレッド局所 スレッド局所
    局所記憶 局所記憶 局所記憶 局所記憶
    連絡 局所記憶 局所記憶 局所記憶
  11. NETJVM 書き方 3 の OCCURS 句を持つ記述項は、.NET ネイティブ配列に直接マッピングされる配列を定義する。COBOL では、最初の配列要素は添え字 1 を持つ。
  12. NETJVM ANY を指定する場合に配列の要素を参照できるようにするには、事前に SIZE または CONTENT を指定した SET 文を配列で実行する必要がある。
  13. NETJVM ANY および integer-2 を含む選択可能項目を繰り返す書き方 3 の OCCURS 句は、すべての行および列が同じサイズの四角形配列を定義する。
  14. NETJVM 書き方 3 の OCCURS 句の繰り返しは、ジャグ配列、または各種サブ配列の長さが異なる配列の配列を定義する。