Rational Developer for System z
Enterprise COBOL for z/OS バージョン 4.1 言語解説書


SEARCH ステートメント

逐次探索

ID-1 (逐次探索)
ID-1 は検索されるテーブルを識別します。ID-1 は、このテーブル内のすべてのオカレンスを参照します。

ID-1 のデータ記述項目には、OCCURS 節を含めなければなりません。

ID-1 のデータ記述項目には、INDEXED BY 句を指定した OCCURS 節を含める必要がありますが、テーブルの検索は、適切に記述された別のテーブルに対して定義された指標を使用して行うことができます。

ID-1 は、OCCURS 節を指定して記述されているデータ項目に従属するデータ項目を参照できます (つまり、ID-1 は多次元テーブル内の従属テーブルにすることができます)。この場合、データ記述項目では、 テーブルの各次元に対して INDEXED BY 句を指定する必要があります。

ID-1 は、添え字付きまたは参照変更にすることができません。

AT END
ここには、 関連する WHEN 句の中にあるどの条件をも満たせずに検索処理が終了した場合に起こる条件を記述します。

逐次探索の実行に先立って、ID-1 に関連付けられた最初の(または唯一の) 指標 (検索指標) の値を、検索対象の最初のオカレンスを示すように設定しておく必要が あります。

多次元テーブルに逐次探索を使用するときには、従属次元ごとに指標の値を設定しておくことも必要です。

SEARCH ステートメントは、検索指標の中の値のみを変更します。VARYING 句が指定されている場合には、指標名-1 または ID-2 の値も変更します。 したがって、2 次元から 7 次元のテーブルの全体を検索するには、 各次元で SEARCH ステートメントを実行する必要があります。WHEN 句の中で、すべての次元について指標を設定しておかなければなりません。SEARCH ステートメントの実行に先立って、関連する指標を SET ステートメントを使用して初期化しておく必要があります。

SEARCH ステートメントは、現在検索指標が設定されている位置から逐次探索を実行します。

検索が開始されると、ID-1 に関連付けられた指標の値が、 可能なオカレンス項目数の最高値よりも大きくない限り、以下のような処置が取られます。

  • WHEN 句の中にある条件が、それらの記述された順に評価されます。
  • 条件が満たされない場合、ID-1 に対する指標は、次のテーブル・エレメントに対応するように増やされ、ステップ 1 が繰り返されます。
  • 評価を行って、WHEN 条件の 1 つが満たされた場合、検索は直ちに終了し、その条件に関連する命令ステートメント-2 が実行されます。指標は、条件を満たしたテーブル・エレメントを指しています。NEXT SENTENCE が指定されている場合、制御は最も近いピリオドの後のステートメントに渡されます。
  • WHEN 条件が満たされないままテーブルの終わりに達すると (つまり、増分していった指標の値が可能な最大オカレンス番号より大きくなった場合)、検索は終了します。

検索が開始されたときに、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
以下の処置のうちのどちらかが適用されます。
  • 指標名-1 が、ID-1 の指標である場合、この指標が検索で使用されます。それ以外の場合は、最初の (または唯一の) 指標名が使用されます。
  • 指標名-1 が、 他のテーブル・エレメントの指標である場合には、ID-1 のための最初の (または唯一の) 指標名が検索で使用されます。指標名-1 が示すオカレンス項目数は、検索指標名の増加分と同じだけ、かつ同時に増加します。

VARYING 指標名-1 句が省略された場合には、ID-1 最初の (または唯一の) 指標名が、検索のために使用されます。

INDEXED BY 句の指定のないテーブルを検索するために指標付けが使用される場合、 指標付きで定義されたテーブルと指標なしで定義されたテーブルの両方が 同じ長さのテーブル・エレメントを持ち、また同じ数のオカレンスを持つときに限り、 正しい結果が保証されます。

VARYING 句の対象が別のテーブル・エレメントの指標名のときには、1 つの逐次 SEARCH ステートメントは、一度に 2 つのテーブル・エレメントに適用されます。

