なぜ「多重OCCURS」が重要なのか
COBOLの現場では、単なるリスト構造だけでは表現しきれないデータに出会うことが多々あります。例えば、「月別の曜日データ」や「拠点ごとの売上マトリックス」などです。これらを個別の変数で定義するとコードが煩雑になり、保守性が著しく低下します。多重OCCURS(二次元配列)を使いこなすことで、複雑な構造データをスマートに管理し、ループ処理による効率的なデータアクセスが可能になります。
基礎知識:二次元配列の仕組み
COBOLにおける二次元配列とは、OCCURS句の中にさらにOCCURS句を入れ子にした構造を指します。
- 外側のOCCURS(行):データの大きなグループを定義します。
- 内側のOCCURS(列):そのグループの中に含まれる詳細な項目を定義します。
アクセスする際は、添字をカンマで区切って記述します。数学の行列と同じく「行番号、列番号」の順で指定するのが一般的です。
実装と解決策
二次元配列を扱う際は、必ず「入れ子のPERFORM文」を使用します。外側のループで「行」を固定し、内側のループで「列」をスキャンすることで、マトリックス全体を網羅的に走査できます。
サンプルプログラム
以下のプログラムは、3行×4列の表形式データを定義し、値を設定して表示する例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. MATRIX-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- 3行×4列の二次元配列を定義
05 WS-TABLE.
10 WS-ROW OCCURS 3 TIMES.
15 WS-COL OCCURS 4 TIMES PIC X(05).
05 I PIC 9 VALUE 0.
05 J PIC 9 VALUE 0.
PROCEDURE DIVISION.
- データの初期化(代入)
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
PERFORM VARYING J FROM 1 BY 1 UNTIL J > 4
MOVE “DATA” TO WS-COL(I, J)
END-PERFORM
END-PERFORM.
- データの表示
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
DISPLAY “行番号:” I ” | ”
PERFORM VARYING J FROM 1 BY 1 UNTIL J > 4
DISPLAY ” 列” J “:” WS-COL(I, J)
END-PERFORM
END-PERFORM.
STOP RUN.
応用・注意点
現場で最も注意すべきは「添字の範囲外参照」です。OCCURSで定義した回数を超えて添字を指定すると、メモリ上の別の領域を破壊し、予期せぬバグを引き起こします。
- ガード条件の徹底:ループの終了条件(UNTIL)は、必ずOCCURSで指定した回数と一致させてください。
- パフォーマンス:極端に巨大な二次元配列を定義する場合、メモリ消費量に注意が必要です。必要最小限のサイズに留めるのがCOBOLプログラマの嗜みです。
- 可読性:添字が3つ以上重なる多次元配列は可読性が極端に落ちます。その場合は、データ構造を見直すか、コメントを詳細に記述して意図を明確にしましょう。

コメント