導入
COBOL開発において、大量のデータを効率的に処理するための「テーブル処理」は避けて通れません。特に、同じデータ構造を持つ項目を複数管理する場合、個別に変数を定義するのは非効率です。ここで登場するのがOCCURS句です。これを使いこなすことで、プログラムの可読性が向上するだけでなく、ループ処理による一括データ加工が可能となり、保守性の高いコードを実現できます。今回は、実務で頻出する一次元配列の制御について深掘りします。
基礎知識
OCCURS句は、同一のデータ項目を連続したメモリ領域に複数定義するための命令です。
添字(Subscript)の概念が非常に重要で、COBOLでは通常「1」から始まります。例えば、「OCCURS 50 TIMES」と定義した場合、プログラムからは1番目から50番目までの領域としてアクセス可能です。内部的には、指定されたサイズ×回数のメモリが連続して確保されるため、ポインタ計算に近い効率的なアクセスが保証されています。
実装/解決策
実務では、単に定義するだけでなく、INDEXED BY句(インデックス)を併用することをお勧めします。通常の数値変数を添字にするよりも、コンパイル時に最適化が効きやすく、パフォーマンス面で有利になるケースが多いからです。また、配列を初期化する際は、MOVE文を単体で使うよりも、PERFORM文と組み合わせて制御するのが鉄則です。
サンプルプログラム
以下のコードは、10個の売上データを配列に格納し、合計値を算出する実務的なサンプルです。
01 WS-WORK-AREA.
03 WS-SALES-TABLE.
05 WS-SALES-AMT PIC 9(07) OCCURS 10 TIMES INDEXED BY I-IDX.
03 WS-TOTAL-AMT PIC 9(09) VALUE 0.
03 WS-I PIC 9(02).
- — 処理部 —
PERFORM VARYING I-IDX FROM 1 BY 1 UNTIL I-IDX > 10
- 配列に値をセット(テスト用)
MOVE 1000 TO WS-SALES-AMT(I-IDX)
- 合計値の加算
ADD WS-SALES-AMT(I-IDX) TO WS-TOTAL-AMT
END-PERFORM.
応用・注意点
現場で最も注意すべきは「添字の範囲外参照(Index Out of Range)」です。COBOLコンパイラや実行環境によっては、配列の範囲を超えてアクセスしてもエラーにならず、隣接するメモリ領域を破壊する重大なバグを引き起こすことがあります。
回避策のポイント:
1. 添字の範囲チェックを意識し、PERFORM VARYINGループの終了条件を厳密に設定すること。
2. 可能な限り SEARCH 文(バイナリサーチまたはリニアサーチ)を活用し、添字を直接操作する機会を減らすこと。
3. 複雑なデータ構造になる場合は、REDEFINES句を併用して、配列全体を一括クリアする領域を確保しておくと、初期化漏れを防ぐことができます。
これらの基本を確実に押さえることで、堅牢な基幹システムを支えるコードを書くことができます。ぜひ現場のコードで活用してください。

コメント