導入:なぜSEARCH文が重要なのか
COBOL開発の現場では、メモリ上に展開された配列(テーブル)から特定のデータを探し出す場面が頻繁にあります。ループ処理を自分で記述して指標(インデックス)を管理しても良いのですが、SEARCH文を使えば、コードが直感的になり、メンテナンス性も劇的に向上します。今回は、テーブルを先頭から順に検索する「順次検索」に焦点を当てて解説します。
基礎知識:テーブルと指標(Index)の仕組み
COBOLで配列を扱うにはOCCURS句を用いますが、その検索に欠かせないのがINDEXED BY句で定義した「指標」です。
指標は、通常の数値項目(PIC 9など)とは異なり、コンパイラがメモリ上のオフセットを直接計算するために最適化されたデータ形式です。SEARCH文はこの指標を内部的に操作するため、高速かつ安全にテーブルの要素へアクセスできるのです。
実装:SEARCH文の基本ロジック
SEARCH文は「どこを検索するか(テーブル名)」「見つからなかったらどうするか(AT END)」「何を探すか(WHEN句)」の3要素で構成されます。
検索が始まると、システムは指標を自動的に加算し、条件が成立するまで走査を続けます。条件に合致した時点で検索は終了し、その時の指標値が保持されるため、後続処理で該当データの詳細を参照するのも容易です。
サンプルプログラム
以下のコードは、社員コードを検索して一致した名前を表示する実用的な例です。コピー&ペーストして、環境に合わせて調整してください。
IDENTIFICATION DIVISION.
PROGRAM-ID. SEARCH-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- テーブル定義:指標としてIDX1を指定
01 WS-TABLE.
05 WS-ITEM OCCURS 3 TIMES INDEXED BY IDX1.
10 WS-CODE PIC X(02).
10 WS-NAME PIC X(10).
PROCEDURE DIVISION.
- テストデータの格納
MOVE “A1” TO WS-CODE(1) MOVE “TANAKA” TO WS-NAME(1).
MOVE “B2” TO WS-CODE(2) MOVE “SATO” TO WS-NAME(2).
MOVE “C3” TO WS-CODE(3) MOVE “SUZUKI” TO WS-NAME(3).
- 検索処理:B2を探す
SET IDX1 TO 1.
SEARCH WS-ITEM
AT END
DISPLAY “該当データは見つかりませんでした。”
WHEN WS-CODE(IDX1) = “B2”
DISPLAY “見つかりました: ” WS-NAME(IDX1)
END-SEARCH.
STOP RUN.
応用・注意点:現場で陥りやすい罠
1. 指標の初期化忘れ:SEARCH文を実行する前に、必ずSET文で指標を初期値(通常は1)に設定してください。これを忘れると、前回の検索時の位置から検索が始まってしまうバグを引き起こします。
2. 全件検索のコスト:順次検索は先頭から順に調べるため、テーブルが巨大な場合は処理時間がかかります。件数が多い場合は、SEARCH ALL文(二分探索)への切り替えを検討しましょう。
3. 条件の複数指定:WHEN句は複数記述することも可能です。複雑な条件が必要な場合は、AND/ORを組み合わせて柔軟に対応してください。
ベテランの知恵として、SEARCH文を使う際は「見つからなかった時」の処理(AT END)を必ず書く癖をつけてください。想定外のデータが来た時にプログラムが暴走するのを防ぐ、安全策の基本です。

コメント