1. 導入:なぜ今、OCCURS句を正しく理解すべきなのか
COBOL開発において、同一形式のデータを効率的に管理するための「OCCURS句」は避けて通れない基本機能です。しかし、実務では単に配列を定義するだけではなく、メモリ効率や添字の範囲外参照(バッファオーバーランに相当するエラー)への対策が不可欠です。本稿では、レガシーシステムの保守や新機能開発において、読みやすくバグの出にくい配列運用のポイントを解説します。
2. 基礎知識:OCCURS句の仕組みと制約
OCCURS句は、同じ項目をメモリ上に連続して配置する仕組みです。C言語などの配列に相当します。
注意すべき重要な制約として、01レベル(レコードの最上位)や77レベル(独立項目)には指定できません。必ず02レベル以下の従属項目として定義する必要があります。参照時は「データ名(添字)」と記述しますが、COBOLの添字は1から始まるという点に注意が必要です(0からではありません)。
3. 実装と解決策:インデックスと添字の使い分け
実務では、単なる添字(SUBSCRIPT)の使用だけでなく、INDEXED BY句を用いた「指標(INDEX)」の使用を推奨します。指標を使用すると、コンパイラがメモリ上のオフセットを直接計算するため、処理速度が向上するケースがあります。また、検索処理にはSEARCH文を組み合わせることで、ロジックの可読性が格段に上がります。
4. サンプルプログラム:実務で使える配列定義とSEARCH文
以下は、都道府県名(47項目)を定義し、目的の名称を検索する実用的なサンプルコードです。
05 WS-CITY-ITEM OCCURS 47 TIMES INDEXED BY CITY-IDX.
10 WS-CITY-CODE PIC X(02).
10 WS-CITY-NAME PIC X(20).
- — 検索処理の例 —
SET CITY-IDX TO 1.
SEARCH WS-CITY-ITEM
AT END
DISPLAY ‘該当なし’
WHEN WS-CITY-NAME(CITY-IDX) = ‘東京都’
DISPLAY ‘見つかりました。コードは: ‘ WS-CITY-CODE(CITY-IDX)
END-SEARCH.
5. 応用・注意点:現場で陥りやすいバグの回避
実務で最も恐ろしいのは「添字の範囲外参照」です。
・添字の境界チェック
OCCURS 47 TIMESと定義した場合、添字は必ず1から47の間である必要があります。ループ処理(PERFORM VARYING)を行う際は、必ず最大値を超えないよう範囲を明示してください。
・初期化の徹底
配列を再利用する場合、前の処理のデータが残っていることがよくあります。新しいデータをセットする前には、必ずINITIALIZE文で配列全体をクリアする癖をつけましょう。
・可変長配列(OCCURS … DEPENDING ON)
データ数が可変の場合はDEPENDING ON句を使用しますが、その際は「データ件数」を格納する項目が正しく更新されているかを常に監視してください。ここが不整合を起こすと、後続の集計処理で致命的なバグを誘発します。
基本を疎かにせず、堅牢なデータ構造を設計することが、長く愛されるシステムを作る唯一の近道です。

コメント