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


PERFORM ステートメント

PERFORM ステートメントは、1 つまたは複数のプロシージャーに明示的に制御を 移し、指定されたプロシージャーの実行終了後に、PERFORM ステートメントの次 の実行可能ステートメントに暗黙的に制御を戻します。

PERFORM ステートメントは、次のいずれかになります。

行外 PERFORM ステートメント
プロシージャー名-1 が指定されたとき。
行内 PERFORM ステートメント
プロシージャー名-1 が省略されたとき。

行内 PERFORM ステートメントは、END-PERFORM 句によって区切る必要があります。

行内フォーマットと行外フォーマットを合わせて使用することはできません。 例えば、プロシージャー名-1 を指定した場合、 命令ステートメントと END-PERFORM 句は指定できません。

PERFORM ステートメントのフォーマットには、次の 4 種類があります。

基本 PERFORM ステートメント

基本 PERFORM ステートメント内で参照されるプロシージャー (単数または複数) が 1 回実行されると、 制御は PERFORM ステートメントの後続の次の実行可能ステートメントに渡されます。

注: PERFORM ステートメントではそれ自体を実行することはできません。 再帰的 PERFORM ステートメントでは、予測できない結果が生じる可能性があります。

構文図を読む構文図をスキップする
フォーマット 1: 基本 PERFORM ステートメント

>>-PERFORM------------------------------------------------------>

>--+-プロシージャー名-1---+---------------------------------+-+-><
   |                     '-+-THROUGH-+--プロシージャー名-2--' |   
   |                       '-THRU----'                      |   
   '-+----------------------+--END-PERFORM------------------'   
     '-命令ステートメント-1--'                                    

プロシージャー名-1 プロシージャー名-2
手続き部の中のセクションまたは段落を指名しなければなりません。

プロシージャー名-1 およびプロシージャー名-2 を両方指定する場合、 いずれか一方が宣言型プロシージャーの中のプロシージャー名であれば、 両方が、同じ宣言型プロシージャーの中のプロシージャー名でなければなりません。

プロシージャー名-1 を指定した場合、命令ステートメント-1 と END-PERFORM 句を指定することはできません。

プロシージャー名-1 を省略した場合、命令ステートメント-1 と END-PERFORM 句を指定する必要があります。

命令ステートメント-1
行内 PERFORM ステートメントで実行されるステートメント

行内 PERFORM ステートメントは、行外 PERFORM ステートメントと同じ一般規 則に従って機能しますが、行内 PERFORM ステートメントでは行内 PERFORM に 含まれるステートメントが、プロシージャー名-1 (プロシージャー名-2 が指定され ている場合は、プロシージャー名-1 からプロシージャー名-2) の範囲内にあるステ ートメントの代わりに実行されるところだけが異なります。行内 または行外 という語が特に明示されていない限り、 行外 PERFORM ステートメントに適用される規則はすべて、行内 PERFORM ステートメントにも適用されます。

行外 PERFORM ステートメントが実行される度に、プロシージャー名-1 という名 前を持つプロシージャーの最初のステートメントに制御が移されます。そして必ず PERFORM ステートメントの次にあるステートメントに制御は戻されます。 制御がどの地点で戻されるかは、次のようにして決定されます。

  • プロシージャー名-1 が段落名であり、プロシージャー名-2 が指定されていない場合、プロシージャー名-1 の段落の最後のステートメントの実行後に制御の戻りが行われます。
  • プロシージャー名-1 がセクション名であり、プロシージャー名-2 が指定されていない場合、プロシージャー名-1 のセクションにある最後の段落の最後のステートメントの実行後に制御の戻りが行われます。
  • プロシージャー名-2 指定されており、それが段落名である場合、プロシージャー名-2 の段落の最後のステートメントの実行後に制御の戻りが行われます。
  • プロシージャー名-2 が指定されており、それがセクション名である場合、プロシージャー名-2 のセクションにある最後の段落の最後のステートメントの実行後に制御の戻りが行われます。

プロシージャー名-1プロシージャー名-2 との間で保持しなければならない唯一の関係は、連続する一連の処理が、プロシージャー名-1 によって指名されるプロシージャーから始まり、プロシージャー名-2 によって指名されるプロシージャーの実行によって終了するということだけです。

PERFORM ステートメントを、実行されるプロシージャーの中で指定することがで きます。戻る地点への論理パスが 2 つ以上ある場合、 EXIT ステートメントだけからなる段落の名前をプロシージャー名-2 として指定することができます。 その場合、戻り点へのすべてのパスは、この段落に導かれます。

