Rational Developer for System z
COBOL for Windows バージョン 7.5 言語解説書


SEARCH ステートメント

SEARCH ステートメントは、指定した条件を満たすエレメントに関してテーブルを検索します。そして、そのエレメントを指すように関連する指標を調整します。

フォーマット 1: 逐次探索
構文図を読む構文図をスキップする>>-SEARCH--ID-1--+-----------------------+---------------------->
                 '-VARYING--+-ID-2-----+-'  
                            '-指標名-1-'    
 
>--+-----------------------------------+------------------------>
   '-+----+--END--命令ステートメント-1-'  
     '-AT-'                               
 
   .----------------------------------------.                  
   V                                        |                  
>----WHEN--条件-1--+-命令ステートメント-2-+-+--+------------+--><
                   '-NEXT-SENTENCE--------'    '-END-SEARCH-'  
 

フォーマット 2: 二分探索
構文図を読む構文図をスキップする>>-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 (逐次探索)
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 に関連付けられた指標の値が、可能な出現数の最高値よりも大きくない限り、以下のような処置が取られます。

検索が開始されたときに、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
以下の処置のうちのどちらかが適用されます。

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

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

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

ID-2
指標データ項目または基本整数項目のいずれかでなければなりません。 ID-2 をウィンドウ化日付フィールドにすることはできません。 ID-2 に添え字として、ID-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 処理の結果を予測できるのは、次の場合に限ります。

WHEN 句 (二分探索)

WHEN 句に比較条件が指定されている場合、その比較の評価はデータ名-1 が参照するデータ項目の USAGE に 基づきます。 検索引数は、データ名-1 と同じ USAGE を持つ一時データ項目へ移され、SEARCH に関連する比較演算にはこの一時データ項目が 使用されます。 データ名-1 が数値項目である場合、一時データ項目は、 データ名-1 のデータ記述に符号があるかどうかによって、符号ありまたは符号なしになります。検索引数に符号があり、データ名-1 が符号なしである場合、比較を行う前に、 検索引数の符号は除去されます。

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 ステートメントの範囲は、次のいずれかによって終了することができます。

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 句の機能は、逐次探索および二分探索で同じです。

 

END-SEARCH 句

この明示的範囲終了符号は、SEARCH ステートメントの範囲を区切るために使用されます。 END-SEARCH 句を使用することによって、 条件的な SEARCH ステートメントを他の条件ステートメント内にネストすることができます。

詳しくは、範囲区切りステートメントを参照してください。

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


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

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