ID-2
指標データ項目または基本整数項目のいずれかでなければなりません。 ID-2 をウィンドウ表示日付フィールドにすることはできません。 ID-2 に添え字として、ID-1 に対して指定した最初の (または唯一の) 指標名を付けることはできません。検索時には、次のどちらかの処置が取られます。
  • ID-2 が指標データ項目である場合には、検索指標が増えるたびに、 指定された指標データ項目が、同時に同じ量だけ増えます。
  • ID-2 が整数データ項目である場合には、検索指標が増えるたびに、 指定されたデータ項目が、同時に 1 だけ増えます。

WHEN 句 (逐次探索)

条件-1
条件式に説明してある条件ならばどの条件でも使用できます。

以下の図は、2 つの WHEN 句を含むフォーマット 1 の SEARCH ステートメントによる処理を示したものです。

この図は、1 つの SEARCH WHEN 句のみが選択された場合を示しています。検索によって満たされる WHEN 句がない場合は、AT END 句が選択されます。

二分探索

ID-1 (二分探索)
ID-1 は検索されるテーブルを識別します。ID-1 は、このテーブル内のすべてのオカレンスを参照します。

ID-1 のデータ記述項目には、INDEXED BY 句と KEY IS 句を指定した OCCURS 節を含めなければなりません。

ID-1 は、OCCURS 節を含むデータ項目に従属するデータ項目を参照できます (つまり、ID-1 は多次元テーブル内の従属テーブルにすることができます)。この場合、データ記述項目では、 テーブルの各次元に対して INDEXED BY 句を指定する必要があります。

ID-1 は、添え字付きまたは参照変更にすることができません。

AT END
ここには、WHEN 句で指定された条件を満たせずに検索操作が終了した場合に起こる条件を記述します。

SEARCH ALL ステートメントは、二分探索を使用して実行されます。ID-1 に関連付けられた指標 (検索指標) は、SET ステートメントで初期化する必要はありません。どのような場合でも、検索指標の値が最初のテーブル・エレメントの値より小さくなることや、最後のテーブル・エレメントの値より大きくなることがないように、検索指標は検索操作中に変更されます。使用される指標は、必ず OCCURS 節で指定された最初の指標名に関連した指標です。

多次元テーブルに二分探索を使用するときには、事前に SET ステートメントを実行して、従属次元ごとに指標の値を設定しておく必要があります。

SEARCH ステートメントは、検索指標の中の値のみを変更します。したがって、2 次元から 7 次元のテーブルの全体を検索するには、 各次元で SEARCH ステートメントを実行する必要があります。WHEN 句の中で、すべての次元について指標を設定しておかなければなりません。

WHEN 条件を満たさずに検索が終了した場合に AT END 句が指定されていれば、命令ステートメント-1 が実行されます。AT END 句が省略されていると、 制御は SEARCH ステートメントの後にある次のステートメントに渡されます。

SEARCH ALL 処理の結果を予測できるのは、次の場合に限ります。

  • テーブルの中のデータが、ASCENDING KEY または DESCENDING KEY の順に並んでいる場合。
  • WHEN 節の中に指定された ASCENDING KEY または DESCENDING KEY の内容が、 固有のテーブル参照を提供する場合。

WHEN 句 (二分探索)

WHEN 句に比較条件が指定されている場合、その比較の評価はデータ名-1 が参照 するデータ項目の USAGE に基づきます。検索引数は、データ名-1 と同じ USAGE を持つ一時データ項目へ移され、SEARCH に関連する比較演算にはこの一時データ 項目が使用されます。

WHEN 句において、この句の中にある指標のどの設定値についても条件を満たすことができない場合には、 検索は失敗に終わります。この場合には、制御は、AT END 句の指定があればその命令ステートメント-1 に渡されるか、 または SEARCH ステートメントの後にある次のステートメントに渡されます。どちらの場合も、指標の最終的な設定値は予測できません。

WHEN 句の中で条件を満たすことができた場合には、制御は、命令ステートメン ト-2 の指定があればそれに渡されるか、または NEXT SENTENCE 句の指定があれ ば、次の実行可能文に渡されます。この場合の指標には、WHEN 条件を満たすことができた発生項目を指示する値が入っています。

命令ステートメント-2 が実行された場合、命令ステートメント-2 が GO TO ステ ートメントで終わっていなければ、SEARCH ステートメントの終わりに制御が渡さ れます。