実行されるプロシージャー中に別の PERFORM ステートメントが含まれているとき、 組み込まれた PERFORM ステートメントに関連する一連のプロシージャーは、 最初の PERFORM ステートメントにより実行されるプロシージャーの中に完全に含まれているか、 または完全に外側になければなりません。 すなわち、実行開始点が、 別のアクティブな PERFORM ステートメントにより実行されるプロシージャーの範囲内にある PERFORM ステートメントは、 別のアクティブな PERFORM ステートメントの出口点を通りすぎて制御を渡すことはできません。 ただし、2 つ以上のアクティブな PERFORM ステートメントには、共通出口を持たせることができます。

以下の図は、PERFORM ステートメントの有効な実行シーケンスを示したもので す。

この図は、有効な PERFORM ステートメントの実行シーケンスを示したものです。
詳細へのリンク。

PERFORM ステートメント以外の手段によって一連のプロシージャーに制御が渡さ れる場合、それらのプロシージャーを参照する PERFORM ステートメントが何もな いかのように、制御は出口点を通りすぎて次の実行可能ステートメントに渡されま す。

END-PERFORM

行内 PERFORM ステートメントの範囲を区切ります。この範囲内の最後のステートメントが実行されると、行内 PERFORM の実行が完了します。

TIMES 句を指定した PERFORM

TIMES 句付きの PERFORM ステートメントの中で参照された手順は、ID-1 または整数-1 の中の値によって指定した回数だけ実行されます。 ついで、PERFORM ステートメントの後にある次の実行可能ステートメントに渡されます。

構文図を読む構文図をスキップする
フォーマット 2: TIMES 句を含む PERFORM ステートメント

>>-PERFORM------------------------------------------------------>

>--+-プロシージャー名-1--+---------------------------------+--+-ID-1---+--TIMES-+-><
   |                     '-+-THROUGH-+--プロシージャー名-2-'  '-整数-1-'        |   
   |                       '-THRU----'                                        |   
   '-+-ID-1---+--TIMES--+----------------------+--END-PERFORM-----------------'   
     '-整数-1-'         '--命令ステートメント-1--'                                    

プロシージャー名-1 を指定した場合、命令ステートメント-1 と END-PERFORM 句を指定することはできません。

ID-1
ここには整数項目を指定しなければなりません。 ID-1 をウィンドウ表示日付フィールドにすることはできません。

PERFORM ステートメントが開始されたときに、ID-1 が 0 または負数である場合、 制御は PERFORM ステートメントの次のステートメントに移されます。

PERFORM ステートメントが開始された後で ID-1 が変更されても、 そのプロシージャーを実行する回数は変更されません。

整数-1
正の符号付き整数にできます。

UNTIL 句を指定した PERFORM

UNTIL 句を伴うフォーマットでは、参照される手順は、UNTIL 句によって指定さ れた条件 が真になるまで実行されます。条件が真になると、制御は、 PERFORM ステートメントの後にある次の実行可能ステートメントに渡されます。

構文図を読む構文図をスキップする
フォーマット 3: UNTIL 句を含む PERFORM ステートメント

>>-PERFORM------------------------------------------------------>

>--+-プロシージャー名-1---+---------------------------------+--| 句 1 |-+-><
   |                    '-+-THROUGH-+--プロシージャー名-2---'           |   
   |                      '-THRU----'                                 |   
   '-| 句 1 |--+----------------------+--END-PERFORM------------------'   
               '--命令ステートメント-1-'                                    

句 1

|--+----------------------------+--UNTIL--条件-1----------------|
   '-+------+--TEST--+-BEFORE-+-'                  
     '-WITH-'        '-AFTER--'                    

プロシージャー名-1 を指定した場合、命令ステートメント-1 と END-PERFORM 句を指定することはできません。

条件-1
条件式に説明してある条件ならばどの条件でも使用できます。PERFORM ステートメントが開始される時点で条件が真であれば、 指定されたプロシージャーは実行されません。

条件-1 に指定されたオペランドに関連付けられた添え字がある場合には、 条件がテストされるたびに評価されます。

TEST BEFORE 句が指定されているかまたは想定されている場合、 条件がテストされない限り、 ステートメントは何も実行されません (DO WHILE に対応したもの)。

TEST AFTER 句が指定されている場合、実行されるステートメントは、 条件がテストされる前に少なくとも 1 回は実行されます (DO UNTIL に対応したもの)。

どちらの場合も、 条件が真ならば、PERFORM ステートメントの後にある次の実行可能ステートメントに制御は移されます。 TEST BEFORE 句も TEST AFTER 句も指定されていない場合、TEST BEFORE 句が想定されます。

