PERFORM ステートメントは、1 つまたは複数のプロシージャーに明示的に制御を 移し、指定されたプロシージャーの実行終了後に、PERFORM ステートメントの次 の実行可能ステートメントに暗黙的に制御を戻します。
PERFORM ステートメントは、次のいずれかになります。
行内 PERFORM ステートメントは、END-PERFORM 句によって区切る必要があります。
行内フォーマットと行外フォーマットを合わせて使用することはできません。 例えば、プロシージャー名-1 を指定した場合、 命令ステートメントと END-PERFORM 句は指定できません。
PERFORM ステートメントのフォーマットには、次の 4 種類があります。
基本 PERFORM ステートメント内で参照されるプロシージャー (単数または複数) が 1 回実行されると、 制御は PERFORM ステートメントの後続の次の実行可能ステートメントに渡されます。
注: PERFORM ステートメントではそれ自体を実行することはできません。 再帰的 PERFORM ステートメントでは、予測できない結果が生じる可能性があります。
フォーマット 1: 基本 PERFORM ステートメント >>-PERFORM------------------------------------------------------> >--+-プロシージャー名-1---+---------------------------------+-+->< | '-+-THROUGH-+--プロシージャー名-2--' | | '-THRU----' | '-+----------------------+--END-PERFORM------------------' '-命令ステートメント-1--'
プロシージャー名-1 およびプロシージャー名-2 を両方指定する場合、 いずれか一方が宣言型プロシージャーの中のプロシージャー名であれば、 両方が、同じ宣言型プロシージャーの中のプロシージャー名でなければなりません。
プロシージャー名-1 を指定した場合、命令ステートメント-1 と END-PERFORM 句を指定することはできません。
プロシージャー名-1 を省略した場合、命令ステートメント-1 と END-PERFORM 句を指定する必要があります。
行内 PERFORM ステートメントは、行外 PERFORM ステートメントと同じ一般規 則に従って機能しますが、行内 PERFORM ステートメントでは行内 PERFORM に 含まれるステートメントが、プロシージャー名-1 (プロシージャー名-2 が指定され ている場合は、プロシージャー名-1 からプロシージャー名-2) の範囲内にあるステ ートメントの代わりに実行されるところだけが異なります。行内 または行外 という語が特に明示されていない限り、 行外 PERFORM ステートメントに適用される規則はすべて、行内 PERFORM ステートメントにも適用されます。
行外 PERFORM ステートメントが実行される度に、プロシージャー名-1 という名 前を持つプロシージャーの最初のステートメントに制御が移されます。そして必ず PERFORM ステートメントの次にあるステートメントに制御は戻されます。 制御がどの地点で戻されるかは、次のようにして決定されます。
プロシージャー名-1 とプロシージャー名-2 との間で保持しなければならない唯一の関係は、連続する一連の処理が、プロシージャー名-1 によって指名されるプロシージャーから始まり、プロシージャー名-2 によって指名されるプロシージャーの実行によって終了するということだけです。
PERFORM ステートメントを、実行されるプロシージャーの中で指定することがで きます。戻る地点への論理パスが 2 つ以上ある場合、 EXIT ステートメントだけからなる段落の名前をプロシージャー名-2 として指定することができます。 その場合、戻り点へのすべてのパスは、この段落に導かれます。
実行されるプロシージャー中に別の PERFORM ステートメントが含まれているとき、 組み込まれた PERFORM ステートメントに関連する一連のプロシージャーは、 最初の PERFORM ステートメントにより実行されるプロシージャーの中に完全に含まれているか、 または完全に外側になければなりません。 すなわち、実行開始点が、 別のアクティブな PERFORM ステートメントにより実行されるプロシージャーの範囲内にある PERFORM ステートメントは、 別のアクティブな PERFORM ステートメントの出口点を通りすぎて制御を渡すことはできません。 ただし、2 つ以上のアクティブな PERFORM ステートメントには、共通出口を持たせることができます。
以下の図は、PERFORM ステートメントの有効な実行シーケンスを示したもので す。

PERFORM ステートメント以外の手段によって一連のプロシージャーに制御が渡さ れる場合、それらのプロシージャーを参照する 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 句を指定することはできません。
PERFORM ステートメントが開始されたときに、ID-1 が 0 または負数である場合、 制御は PERFORM ステートメントの次のステートメントに移されます。
PERFORM ステートメントが開始された後で ID-1 が変更されても、 そのプロシージャーを実行する回数は変更されません。
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 に指定されたオペランドに関連付けられた添え字がある場合には、 条件がテストされるたびに評価されます。
TEST BEFORE 句が指定されているかまたは想定されている場合、 条件がテストされない限り、 ステートメントは何も実行されません (DO WHILE に対応したもの)。
TEST AFTER 句が指定されている場合、実行されるステートメントは、 条件がテストされる前に少なくとも 1 回は実行されます (DO UNTIL に対応したもの)。
どちらの場合も、 条件が真ならば、PERFORM ステートメントの後にある次の実行可能ステートメントに制御は移されます。 TEST BEFORE 句も TEST AFTER 句も指定されていない場合、TEST BEFORE 句が想定されます。
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 句を指定することはできません。
UNTIL 句で指定した条件が満たされると、 制御は PERFORM ステートメントの後にある次の実行可能ステートメントに渡されます。
条件-1 または条件-2 に指定されるオペランドのいずれかが、添え字付き、参照変更、または関数 ID である場合、その添え字、参照修飾子、または関数は、条件がテストされるたびに評価されます。
数字データ項目または数字リテラルを指定できる場所であればどこでも、 浮動小数点データ項目および浮動小数点リテラルも使用できます。
TEST BEFORE 句が指定されていると、指定されているすべての条件がテストされない限り、 最初の実行は行われず、しかも指定した条件がすべて 満たされないときに限り、 実行されるステートメントが実行されます。TEST AFTER 句が指定されていると、実行されるステートメントは、 条件がテストされる前に少なくとも 1 回は実行されます。
TEST BEFORE 句も TEST AFTER 句も指定されていない場合、TEST BEFORE 句が想定されます。
オペランドがどのようにして増加したり減少したりするかは、 指定する変数の個数によって異なります。 以下の説明では、ID-n についての説明はすべて指標名-n にも当てはまります (ただし、ID-n が BY 句のオブジェクトであるときは別です)。
ID-2 または ID-5 に添え字が付いているときは、 その添え字は ID によって参照されたデータ項目の内容が設定されるか、または増えていくたびに評価されます。ID-3、ID-4、ID-6、または ID-7 に添え字が付いているときは、 その添え字は ID によって参照されたデータ項目の内容が設定や増加の操作で使用されるたびに評価されます。
以下の図に、ID を TEST BEFORE 句を使用して変更するときの PERFORM ステートメントの論理を示します。

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

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
PERFORM ステートメントの実行終了時には、次のようになっています。
以下の図に、2 つの ID を TEST BEFORE 句を使用して変更するときの PERFORM ステートメントの論理を示します。

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

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-5 が ID-7 だけ増やされるたびに完全なサイクルで処理され、一方、ID-2 が変更されるたびに完全なサイクルで処理されます。
PERFORM ステートメントの実行終了時には、次のようになっています。
指定する変数の個数には関係なく、次の規則が適用されます。