条件名-1条件名-2
指定する条件名はそれぞれ、単一値のみを持ち、このテーブル・エレメントに対して ASCENDING KEY または DESCENDING KEY データ項目と関連付けられている必要があります。
データ名-1データ名-2
ID-1 によって参照されるテーブル・エレメントの中で ASCENDING KEY または DESCENDING KEY データ項目を指定する必要があり、また、ID-1 に関連した最初の指標名で添え字付けされていなければなりません。それぞれのデータ名は、修飾することができます。

ID-3リテラル-1、または算術式-1 と比較するために、データ名-1 は、比較の規則に従う有効なオペランドでなければなりません。

ID-4リテラル-2、または算術式-2 と比較するために、データ名-2 は、比較の規則に従う有効なオペランドでなければなりません。

データ名-1データ名-2 は、以下を参照することはできません。

  • 浮動小数点データ項目
  • 可変オカレンス・データ項目を含むグループ項目
  • ウィンドウ表示日付フィールド
ID-3ID-4
ID-1 の ASCENDING KEY または DESCENDING KEY データ項目にしてはなりません。また、ID-1 の最初の指標名で添え字付けされた項目にすることもできません。

ID-3 および ID-4 は、POINTER、FUNCTION-POINTER、 PROCEDURE-POINTER、または OBJECT REFERENCE の使用で定義されたデータ項目にはできません。

ID-3 および ID-4 はウィンドウ表示日付フィールドにはできません。

ID-3 またはリテラル-1 がクラス国別の場合は、データ名-1 のクラスを国別にする必要があります。

ID-4 またはリテラル-2 がクラス国別の場合は、データ名-2 のクラスを国別にする必要があります。

リテラル-1リテラル-2
データ名-1 またはデータ名-2 との比較では、リテラル-1 またはリテラル-2 が有効なオペランドでなければなりません。
算術式
算術式で定義された式のいずれかにできますが、以下の制限があります。算術式 における ID は、ID-1 の ASCENDING KEY または DESCENDING KEY データ項目、または ID-1 の最初の指標名が添え字付けする項目にはしないでください。

WHEN 句の中で ASCENDING KEY データ項目または DESCENDING KEY データ項目を明示的もしくは暗黙的に指定する場合は、ID-1 に対するすべての先行する ASCENDING KEY データ名または DESCENDING KEY データ名も指定しなければなりません。

SEARCH ステートメントに関する考慮事項

指標データ項目は、添え字として使用することはできません。 それらに対する直接参照に制限があるためです。

可変長テーブルに対して SEARCH ステートメントを正しく実行するためには、 OCCURS DEPENDING ON 節 (データ名-1) のオブジェクトに、 テーブルの現在の長さを示す値が含まれるようにする必要があります。

SEARCH ステートメントの範囲は、次のいずれかによって終了することができます。

  • ネスト構造で同じレベルにある END-SEARCH 句。
  • 分離文字ピリオド。
  • 先行する IF ステートメントに関連する ELSE 句または END-IF 句。

AT END 句および WHEN 句

命令ステートメント-1 または命令ステートメント-2 が実行された場合、これらのス テートメントが GO TO ステートメントで終わっていなければ、SEARCH ステート メントの終わりに制御が渡されます。

AT END 句の機能は、逐次探索および二分探索で同じです。

NEXT SENTENCE

NEXT SENTENCE では、最も近い分離文字ピリオドの後の最初のステートメントに 制御が移されます。

NEXT SENTENCE を END-SEARCH と共に指定すると、END-SEARCH の後のステートメントに制御が 渡されるのではなく、最も近い後続のピリオドの後のステートメントに制御が渡されます。

フォーマット-2 SEARCH ALL ステートメントの場合は、命令ステートメント-2 も NEXT SENTENCE も必要ありません。それらがなくても、 SEARCH ステートメントは、指標をその条件と一致したテーブルにある値に設定します。

NEXT SENTENCE 句の機能は、逐次探索および二分探索で同じです。


ご利用条件 | フィードバック

このインフォメーション・センターでは Eclipse テクノロジーが採用されています。(http://www.eclipse.org)