![]() |
手続き部 - MERGE - OPEN | 手続き部 - SEARCH - WRITE | ![]() |
PERFORM(実行)文は、いくつかの手続きに制御を明示的に移し、その手続きの実行が終了した時点で、暗黙的に制御を戻すために使用する。
PERFORM文は、その有効範囲内にあるいくつかの無条件命令の実行を制御するためにも使用する。
前述のEXIT文の節を参照。
手続き名-1を省略するときは、無条件文-1とEND-PERFORM指定を書く。手続き名-1を書くときは、無条件文-1とEND-PERFORM指定を書いてはならない。
無条件文-1を書けば、END-PERFORM指定を省略してもよい。
手続き名-1と無条件文-1を両方とも省略してもよい。
数字データ項目または定数を指定できるところでは、どこでも浮動小数点数のデータ項目または定数を使用できる。ただし、整数が要求される箇所には使用できない。
書き方4では、手続き名-1を省略するときは、AFTER指定を書いてはならない。
書き方4では、AFTER指定を6つ書ける。
この制限は、15にまで拡大されている。
または、内PERFORM文自体の中に含まれている文を、
「指定された文の組」という。
END-PERFORM指定は、内PERFORM文の範囲を区切る。(COBOL言語の概念の章の明示範囲符と暗黙範囲符の節を参照。)
内PERFORM文は、基本的には、外PERFORM文用の下記の規則に従って機能する。両者の違いは、外PERFORM文では、手続き名-1(手続き名-2が指定されていれば手続き名-2まで)の範囲内に含まれている文が実行されるのに対して、内PERFORM文ではそのPERFORM文自体の中に含まれている文が実行されることである。以降の記述において、特に「内」または「外」と明示しないかぎり、外PERFORM文に当てはまる一般規則は、すべて内PERFORM文にも当てはまるものとする。
内PERFORM文の実行は、 その中に含まれる最後の文が実行された後で完了する。
内PERFORM文において、その中のすべての文の実行が終わる前に処理を終了させるために、
EXIT PROGRAM文を使用できる。
PERFORM文の実行中は、一意名-1は指定された次の実行回数を、一意名-1のデータ項目の初期値によって示される回数から変えることはできない。
整数-1はゼロまたは正でなければならない。符号を付けてもよい。
TEST BEFOREが指定、または暗黙に指定されていると、
制御は手続き名-1へ移行されず、PERFORM文の末尾に移される。
TEST AFTERが指定されている場合も、PERFORM文はTEST BEFOREが指定されているのと同じように機能する。ただし、終了条件の判定が行われるのは、指定された文の組が実行されてからとなる。条件-1中に指定された作用対象に関連する添字付けまたは部分参照は、条件が検査されるたびに評価される。
UNTIL EXITを指定すると、指定された文の組は、その中のどれかの文によって終了させられるまで、繰り返し実行される。外PERFORM文の場合は、この繰り返しを終了させられる文は、EXIT PROGRAMおよびSTOP RUNだけである。内PERFORM文の場合は、EXIT PERFORM文およびGO TO文によっても、この繰り返しを終了させることができる。
指標名-1を指定する場合、PERFORM文の実行を開始する時点での一意名-3、指標名-2、定数-1の値は、指標名-1を用いている表の中の要素の出現番号と対応させる。指標名-3を指定する場合、PERFORM文の実行を開始する時点での一意名-6、指標名-4、定数-3の値は、指標名-3を用いている表の中の要素の出現番号と対応させる。
下に述べるように、指標名-1または指標名-3を増加させていく際に、指標の値は対応する表の範囲を超えてはならない。ただし、PERFORM文の実行が終了する際には、指標の値は対応する表の範囲から1増分または1減分だけ外れることがある。
一意名-2または一意名-5に添字が付けられている場合、これらの一意名のデータ項目の内容が設定または増加されるたびに、その添字が評価される。一意名-3、一意名-4、一意名-5、一意名-6に添字が付けられている場合、これらの一意名のデータ項目の内容が設定または増加の処理に使用されるたびに、その添字が評価される。条件-1または条件-2の中に指定されている作用対象に添字または部分参照が適用されていると、条件が検査されるたびにその添字または部分参照が評価される。
以降に、書き方4のPERFORM文がどのように機能するかを示す例を掲げる。
1つの一意名のデータ項目の値を変化させる場合、PERFORM文の実行開始時点で、一意名-2のデータ項目の内容が、定数-1または一意名-3のデータ項目の現在の値に設定される。UNTIL指定の条件-1が偽であれば、指定された文の組が1回実行される。次いで、一意名-2のデータ項目の値が指定された値(定数-2または一意名-4のデータ項目の値)だけ増分または減分されて、条件-1が再び評価される。この処理が、条件-1が真になるまで繰り返される。PERFORM文の実行開始時点で条件-1が真である場合は、制御はPERFORM文の末尾に移される。
図 15-1: PERFORM文の機能の流れ図 - VARYING, TEST BEFORE, 1つの条件
2つの一意名のデータ項目の値を変化させる場合、PERFORM文の実行開始時点で、一意名-2のデータ項目の内容が、定数-1または一意名-3のデータ項目の現在の値に設定される。また、一意名-5のデータ項目の内容が、定数-3または一意名-6のデータ項目の現在の値に設定される。
これから条件-1が評価される。この結果が真である場合は、制御はPERFORM文の末尾に移される。この結果が偽である場合は、条件-2が評価される。この結果が偽であれば、指定された文の組が1回実行される。次いで、一意名-5のデータ項目の値が、定数-4または一意名-7のデータ項目の現在の値だけ増分または減分される。それから条件-2が再び評価される。
図 15-2: PERFORM文の機能の流れ図 - VARYING, TEST BEFORE, 2つの条件
この処理が、条件-2が真になるまで繰り返される。条件-2が真になると、一意名-2のデータ項目の値が、定数-2または一意名-4のデータ項目の現在の値だけ増分され、一意名-5のデータ項目の内容が、定数-3または一意名-6のデータ項目の現在の値に設定され直される。この後、条件-1が再び評価される。条件-1が真である場合は、PERFORM文の実行は終了する。そうでなければ、条件-1が真になるまで、この処理が繰り返される。
PERFORM文の実行が終了した時点では、一意名-5のデータ項目には定数-3または一意名-6のデータ項目の現在の値が入っている。一意名-2のデータ項目には、増分または減分によって最後に設定された値が入っている。ただし、PERFORM文の実行が開始された時点で条件-1が真であった場合には、一意名-2のデータ項目には、定数-1または一意名-3のデータ項目の現在の値が入っている。
TEST AFTERを指定した場合:
1つの一意名のデータ項目の値を変化させる場合、PERFORM文の実行開始時点で、一意名-2のデータ項目の内容が、定数-1または一意名-3のデータ項目の現在の値に設定される。そして、指定された文の組が1回実行される。それから、UNTIL指定の条件-1が検査される。この結果が偽であれば、一意名-2のデータ項目の値が指定された値(定数-2または一意名-4のデータ項目の値)だけ増分または減分されて、指定された文の組が再び実行される。この処理が、条件-1の検査結果が真になるまで繰り返される。条件-1の検査結果が真になると、制御はPERFORM文の末尾に移される。
2つの一意名のデータ項目の値を変化させる場合、PERFORM文の実行開始時点で、一意名-2のデータ項目の内容が、定数-1または一意名-3のデータ項目の現在の値に設定される。また、一意名-5のデータ項目の内容が、定数-3または一意名-6のデータ項目の現在の値に設定される。そして、指定された文の組が1回実行される。それから条件-2が評価される。この結果が偽であれば、一意名-5のデータ項目の値が、定数-4または一意名-7のデータ項目の現在の値だけ増分または減分されて、指定された文の組が再び実行される。この処理が、条件-2の評価結果が真になるまで繰り返される。条件-2が真になると、今度は条件-1が評価される。この結果が偽である場合は、一意名-2のデータ項目の値が、定数-2または一意名-4のデータ項目の現在の値だけ増分または減分され、一意名-5のデータ項目の内容が、定数-3または一意名-6のデータ項目の現在の値に設定し直される。この後、指定された文の組が再び実行される。この処理が、条件-1の評価結果が真になるまで繰り返される。条件-1が真になると、制御はPERFORM文の末尾に移される。
図 15-3: PERFORM文の機能の流れ図 - VARYING, TEST AFTER, 1つの条件
PERFORM文の実行が完了すると、AFTER指定またはVARYING指定によって変えられた各データ項目には、指定された文の組が最後に実行されたときの内容が入っている。図15-4を参照。
図 15-4: PERFORM文の機能の流れ図 - VARYING, TEST AFTER, 2つの条件
PERFORM文に指定された文の組が実行されている間に、VARYING変数(一意名-2のデータ項目および指標名-1)、BY変数(一意名-4のデータ項目)、AFTER変数(一意名-5のデータ項目および指標名-3)、FROM変数(一意名-3のデータ項目および指標名-2)の変化が考慮に入れられて、以降のPERFORM文の実行に影響を及ぼす。
2つの一意名のデータ項目を変化させる場合、一意名-2のデータ項目が変化するたびに、一意名-5のデータ項目は変化の全過程(FROM, BY, UNTIL)を経る。3つ以上の一意名のデータ項目の内容を変化させる場合も、その仕組みは基本的には2つの場合と同じである。ただし、AFTER指定によって変化させるデータ項目は、その前にあるAFTER指定の作用対象が増分または減分されるたびに、変化の全過程を経る。
これらの制限は強制しない。PERFORM文を入れ子にすることも、再帰させる(あるPERFORM文の手続きの中にそのPERFORM文を含める)ことも許される。現在実行されているPERFORM文の最も内側の出口だけが認識される。これらの規則は
PERFORM-TYPEコンパイラ指令
を使用することによって変更できる。
PERFORM文の正しい構成の仕方の例を、下に示す。
これらの制限は適用しない。
これらの制限は適用しない。
論理レコードを利用できるようにする。乱呼出しの場合、READ文は大記憶ファイルから指定されたレコードを利用できるようにする。
この制限は廃止された。
一意名のデータの記憶領域とファイル名のレコードの記憶領域とが、同じ記憶領域を指してはならない。
一意名は、浮動小数点数データ項目でもよい。
この制限は強制しない。
WITH LOCKを指定できるのは、共有ファイル中で単一のレコードをマニュアルロックする場合だけである。
WITH NO LOCKを指定できるのは、共有ファイル中でレコードをマニュアルまたは自動的にロックする場合だけである。
データ名はまた、ファイル名と対応するレコードキーとして指定した、データ項目の再定義となり、同じ長さをもつデータ名を作ることもできる。
再定義は、レコードキーと異なる長さをもつことがある。
分割キー名は、ファイル名のファイルの
レコード・キーとして指定したいくつかのデータ項目を結合したものである。
OPEN文の実行によってファイル位置指示子の位置が設定されている場合は、ファイル位置指示子が指すレコードが利用できるようになる。
前のREAD文の実行によってファイル位置指示子の位置が設定されている場合は、ファイル位置指示子が次のレコードを指すように >更新され、そのレコードが利用できるようになる。
しかし、前のREAD文によってレコードがロックされている場合は、ファイル位置指示子は変更されない。そのファイル位置指示子が指すレコードが利用できるようになる。
INPUT用に開かれたファイルに関しては、READ文も
READ WITH LOCK文もREAD WITH KEPT LOCK文も
レコード・ロックを得ることはない。
レコードロック方式がAUTOMATICまたはMANUALである1つの
順ファイルを複数の実行単位からEXTENDを指定して開くと、そのファイルが共有される。ただし、そのファイルの後ろに追加されるレコードの順序は保証されない。
I-O用に開かれたファイルに関しては、以下のようになる。
ある実行単位からはI-OまたはINPUT用に開き、別の実行単位からはEXTEND用に開いたファイルに対して
READ文を実行した際に、ファイル終了状態が発生した場合、そのREAD文を実行しようとした実行単位側でそのファイルを閉じなければならない。そのファイルの状態は
終了のまま残るため、その実行単位からはファイルの後ろに追加されたレコードを呼び出すことはできない。
順ファイルまたは
順呼出し法で呼び出すファイルに関しては、NEXT指定は書いても書かなくてもよい。READ文の実行には影響を及ぼさない。
読み込んだレコードがロックされていると、ファイル位置指示子はそのレコードを指すように設定される。以降、READ NEXT文またはREAD PREVIOUS文は同じレコードを再び取り出す。
NOT AT END指定は、READ文の実行が正常に終了した場合にだけ実行される。
PREVIOUS指定をしたREAD文を実行したときに、対象ファイル中に前の論理レコードが存在しないと、AT END条件が発生しREAD文の実行は不成功に終わったものとみなされる。
そのファイルに対して次に書き方3のREAD文を実行するならば、NEXTを指定する。そうでなければ、
下記の処理を続ける。
一般規則8に記述したように次の論理レコードが取り出される。
OPEN文の実行によって
ファイル位置指示子が設定されているところへ
PREVIOUSを指定したREAD文を実行すると、
AT END条件が発生する。
START文またはOPEN文の実行によってファイル位置指示子が設定されていて、ファイル位置指示子によって指されるレコードの呼出しができる場合は、そのレコードが利用可能にされる。相対ファイルのレコードを削除したり索引ファイルの 副レコードキーを変更したりすることによって、レコードが呼び出しできる状態になった場合は、参照キーによって確立されている呼出し経路中の次のレコードを指すように、ファイル位置指示子が更新される。
ただし、PREVIOUS指定をしていると、
前のレコードを指すように、ファイル位置指示子が更新される。そして、ファイル位置指示子によって指されるレコードが利用可能にされる。
ただし、PREVIOUS指定をしていると、
前のレコードを指すように、ファイル位置指示子が更新される。
前のREAD文によってレコードがロックされた場合は、ファイル位置指示子は変更されない。そして、ファイル位置指示子によって指されるレコードが利用可能にされる。
単一のレコードを
マニュアルロックするように指定したファイルを入出力両用に開くと、READ文に
WITH LOCK指定をしたときにだけ、実行単位はレコードロックを取得する。単なるREAD文では、
レコードロックを得ることはできない。ロックされているレコードを読み飛ばすためには、START文を用いて
ファイル位置指示子を更新する。ただし、キーの重複を認めている
副レコードキーに関しては、この方法を採ることはできない。
複数のレコードを
マニュアルロックするように指定したファイルを入出力両用に開くと、READ文に
WITH KEPT LOCK指定をしたときにだけ、実行単位はレコードロックを取得する。単なるREAD文では、
レコードロックを得ることはできない。ロックされているレコードを読み飛ばすためには、START文を用いてファイル位置指示子を更新する。ただし、キーの重複を認めている副レコードキーに関しては、この方法を採ることはできない。
WITH WAIT指定をすると、必要があれば待ってでも、レコードロックが必ず取得される。
または分割キー名
がその 参照キーとして使用される。動的呼出しを指定すると、後に書き方3の READ文を実行するときにも、この検索キーが使用される。ただし、別の参照キーを指定すると、今度はそれが使用されるようになる。
RELEASE(引き渡し)文は、 整列処理の最初の段階にレコードを引き渡す。
一意名が関数一意名である場合は、英数字関数を参照しなければならない。一意名が関数一意名でない場合は、
レコード名と一意名が同じ記憶領域を指してはならない。
レコード名は、浮動小数点数項目として定義してあってもよい。
一意名は、浮動小数点数であってもよい。RETURN(引き取り)文は、 整列処理の最後の段階から整列済みのレコードを引き取るか、または 併合処理中に併合済みのレコードを引き取る。
一意名-1は、浮動小数点数項目であってもよい。
この場合、NOT AT END指定があっても、無視される。
ファイル終了条件が発生すると、RETURN文の実行は不成功に終わり、ファイル名のレコード領域の内容はどうなるかわからない。AT END指定中の無条件文-1の実行が終了した後では、現在の出力手続きの一環としてそれ以上RETURN文を実行することはできない。
RETURN文の実行中にファイル終了条件が発生しなかった場合、レコードが利用可能にされる。次いでINTO指定に基づく暗黙の転記が行われた後で、無条件文-2を指定してあれば、制御はそちらに移される。無条件文-2を指定してなければ、制御はRETURN文の末尾に移される。
END-RETURN指定は、RETURN文の範囲を区切る。
REWRITE(書き換え)文は、ディスク・ファイル中に存在するレコードを論理的に置き換える。
一意名が関数一意名である場合、英数字関数を参照しなければならない。一意名が関数一意名でない場合、
レコード名と一意名が、同じ記憶領域を指してはならない。
レコード名は、浮動小数点数項目または2バイト文字項目であってもよい。
一意名は、USAGE DISPLAY-1(DBCS)項目または浮動小数点数項目であってもよい。
ただし、順呼出し法で索引ファイルを処理している場合には、REWRITE文にINVALID KEYを指定してもよい。
MOVE 一意名 TO レコード名
を実行し、それからFROM指定をしないREWRITE文を実行することと同じである。暗黙のMOVE文が実行される前のレコード領域の内容は、REWRITE文の実行に影響を及ぼさない。
END-REWRITE指定は、REWRITE文の範囲を区切る。
書き換えようとするレコードが他の実行単位によってロックされていると、REWRITE文の実行は不成功に終わる。注: 圧縮された順ファイルにはREWRITE文を使用しないように勧める。その理由は、圧縮された新しいレコードの長さが圧縮された古いレコードの長さと同じでないと、REWRITE処理は正常に終了しないからである。
書き込もうとするレコードの圧縮された長さが、元の圧縮されたレコードの長さ以下のとき、
REWRITE文を使用して正常に終了させることができる。ここで、圧縮された長さとは、後行の空白を削除しタブを圧縮し空文字を挿入したものを指す。レコードを読み込むと、空文字とタブ文字が拡張されて、レコードの長さが長くなる。
上記の場合、更新処理は行われず、レコード領域中のデータは元のまま残る。(前述の無効キー条件の節を参照。)
The ROLLBACK(更新取消し)文は、実行単位によって押さえられているすべてのファイル中のすべてのレコードロックを解除する。SELECT文のWITH...ROLLBACK句を単なる注記ではなく実際に機能できるCOBOLシステムでは、ROLLBACK文は現在のトランザクションの終わりを示し、そのトランザクションに関して行われた処理をすべて取り消す。
Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書、ならびに使用されている固有の商標と商品名 は国際法によって保護されています。
![]() |
手続き部 - MERGE - OPEN | 手続き部 - SEARCH - WRITE | ![]() |