SEARCH ステートメントは、指定した条件を満たすエレメントに関してテーブルを 検索します。そして、そのエレメントを指すように関連する指標を調整します。
フォーマット 1: 逐次探索の SEARCH ステートメント >>-SEARCH--ID-1--+-----------------------+----------------------> '-VARYING--+-ID-2-----+-' '-指標名-1--' >--+---------------------------------+------------------------> '-+----+--END--命令ステートメント-1-' '-AT-' .----------------------------------------. V | >----WHEN--条件-1--+-命令ステートメント-2-+-+--+------------+-->< '-NEXT-SENTENCE-----' '-END-SEARCH-'
フォーマット 2: 二分探索の SEARCH ステートメント >>-SEARCH ALL--ID-1--+-----------------------------------+------> '-+----+--END----命令ステートメント-1-' '-AT-' >--WHEN--+-データ名-1--+----+--+-EQUAL--+----+-+--+-ID-3-------+-+--> | '-IS-' | '-TO-' | +-リテラル-1-+ | | '-=-------------' '-算術式-1---' | '-条件名-1----------------------------------------------' .--------------------------------------------------------------------. V | >----+----------------------------------------------------------------+-+--> '-AND--+-データ名-2---+----+--+-EQUAL--+----+-+--+-ID-4-------+-+-' | '-IS-' | '-TO-' | +--リテラル-2-+ | | '-=-------------' '--算術式-2---' | '-条件名-2----------------------------------------------' >--+--命令ステートメント-2--+--+------------+-------------------->< '-NEXT SENTENCE--------' '-END-SEARCH-'
検索したいテーブルがソートされていない場合は、フォーマット 1 (逐次探索) を使用 してください。テーブルを逐次探索する場合、あるいは添え字または指標を制御したいときにソート済みのテーブルを検索する場合も、フォーマット 1 を使用します。
テーブル内の全オカレンスを効率的に検索したい場合は、フォーマット 2 (二分探索) を使用してください。このテーブルは、前もってソートしておく必要があります。
ID-1 のデータ記述項目には、OCCURS 節を含めなければなりません。
ID-1 のデータ記述項目には、INDEXED BY 句を指定した OCCURS 節を含める必要がありますが、テーブルの検索は、適切に記述された別のテーブルに対して定義された指標を使用して行うことができます。
ID-1 は、OCCURS 節を指定して記述されているデータ項目に従属するデータ項目を参照できます (つまり、ID-1 は多次元テーブル内の従属テーブルにすることができます)。この場合、データ記述項目では、 テーブルの各次元に対して INDEXED BY 句を指定する必要があります。
ID-1 は、添え字付きまたは参照変更にすることができません。
逐次探索の実行に先立って、ID-1 に関連付けられた最初の(または唯一の) 指標 (検索指標) の値を、検索対象の最初のオカレンスを示すように設定しておく必要が あります。
多次元テーブルに逐次探索を使用するときには、従属次元ごとに指標の値を設定しておくことも必要です。
SEARCH ステートメントは、検索指標の中の値のみを変更します。VARYING 句が指定されている場合には、指標名-1 または ID-2 の値も変更します。 したがって、2 次元から 7 次元のテーブルの全体を検索するには、 各次元で SEARCH ステートメントを実行する必要があります。WHEN 句の中で、すべての次元について指標を設定しておかなければなりません。SEARCH ステートメントの実行に先立って、関連する指標を SET ステートメントを使用して初期化しておく必要があります。
SEARCH ステートメントは、現在検索指標が設定されている位置から逐次探索を実行します。
検索が開始されると、ID-1 に関連付けられた指標の値が、 可能なオカレンス項目数の最高値よりも大きくない限り、以下のような処置が取られます。
検索が開始されたときに、ID-1 に関連付けられた指標名の値が可能なオカレンス番号よりも大きい場合は、検索はただちに終了します。
検索が終了するときに、AT END 句が指定されていると、命令ステートメント-1 が実行されます。AT END 句が省略されていると、 制御は SEARCH ステートメントの後にある次のステートメントに渡されます。
例: 多次元逐次探索
以下のコーディングの断片は、従属テーブル (テーブル R) 内の 3 番目のオカレンスの中の次元 (テーブル C) の検索を示しています。
. . .
Working-storage section.
1 G.
2 R occurs 10 indexed by Rindex.
3 C occurs 10 ascending key X indexed by Cindex.
4 X pic 99.
1 Arg pic 99 value 34.
Procedure division.
. . .
* To search within occurrence 3 of table R, set its index to 3
* To search table C beginning at occurrence 1, set its index to 1
Set Rindex to 3
Set Cindex to 1
* In the SEARCH statement, specify C without indexes
Search C
* Specify indexes for both dimensions in the WHEN phrase
when X(Rindex Cindex) = Arg
display "Found " X(Rindex Cindex)
End-search
. . .
VARYING 指標名-1 句が省略された場合には、ID-1 最初の (または唯一の) 指標名が、検索のために使用されます。
INDEXED BY 句の指定のないテーブルを検索するために指標付けが使用される場合、 指標付きで定義されたテーブルと指標なしで定義されたテーブルの両方が 同じ長さのテーブル・エレメントを持ち、また同じ数のオカレンスを持つときに限り、 正しい結果が保証されます。
VARYING 句の対象が別のテーブル・エレメントの指標名のときには、1 つの逐次 SEARCH ステートメントは、一度に 2 つのテーブル・エレメントに適用されます。
ID-1 のデータ記述項目には、INDEXED BY 句と KEY IS 句を指定した OCCURS 節を含めなければなりません。
ID-1 は、OCCURS 節を含むデータ項目に従属するデータ項目を参照できます (つまり、ID-1 は多次元テーブル内の従属テーブルにすることができます)。この場合、データ記述項目では、 テーブルの各次元に対して INDEXED BY 句を指定する必要があります。
ID-1 は、添え字付きまたは参照変更にすることができません。
SEARCH ALL ステートメントは、二分探索を使用して実行されます。ID-1 に関連付けられた指標 (検索指標) は、SET ステートメントで初期化する必要はありません。どのような場合でも、検索指標の値が最初のテーブル・エレメントの値より小さくなることや、最後のテーブル・エレメントの値より大きくなることがないように、検索指標は検索操作中に変更されます。使用される指標は、必ず OCCURS 節で指定された最初の指標名に関連した指標です。
多次元テーブルに二分探索を使用するときには、事前に SET ステートメントを実行して、従属次元ごとに指標の値を設定しておく必要があります。
SEARCH ステートメントは、検索指標の中の値のみを変更します。したがって、2 次元から 7 次元のテーブルの全体を検索するには、 各次元で SEARCH ステートメントを実行する必要があります。WHEN 句の中で、すべての次元について指標を設定しておかなければなりません。
WHEN 条件を満たさずに検索が終了した場合に AT END 句が指定されていれば、命令ステートメント-1 が実行されます。AT END 句が省略されていると、 制御は SEARCH ステートメントの後にある次のステートメントに渡されます。
SEARCH ALL 処理の結果を予測できるのは、次の場合に限ります。
WHEN 句に比較条件が指定されている場合、その比較の評価はデータ名-1 が参照 するデータ項目の USAGE に基づきます。検索引数は、データ名-1 と同じ USAGE を持つ一時データ項目へ移され、SEARCH に関連する比較演算にはこの一時データ 項目が使用されます。
WHEN 句において、この句の中にある指標のどの設定値についても条件を満たすことができない場合には、 検索は失敗に終わります。この場合には、制御は、AT END 句の指定があればその命令ステートメント-1 に渡されるか、 または SEARCH ステートメントの後にある次のステートメントに渡されます。どちらの場合も、指標の最終的な設定値は予測できません。
WHEN 句の中で条件を満たすことができた場合には、制御は、命令ステートメン ト-2 の指定があればそれに渡されるか、または NEXT SENTENCE 句の指定があれ ば、次の実行可能文に渡されます。この場合の指標には、WHEN 条件を満たすことができた発生項目を指示する値が入っています。
命令ステートメント-2 が実行された場合、命令ステートメント-2 が GO TO ステ ートメントで終わっていなければ、SEARCH ステートメントの終わりに制御が渡さ れます。
ID-3、リテラル-1、または算術式-1 と比較するために、データ名-1 は、比較の規則に従う有効なオペランドでなければなりません。
ID-4、リテラル-2、または算術式-2 と比較するために、データ名-2 は、比較の規則に従う有効なオペランドでなければなりません。
データ名-1 とデータ名-2 は、以下を参照することはできません。
ID-3 および ID-4 は、POINTER、FUNCTION-POINTER、 PROCEDURE-POINTER、または OBJECT REFERENCE の使用で定義されたデータ項目にはできません。
ID-3 および ID-4 はウィンドウ表示日付フィールドにはできません。
ID-3 またはリテラル-1 がクラス国別の場合は、データ名-1 のクラスを国別にする必要があります。
ID-4 またはリテラル-2 がクラス国別の場合は、データ名-2 のクラスを国別にする必要があります。
WHEN 句の中で ASCENDING KEY データ項目または DESCENDING KEY データ項目を明示的もしくは暗黙的に指定する場合は、ID-1 に対するすべての先行する ASCENDING KEY データ名または DESCENDING KEY データ名も指定しなければなりません。
指標データ項目は、添え字として使用することはできません。 それらに対する直接参照に制限があるためです。
可変長テーブルに対して SEARCH ステートメントを正しく実行するためには、 OCCURS DEPENDING ON 節 (データ名-1) のオブジェクトに、 テーブルの現在の長さを示す値が含まれるようにする必要があります。
SEARCH ステートメントの範囲は、次のいずれかによって終了することができます。
命令ステートメント-1 または命令ステートメント-2 が実行された場合、これらのス テートメントが GO TO ステートメントで終わっていなければ、SEARCH ステート メントの終わりに制御が渡されます。
AT END 句の機能は、逐次探索および二分探索で同じです。
NEXT SENTENCE では、最も近い分離文字ピリオドの後の最初のステートメントに 制御が移されます。
NEXT SENTENCE を END-SEARCH と共に指定すると、END-SEARCH の後のステートメントに制御が 渡されるのではなく、最も近い後続のピリオドの後のステートメントに制御が渡されます。
フォーマット-2 SEARCH ALL ステートメントの場合は、命令ステートメント-2 も NEXT SENTENCE も必要ありません。それらがなくても、 SEARCH ステートメントは、指標をその条件と一致したテーブルにある値に設定します。
NEXT SENTENCE 句の機能は、逐次探索および二分探索で同じです。
この明示的範囲終了符号は、SEARCH ステートメントの範囲を区切るために使用されます。 END-SEARCH 句を使用することによって、 条件的な SEARCH ステートメントを他の条件ステートメント内にネストすることができます。
詳しくは、範囲区切りステートメントを参照してください。
END-SEARCH 句の機能は、逐次探索および二分探索で同じです。