VARYING 句を指定した PERFORM

VARYING 句は、ある一定の規則に従って、1 つまたは複数の ID や指標名の値を 増やすか、または減らします。(VARYING 句の規則を参照してください。)

フォーマット 4 の VARYING 句指定の PERFORM ステートメントは、7 次元のテーブル全体をシリアル検索することができます。

構文図を読む構文図をスキップする
フォーマット 4: VARYING 句を含む PERFORM ステートメント

>>-PERFORM------------------------------------------------------>

>--+-プロシージャー名-1--+---------------------------------+--| 句 1 |--| 句 2 |-+-><
   |                     '-+-THROUGH-+--プロシージャー名-2-'                     |   
   |                       '-THRU----'                                           |   
   '-| 句 1 |--命令ステートメント-1--END-PERFORM---------------------------------'   

句 1

|--+----------------------------+--VARYING--+-ID-2-----+-------->
   '-+------+--TEST--+-BEFORE-+-'           '-指標名-1-'   
     '-WITH-'        '-AFTER--'                            

>--FROM--+-ID-3-------+--BY--+-ID-4-------+--UNTIL--条件-1------|
         +-指標名-2---+      '-リテラル-2-'                  
         '-リテラル-1-'                                      

句 2

   .-----------------------------------------------------.   
   V                                                     |   
|----AFTER--+-ID-5-----+--FROM--+-ID-6-------+--| 句 3 |-+------|
            '-指標名-3-'        +-指標名-4---+               
                                '-リテラル-3-'               

句 3

|--BY--+-ID-7-------+--UNTIL--条件-2----------------------------|
       '-リテラル-4-'                  

プロシージャー名-1 を指定した場合、命令ステートメント-1 と END-PERFORM 句を指定することはできません。 プロシージャー名-1 を省略した場合、AFTER 句を指定することはできません。

ID-2 から ID-7
これらは数字基本項目を指名する必要があります。 これらの ID は、ウィンドウ表示日付フィールドにはできません。
リテラル-1 からリテラル-4
これらは数字リテラルを表さなくてはなりません。
条件-1条件-2
条件式に説明してある条件ならばどの条件でも使用できます。PERFORM ステートメントが開始される時点で条件が真であれば、 指定されたプロシージャーは実行されません。

UNTIL 句で指定した条件が満たされると、 制御は PERFORM ステートメントの後にある次の実行可能ステートメントに渡されます。

条件-1 または条件-2 に指定されるオペランドのいずれかが、添え字付き、参照変更、または関数 ID である場合、その添え字、参照修飾子、または関数は、条件がテストされるたびに評価されます。

数字データ項目または数字リテラルを指定できる場所であればどこでも、 浮動小数点データ項目および浮動小数点リテラルも使用できます。

TEST BEFORE 句が指定されていると、指定されているすべての条件がテストされない限り、 最初の実行は行われず、しかも指定した条件がすべて 満たされないときに限り、 実行されるステートメントが実行されます。TEST AFTER 句が指定されていると、実行されるステートメントは、 条件がテストされる前に少なくとも 1 回は実行されます。

TEST BEFORE 句も TEST AFTER 句も指定されていない場合、TEST BEFORE 句が想定されます。

ID の変更

オペランドがどのようにして増加したり減少したりするかは、 指定する変数の個数によって異なります。 以下の説明では、ID-n についての説明はすべて指標名-n にも当てはまります (ただし、ID-n が BY 句のオブジェクトであるときは別です)。

ID-2 または ID-5 に添え字が付いているときは、 その添え字は ID によって参照されたデータ項目の内容が設定されるか、または増えていくたびに評価されます。ID-3ID-4ID-6、または ID-7 に添え字が付いているときは、 その添え字は ID によって参照されたデータ項目の内容が設定や増加の操作で使用されるたびに評価されます。

以下の図に、ID を TEST BEFORE 句を使用して変更するときの PERFORM ステートメントの論理を示します。

この図は、ID を TEST BEFORE 句を使用して変更するときの PERFORM ステートメントを示しています。
詳細へのリンク。

以下の図に、ID を TEST AFTER 句を使用して変更するときの PERFORM ステートメントの論理を示します。

この図は、ID を TEST AFTER 句を使用して変更するときの PERFORM ステートメントを示しています。
詳細へのリンク。

2 つの ID の変更

