【COBOL学習|実務向け】SEARCH ALLの「AND条件」制約を正しく理解し、高速検索を使いこなす

1. 導入:なぜSEARCH ALLの条件制限を知る必要があるのか

COBOLのバッチ処理において、テーブル検索は避けて通れない処理です。特に数万件を超えるような大きなテーブルを扱う場合、逐次検索を行うSEARCH文では処理時間が許容できないことがあります。そこで登場するのが、二分探索(バイナリサーチ)を行うSEARCH ALL文です。しかし、この命令には「WHEN句の条件はANDでしか結合できない」という非常に重要な制約があります。この仕様を理解せずに設計を行うと、予期せぬバグやパフォーマンス劣化を招くため、技術者として正確に押さえておく必要があります。

2. 基礎知識:SEARCH ALLと二分探索の仕組み

SEARCH ALLは、テーブル内のキー項目を特定の手順で絞り込むことで、検索効率を飛躍的に高めます。このアルゴリズムは、キーが昇順または降順にソートされていることを前提とし、データを半分ずつに分割して探す「二分探索」に基づいています。
なぜOR条件が使えないのか?それは、検索対象のキーが一つに定まらないと、二分探索の分岐(「現在の値より大きいか、小さいか」の判断)が成立しなくなるからです。AND条件のみに限定することで、複合キーであっても一つの値として比較可能になり、高速な検索が実現されています。

3. 実装/解決策:AND条件での複数キー指定

SEARCH ALLで複数条件を指定する場合、キー項目を定義するOCCURS句に、ASCENDING KEY(またはDESCENDING KEY)を正しく指定する必要があります。複数キーを指定する場合、定義した順序が検索の優先順位(左から右へ)となるため、注意が必要です。

4. サンプルプログラム:複数キーでの高速検索

以下は、得意先コードと商品コードをキーにして、該当する単価を検索する実務的な例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. SEARCH-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 TBL-DATA.
05 TBL-ITEM OCCURS 100 TIMES ASCENDING KEY IS TBL-CUST-CD TBL-PROD-CD INDEXED BY TBL-IDX.
10 TBL-CUST-CD PIC X(05).
10 TBL-PROD-CD PIC X(05).
10 TBL-PRICE PIC 9(07).

PROCEDURE DIVISION.
> 検索キーの設定
SET TBL-CUST-CD TO “C0001”
SET TBL-PROD-CD TO “P9999”

> SEARCH ALLによる二分探索の実行
SEARCH ALL TBL-ITEM
WHEN TBL-CUST-CD(TBL-IDX) = “C0001”
AND TBL-PROD-CD(TBL-IDX) = “P9999”
DISPLAY “単価は: ” TBL-PRICE(TBL-IDX)
WHEN OTHER
DISPLAY “該当データなし”
END-SEARCH.

5. 応用・注意点:現場で役立つ回避策と設計上のヒント

現場で「どうしてもOR条件で検索したい」という要件に直面することがあります。その場合、以下の戦略を検討してください。

(1) キーを連結する
複数のキーを一つの項目として定義し直す方法です。例えば「CUST-CD(5桁)」+「PROD-CD(5桁)」を「SEARCH-KEY(10桁)」として連結し、SEARCH ALLを一回で済ませます。これはメモリ効率も良く、非常に高速です。

(2) 検索ロジックの分離
OR条件が必須であれば、SEARCH ALLを諦めて、テーブルをあらかじめソート済みのファイルとして用意し、外部ファイルからの読み込みや、インデックス付きファイル(VSAM等)の利用を検討してください。

(3) 注意点
SEARCH ALLを使用する際、テーブルが定義通りにソートされていないと、検索結果が「該当なし」になったり、誤ったレコードを返したりします。テーブルロード時には必ずSORTを行うか、昇順であることを保証する設計を徹底してください。この基本を忘れると、デバッグが困難な重大な障害に繋がります。

コメント

タイトルとURLをコピーしました