1. 導入:なぜSEARCH文の「自動増分」が重要なのか
COBOLのプログラムでテーブル(配列)を扱う際、皆さんはどのようにデータを探していますか?もし、PERFORM文でカウンタ変数を自分で管理し、IF文で一つずつチェックしているなら、それは少し「遠回り」かもしれません。COBOLには、テーブル検索のために最適化された「SEARCH文」という強力な武器があります。特に、指標を自動的に動かしてくれる仕組みを理解すれば、コードを短く、かつバグの少ないスッキリとしたものに書き換えることができます。
2. 基礎知識:SEARCH文と「指標(INDEX)」の仕組み
SEARCH文を理解する上で欠かせないのが「指標(INDEX)」です。通常の添字(SUB)とは異なり、指標はメモリ上のオフセット値を保持する特殊なデータ型です。
OCCURS句で「INDEXED BY」を指定することで、コンパイラがそのテーブル専用の「現在位置を指し示すポインタ」を用意してくれます。SEARCH文を実行すると、このポインタが自動的にインクリメント(+1)され、指定した条件に合致するまで検索が続きます。これにより、プログラマが「加算処理」を記述し忘れて無限ループに陥るリスクを根本から排除できるのです。
3. 実装と解決策
SEARCH文を正しく使うためのポイントは「AT END句」と「WHEN条件」の組み合わせです。
SEARCH文は、条件に合致するデータが見つかるまで自動で指標を進めます。もし最後まで見つからなかった場合は「AT END」に記述した処理を実行して終了します。これにより、検索失敗時のエラー処理までをワンセットで記述でき、非常に読みやすいロジックになります。
4. サンプルプログラム
以下のコードは、社員番号をキーにしてテーブルを検索し、該当する部署名を取得する例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. SEARCH-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TBL-DATA.
05 WS-TBL-ENTRY OCCURS 5 TIMES INDEXED BY IDX.
10 WS-EMP-ID PIC X(04).
10 WS-DEPT-NAME PIC X(10).
01 WS-SEARCH-KEY PIC X(04) VALUE ‘0003’.
01 WS-RESULT PIC X(10).
PROCEDURE DIVISION.
> テーブルに初期値をセット(説明のため簡易的に)
MOVE ‘0001’ TO WS-EMP-ID(1). MOVE ‘営業部’ TO WS-DEPT-NAME(1).
MOVE ‘0002’ TO WS-EMP-ID(2). MOVE ‘人事部’ TO WS-DEPT-NAME(2).
MOVE ‘0003’ TO WS-EMP-ID(3). MOVE ‘開発部’ TO WS-DEPT-NAME(3).
> 指標の初期化(重要:検索前に必ず1にする)
SET IDX TO 1.
> SEARCH文による検索開始
SEARCH WS-TBL-ENTRY
AT END
DISPLAY ‘該当データはありませんでした。’
WHEN WS-EMP-ID(IDX) = WS-SEARCH-KEY
MOVE WS-DEPT-NAME(IDX) TO WS-RESULT
DISPLAY ‘検索成功!部署名:’ WS-RESULT
END-SEARCH.
STOP RUN.
5. 応用と注意点:現場で陥りやすい罠
ベテランとして一つだけ忠告しておきたいのは、「指標の初期化」忘れです。SEARCH文は現在の指標の位置から検索を開始するため、前回の処理で指標が末尾まで進んだままだと、正しく検索できません。必ず検索前に「SET IDX TO 1」でリセットする癖をつけてください。
また、もしテーブルの件数が数万件を超えるような大規模な検索を行う場合は、SEARCH文ではなく「SEARCH ALL」文(二分探索)を使うのが定石です。SEARCH ALLを使うには「KEY IS」句の指定が必要ですが、処理速度が桁違いに速くなります。まずは通常のSEARCH文で動きをマスターしてから、SEARCH ALLへのステップアップを目指してくださいね。

コメント