PERFORM PROCEDURE-NAME-1 THROUGH PROCEDURE-NAME-2
      VARYING IDENTIFIER-2 FROM IDENTIFIER-3
            BY IDENTIFIER-4 UNTIL CONDITION-1
         AFTER IDENTIFIER-5 FROM IDENTIFIER-6
            BY IDENTIFIER-7 UNTIL CONDITION-2
  1. ID-2 および ID-5 が、その初期値である ID-3 および ID-6 にそれぞれ設定されます。
  2. 条件-1 が、次のようにして評価されます。
    1. 偽であれば、ステップ 3 から 7 が実行されます。
    2. 真であれば、制御は、直接 PERFORM ステートメントの後にあるステートメントに渡されます。
  3. 条件-2 が、次のようにして評価されます。
    1. 偽であれば、ステップ 4 から 6 が実行されます。
    2. 真であれば、ID-2ID-4 だけ増やされ、ID-5ID-6 の現行値に設定され、ステップ 2 が繰り返されます。
  4. プロシージャー名-1 およびプロシージャー名-2 が 指定されていれば、1 回だけ実行されます。
  5. ID-5ID-7 だけ増やされます。
  6. 条件-2 が真になるまで、ステップの 3 から 5 を繰り返します。
  7. 条件-1 が真になるまで、ステップの 2 から 6 を繰り返します。

PERFORM ステートメントの実行終了時には、次のようになっています。

  • ID-5 には、ID-6 の現行値が入っています。
  • ID-2 には、最後に使用された設定値を、増分値だけ超えた値または減分値だけ減らした値が入っています (PERFORM ステートメントの実行開始時に条件-1 が真である場合以外。このときは、ID-2 には ID-3 の現行値が入っています)。

以下の図に、2 つの ID を TEST BEFORE 句を使用して変更するときの PERFORM ステートメントの論理を示します。

この図は、2 つの ID を TEST BEFORE 句を使用して変更するときの PERFORM ステートメントを示しています。2 つの ID の変更については上記のテキストで説明しています。

以下の図に、2 つの ID を TEST AFTER 句を使用して変更するときの PERFORM ステートメントの論理を示します。

この図は、2 つの ID を TEST AFTER 句を使用して変更するときの PERFORM ステートメントを示しています。
詳細へのリンク。

3 つの ID の変更

PERFORM PROCEDURE-NAME-1 THROUGH PROCEDURE-NAME-2
      VARYING IDENTIFIER-2 FROM IDENTIFIER-3
            BY IDENTIFIER-4 UNTIL CONDITION-1
          AFTER IDENTIFIER-5 FROM IDENTIFIER-6
            BY IDENTIFIER-7 UNTIL CONDITION-2
          AFTER IDENTIFIER-8 FROM IDENTIFIER-9
            BY IDENTIFIER-10 UNTIL CONDITION-3

この場合の動作も、次の点を除けば 2 つの ID の場合と同じです。すなわち、ID-8 は、ID-5ID-7 だけ増やされるたびに完全なサイクルで処理され、一方、ID-2 が変更されるたびに完全なサイクルで処理されます。

PERFORM ステートメントの実行終了時には、次のようになっています。

  • ID-5 および ID-8 には、それぞれ ID-6 および ID-9 の現行値が入っています。
  • ID-2 には、最後に使用された設定値を、1 つの増分値だけ超えた値または減分値だけ減らした値が入っています (PERFORM ステートメントの実行開始時に条件-1 が真である場合以外。このときは、ID-2 には ID-3 の現行値が入っています)。

4 つ以上の ID の変更

AFTER 句を 4 つまで追加して、 上記の例と同じように PERFORM ステートメントによる処理ができます。

VARYING 句の規則

指定する変数の個数には関係なく、次の規則が適用されます。

  • VARYING 句または AFTER 句の中に指標名が指定されている場合
    • INDEX 句に示されている規則に従って指標名が初期設定され、 それが増分または減少されます。(SET ステートメントも参照してください。)
    • 関連する FROM 句では、ID を整数として記述し、 正の値を持つ必要があります。 リテラルは正の整数でなければなりません。
    • 関連する BY 句内では、ID は整数として記述する必要があります。 リテラルはゼロ以外の整数でなければなりません。
  • FROM 句の中に指標名が指定されている場合
    • 関連する VARYING 句または AFTER 句の中では、ID は整数として記述される必要があります。これは、SET ステートメントの中で記述されたように初期設定されます。
    • 関連する BY 句は、 ID を整数として記述し、正の値を持たせなければなりません。 リテラルはゼロ以外の整数でなければなりません。
  • BY 句の中で、ID とリテラルはゼロ以外の値を持たねばなりません。
  • VARYING、FROM、および BY 句の中で ID または指標名の値を変更することは、 プロシージャーの実行回数を変更することになります。

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

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