Previous 手続き部 - MERGE - OPEN 手続き部 - SEARCH - XML PARSE Next

第 15 章 : 手続き部 - PERFORM - ROLLBACK

15.1 PERFORM(実行)文

PERFORM(実行)文は、いくつかの手続きに制御を明示的に移し、その手続きの実行が終了した時点で、暗黙的に制御を戻すために使用する。

PERFORM文は、その有効範囲内にあるいくつかの無条件命令の実行を制御するためにも使用する。

手続き部 - ENTER - INVOKEの章のEXIT(出口)文節を参照。

一般形式

形式 1

形式 2

形式 3

形式 4

指令

  1. 予約語リストにフラグを付けたり修正したりするコンパイラ指令に加えて、下記の指令によって、この項に記述した構文または意味が影響を受ける可能性がある。

構文規則

すべての形式
  1. 手続き名-1を省略するときは、無条件文-1とEND-PERFORM指定を書く。手続き名-1を書くときは、無条件文-1とEND-PERFORM指定を書いてはならない。

    無条件文-1を書けば、END-PERFORM指定を省略してもよい。

    手続き名-1と無条件文-1を両方とも省略してもよい。

  2. 語THROUGHとTHRUは同義であり、どちらを書いてもよい。

  3. 手続き名-1と手続き名-2を両方書いたときに、どちらか一方が手続き部の宣言部分に含まれる手続き名を指しているならば、両方の手続きとも同じ宣言節内になければならない。
形式 2 および 4
  1. 各一意名は、データ部に記述された数字基本項目を表わす。形式 2 では、一意名-1は整数とする。

  2. 数字データ項目または定数を指定できるところでは、どこでも浮動小数点数のデータ項目または定数を使用できる。ただし、整数が要求される箇所には使用できない。
形式 3
  1. TEST指定を書いた場合、EXIT指定を書いてはならない。
形式 3 および 4
  1. TEST BEFORE指定もTEST 指定も書かないと、TEST BEFORE指定を書いたものとみなされる。

  2. 条件-1、条件-2などは任意の条件式であってよい。 (手続き部の章の条件式節を参照。)
形式 4
  1. 形式 4 では、手続き名-1を省略するときは、AFTER指定を書いてはならない。

    この制限は適用されない。

  2. 各定数は、数字定数を表わす。

  3. VARYING指定またはAFTER指定の中に指標名を指定する場合は、下記のようにする。

    1. 対応するFROM指定およびBY指定の中の一意名は、整数データ項目とする。

    2. 対応するFROM指定の中の定数は、正の整数とする。

    3. 対応するBY指定の中の定数は、ゼロでない整数とする。

  4. FROM指定の中に指標名を指定する場合は、下記のようにする。

    1. 対応するVARYING指定またはAFTER指定の中の一意名は、整数データ項目とする。

    2. 対応するBY指定の中の一意名は、整数データ項目とする。

    3. 対応するBY指定の中の定数は、整数とする。

  5. BY指定の中の定数は、ゼロであってはならない。

  6. 形式 4では、AFTER指定を2つ書ける。

    形式 4では、AFTER指定を6つ書ける。

    この制限は、15にまで拡大されている。

一般規則

すべての形式
  1. 手続き名-1を指定したPERFORM文を「外PERFORM文」という。

    手続き名-1を省略したPERFORM文を「内PERFORM文」という。

  2. 外PERFORM文の手続き名-1(手続き名-2が指定されていれば手続き名-2まで)の範囲内に含まれている文、

    または、内PERFORM文自体の中に含まれている文

    を「指定された文の組」という。

  3. END-PERFORM指定は、内PERFORM文の範囲を区切る。(COBOL言語の概念の章の明示範囲符と暗黙範囲符節を参照。)

  4. 内PERFORM文は、基本的には、外PERFORM文用の下記の規則に従って機能する。両者の違いは、外PERFORM文では、手続き名-1(手続き名-2が指定されていれば手続き名-2まで)の範囲内に含まれている文が実行されるのに対して、内PERFORM文ではそのPERFORM文自体の中に含まれている文が実行されることである。以降の記述において、特に「内」または「外」と明示しないかぎり、外PERFORM文に当てはまる一般規則は、すべて内PERFORM文にも当てはまるものとする。

  5. PERFORM文が実行されると、制御は指定された文の組の最初の文に移される(一般規則8b、8c、8dに示す場合を除く)。この制御の移行は、PERFORM文が実行されるたびに1回だけ発生する。 >指定された文の組へ制御が移されると、PERFORM文の末尾に戻るための制御の暗黙移行が、下記のように用意される。

    1. 手続き名-1が段落名であり手続き名-2は指定されていない場合、手続き名-1の最後の文が実行されると、制御はPERFORM文の末尾に戻る。

    2. 手続き名-1が節名であり手続き名-2は指定されていない場合、手続き名-1の最後の段落の最後の文が実行されると、制御はPERFORM文の末尾に戻る。

    3. 手続き名-2が指定されておりそれが段落名である場合、その段落の最後の文が実行されると、制御はPERFORM文の末尾に戻る。

    4. 手続き名-2が指定されておりそれが節名である場合、その節内の最後の段落の最後の文が実行されると、制御はPERFORM文の末尾に戻る。

    5. 内PERFORM文の実行は、 その中に含まれる最後の文が実行された後で完了する。

    6. 内PERFORM文において、その中のすべての文の実行が終わる前に処理を終了させるために、EXIT PROGRAM文を使用できる。

  6. 手続き名-1と手続き名-2の間には、関連がある必要はない。ただ、手続き名-1から始まって手続き名-2で終わるように実行すればよい。手続き名-1と手続き名-2の終わりの間に、GO TO文やPERFORM文があってもよい。手続き名-1から手続き名-2の終わりに至る間にいくつかの論理経路が存在する場合は、手続き名-2を段落名とし、その中にEXIT文だけを置いて、すべての経路をそこに至らせるとよい。

  7. 指定された文の組への制御の移行がPERFORM文以外の手段で行われると、その文の組の末尾から次の実行文に制御が移される。つまり、PERFORM文がその文の組を参照していないように扱われる。

  8. PERFORM文は、下記のように機能する。

    1. 形式 1が基本的なPERFORM文である。この形式のPERFORMによって参照される指定された文の組が1回実行され、その後で制御はこのPERFORM文の末尾に戻る。

    2. 形式 2 は、 PERFORM ... TIMES指定で、一定の回数だけ繰り返すPERFORM文である。指定された文の組が、整数-1または一意名-1のデータ項目の初期値によって示される回数だけ実行される。PERFORM文を実行するときに、一意名-1のデータ項目の値がゼロまたは負である場合は、制御はPERFORM文の末尾に移される。指定された文の組が指定された回数実行された後で、制御はPERFORM文の末尾に移される。

      PERFORM文の実行中は、一意名-1は指定された次の実行回数を、一意名-1のデータ項目の初期値によって示される回数から変えることはできない。

      整数-1はゼロまたは正でなければならない。符号を付けてもよい。

    3. 形式 3 はPERFORM ... UNTIL指定で、条件が満たされるまで繰り返すPERFORM文である。指定された文の組が、UNTIL指定に書かれた条件が真になるまで繰り返し実行される。条件が真になると、制御はPERFORM文の末尾に移される。PERFORM文に入ったときに条件が真であり、

      TEST BEFOREが指定、または暗黙に指定されていると、

      制御は手続き名-1へ移行されず、PERFORM文の末尾に移される。

      TEST AFTERが指定されている場合も、PERFORM文はTEST BEFOREが指定されているのと同じように機能する。ただし、終了条件の判定が行われるのは、指定された文の組が実行されてからとなる。条件-1中に指定された作用対象に関連する添字付けまたは部分参照は、条件が検査されるたびに評価される。

      UNTIL EXITを指定すると、指定された文の組は、その中のどれかの文によって終了させられるまで、繰り返し実行される。外PERFORM文の場合は、この繰り返しを終了させられる文は、EXIT PROGRAMおよびSTOP RUNだけである。内PERFORM文の場合は、EXIT PERFORM文およびGO TO文によっても、この繰り返しを終了させることができる。

    4. 形式 4 は、PERFORM ... VARYING指定で、関連する要素の値を変化させながら条件が満たされるまで繰り返すPERFORM文である。この形のPERFORM文は、実行中にいくつかの一意名や指標名の値を、規則的に変化させるときに使用する。以下の記述において、VARYING、AFTER、FROMの各指定の作用対象としての一意名に関して述べることは指標名にも当てはまる。

      指標名-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. TEST BEFOREを明示的または暗黙的に指定した場合

        1つの一意名のデータ項目の値を変化させる場合、PERFORM文の実行開始時点で、一意名-2のデータ項目の内容が、定数-1または一意名-3のデータ項目の現在の値に設定される。UNTIL指定の条件-1が偽であれば、指定された文の組が1回実行される。次いで、一意名-2のデータ項目の値が指定された値(定数-2または一意名-4のデータ項目の値)だけ増分または減分されて、条件-1が再び評価される。この処理が、条件-1が真になるまで繰り返される。PERFORM文の実行開始時点で条件-1が真である場合は、制御はPERFORM文の末尾に移される。 図 15-1を参照。



        図 15-1: PERFORM文の機能の流れ図 - VARYING, TEST BEFORE, 1つの条件

        2つの一意名のデータ項目の値を変化させる場合、PERFORM文の実行開始時点で、一意名-2のデータ項目の内容が、定数-1または一意名-3のデータ項目の現在の値に設定される。また、一意名-5のデータ項目の内容が、定数-3または一意名-6のデータ項目の現在の値に設定される。図 15-2を参照。

        これから条件-1が評価される。この結果が真である場合は、制御はPERFORM文の末尾に移される。この結果が偽である場合は、条件-2が評価される。この結果が偽であれば、指定された文の組が1回実行される。次いで、一意名-5のデータ項目の値が、定数-4または一意名-7のデータ項目の現在の値だけ増分または減分される。それから条件-2が再び評価される。

        この処理が、条件-2が真になるまで繰り返される。条件-2が真になると、一意名-2のデータ項目の値が、定数-2または一意名-4のデータ項目の現在の値だけ増分され、一意名-5のデータ項目の内容が、定数-3または一意名-6のデータ項目の現在の値に設定され直される。この後、条件-1が再び評価される。条件-1が真である場合は、PERFORM文の実行は終了する。そうでなければ、条件-1が真になるまで、この処理が繰り返される。

        PERFORM文の実行が終了した時点では、一意名-5のデータ項目には定数-3または一意名-6のデータ項目の現在の値が入っている。一意名-2のデータ項目には、増分または減分によって最後に設定された値が入っている。ただし、PERFORM文の実行が開始された時点で条件-1が真であった場合には、一意名-2のデータ項目には、定数-1または一意名-3のデータ項目の現在の値が入っている。



        図 15-2: PERFORM文の機能の流れ図 - VARYING, TEST BEFORE, 2つの条件

      2. TEST AFTERを指定した場合

        1つの一意名のデータ項目の値を変化させる場合、PERFORM文の実行開始時点で、一意名-2のデータ項目の内容が、定数-1または一意名-3のデータ項目の現在の値に設定される。そして、指定された文の組が1回実行される。それから、UNTIL指定の条件-1が検査される。この結果が偽であれば、一意名-2のデータ項目の値が指定された値(定数-2または一意名-4のデータ項目の値)だけ増分または減分されて、指定された文の組が再び実行される。この処理が、条件-1の検査結果が真になるまで繰り返される。条件-1の検査結果が真になると、制御はPERFORM文の末尾に移される。図 15-3を参照。



        図 15-3: PERFORM文の機能の流れ図 - VARYING, TEST AFTER, 1つの条件

        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-4を参照。

        PERFORM文の実行が完了すると、AFTER指定またはVARYING指定によって変えられた各データ項目には、指定された文の組が最後に実行されたときの内容が入っている。



        図 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指定の作用対象が増分または減分されるたびに、変化の全過程を経る。

  9. PERFORM文の範囲は、論理的には、その開始によって明示的に制御を移されて実行される文に始まり、そのPERFORM文に制御が戻されるまでに実行される、すべての文に及ぶ。したがって、PERFORM文の範囲の中には、その中に含まれるCALL, GO TO, PERFORMなどの文によって制御を移されて実行される文もすべて含まれる。また、PERFORM文の範囲内の文を実行することによって実行される宣言手続き中の文もすべて含まれる。PERFORM文の範囲内に含まれる文が、原始要素内で連続して現れる必要はない。

  10. 次の場合、EXIT PROGRAM文を実行したことによって制御が移されて実行される文は、PERFORM文の範囲内にあるとはみなされない。

    1. PERFORM文が指定されているのと同じプログラム中に指定されたEXIT PROGRAM文。

    2. PERFORM文の範囲内にあるEXIT PROGRAM文。

  11. あるPERFORM文の範囲内に別のPERFORM文が含まれる場合、含まれる方のPERFORM文に連なる一連の手続きは、最初のPERFORM文によって参照される一連の手続きに完全に含まれるか、完全にその外にあるかの、どちらかでなければならない。したがって、あるPERFORM文の範囲内にあるPERFORM文は他のPERFORM文の出口に制御を渡してはならない。さらに、2つ以上のPERFORM文が、出口を共有してはならない。

    これらの制限は強制しない。PERFORM文を入れ子にすることも、再帰させる(あるPERFORM文の手続きの中にそのPERFORM文を含める)ことも許される。現在実行されているPERFORM文の最も内側の出口だけが認識される。これらの規則はPERFORM-TYPEコンパイラ指令を使用することによって変更できる。

    PERFORM文の正しい構成の例を、下に示す。

  12. 独立区分外の節内にあるPERFORM文の範囲内には、その範囲内から呼ぶ宣言節の他に、下記のどちらか1つを含めることができる。

    1. 1つ以上の非独立区分に完全に含まれる節または段落

    2. 単一の独立区分に完全に含まれる節または段落

    これらの制限は適用しない。

  13. 独立区分内にあるPERFORM文の範囲内には、その範囲内から呼ぶ宣言節の他に、下記のどれか1つを含めることができる。

    1. 1つ以上の非独立区分に完全に含まれる節または段落

    2. 該当するPERFORM文と同じ独立区分に完全に含まれる節または段落

    これらの制限は適用しない。

形式 4
  1. 一意名-4および一意名-7のデータ項目は、値がゼロであってはならない。

  2. VARYING指定またはAFTER指定の中で指標名を使用し、対応するFROM指定の中で一意名を使用する場合、この一意名のデータ項目の値は、正でなければならない。

15.2 READ(読み込み)文

順呼出しの場合、READ(読込み)文はファイルから次

または前の

論理レコードを利用できるようにする。乱呼出しの場合、READ文は大記憶ファイルから指定されたレコードを利用できるようにする。

一般形式

形式 1 (レコード順ファイル)

形式 2 (行順ファイル)

形式 3 (相対ファイルおよび索引ファイル)

形式 4 (相対ファイル)

形式 5 (索引ファイル)

指令およびランタイム・スイッチ

  1. 予約語リストにフラグを付けたり修正したりするコンパイラ指令に加えて、下記の指令によって、この項に記述した構文または意味が影響を受ける可能性がある。

  2. 下記のランタイム・スイッチによって、この項に記述した意味が影響を受ける可能性がある。

構文規則

すべての形式 (すべてのファイル)
  1. 入力ファイルの論理レコードが可変長のとき、INTO指定を使用してはならない。

    この制限は削除された。

    一意名のデータの記憶領域とファイル名のレコードの記憶領域とが、同じ記憶領域を指してはならない。

  2. 一意名は、浮動小数点数データ項目でもよい。

  3. ファイル名に適用できるUSE手続きを設定していない場合には、INVALID KEY指定またはAT END指定を書く。

    この規則は強制ではない。

形式 1、3、4 および 5 (レコード順ファイル、相対ファイル、索引ファイル)
  1. WITH LOCKを指定できるのは、共有ファイル中で単一のレコードを手入力でロックする場合だけである。

  2. WITH NO LOCKを指定できるのは、共有ファイル中でレコードをマニュアルまたは自動的にロックする場合だけである。

形式 3 (相対ファイルおよび索引ファイル)
  1. 動的呼出し法でレコードを順検索する場合は、NEXT

    またはPREVIOUS

    を指定する。

形式 3、4 および 5 (相対ファイルおよび索引ファイル)
  1. WITH KEPT LOCKを指定できるのは、共有ファイル中で複数のレコードを手入力でロックする場合だけである。

形式 4 および 5 (相対ファイルおよび索引ファイル)
  1. 乱呼出し法または動的呼出し法でファイルのレコードを乱検索する場合は、形式 4または5を用いる。

形式 5 (索引ファイル)
  1. データ名

    または分割キー名

    は、ファイル名のファイルのレコードキーとして指定したデータ項目の名前とする。

    データ名はまた、ファイル名と対応するレコードキーとして指定した、データ項目の再定義となり、同じ長さをもつデータ名を作ることもできる。

    再定義は、レコードキーと異なる長さをもつことがある。

  2. データ名

    または分割キー名

    は、修飾してもよい。

  3. 分割キー名は、ファイル名のファイルのレコード・キーとして指定したいくつかのデータ項目を結合したものである。

一般規則

すべての形式 (すべてのファイル)
  1. READ文を実行するときには、対象のファイルを入力モードまたは 入出力モードで開いておく。(手続き部 - MERGE - OPENの章のOPEN(開く)文 節を参照。)

  2. READ文を実行すると、ファイル名に対応するFILE STATUSデータ項目が存在すれば、その値が更新される。(手続き部の章の入出力状態節を参照。)

  3. 1つのファイルの論理レコードが複数のレコード記述によって定義されている場合、それらのレコードは自動的に同じ記憶領域を共有する。これはレコード領域を暗黙的に再定義することに相当する。現在のレコード領域の範囲を超えてデータ項目が存在する場合、READ文の実行が終了したときにその内容はどうなっているかわからない。

  4. INTOを指定すると、読み込まれたレコードは、レコード領域から一意名に指定した領域へ転記される。その際、CORRESPONDING指定のないMOVE文に関する規則が適用される。READ文の実行が不成功であったときは、この暗黙的な転記は行われない。一意名に添字付けまたは指標付けがなされている場合、レコードが読み込まれてからその一意名のデータ項目に転記される直前に評価される。

  5. INTOを指定すると、読み込まれたレコードは、入力レコード領域でも一意名のデータ領域でも利用可能となる。

  6. ファイル位置指示子が次の論理レコードが存在しないことを示しているか、または不定入力ファイルが存在しない場合、下記の処理が順に行われる。

    1. ファイル位置指示子の内容に応じた値が、ファイル名-1に対応する入出力状態に設定される。 (手続き部の章の入出力状態節を参照。)

    2. AT END指定をしてあると、制御は無条件文-1に移される。この場合、ファイル名-1のファイル結合子に対応するUSE AFTER EXCEPTION手続きが設定してあっても実行されない。その後、無条件文-1の中の各文に関する規則に従って、処理は続行される。その中で、制御の明示をもたらす分岐文または条件文が実行された場合は、その文に関する規則に従って制御が移される。そうでなければ、無条件文-1の実行が終了した時点で、制御はREAD文の末尾に移される。この場合、NOT AT END指定があっても、無視される。

    3. AT END指定をしていない場合、ファイル名-1に対応するUSE AFTER STANDARD EXCEPTION手続きを設定する必要がある。この場合、そのUSE手続きが実行される。その実行が終了すると、READ文の末尾の次の実行文に制御が戻される。

      AT END条件が発生した場合、READ文の実行は不成功になる。

  7. READ文の実行が不成功に終わった後では、対応するレコード領域の内容はどうなっているかわからない。また、ファイル位置指示子は、次のレコードが存在しないことを示すように設定される。

形式 1 (レコード順ファイル)
  1. READ文によって利用可能となるレコードは、下記のように決定される。

    1. OPEN文の実行によってファイル位置指示子の位置が設定されている場合は、ファイル位置指示子が指すレコードが利用できるようになる。

    2. 前のREAD文の実行によってファイル位置指示子の位置が設定されている場合は、ファイル位置指示子が次のレコードを指すように >更新され、そのレコードが利用できるようになる。

      しかし、前のREAD文によってレコードがロックされている場合は、ファイル位置指示子は変更されない。そのファイル位置指示子が指すレコードが利用できるようになる。

  2. READ文の実行中にリールまたはユニットの終わりが検出されたが、まだファイルの終わりには達していない場合、下記の手続きが実行される。

    1. 標準終了リール/ユニット・ラベル手続き

    2. リール/ユニットの交換

    3. 標準開始了リール/ユニット・ラベル手続き

    4. 新しいリール/ユニットの最初のデータ・レコードの読込み

  3. OPTIONAL指定をしたファイルを開こうとしたときにそのファイルが存在しないと、そのファイルに対して最初にREAD文が実行されたときにAT END条件が発生し、READ文の実行は不成功に終わる。標準のファイル終了手続きは実行されない。(環境部の章のファイル管理段落節、手続き部 - MERGE - OPENの章のOPEN(開く)文節、および手続き部 - SEARCH - XML PARSEの章のUSE(使用)文節を参照。) その後、 実行は、一般規則13に記してあるように進む。

  4. INPUT用に開かれたファイルに関しては、READ文、READ WITH LOCK文、およびREAD WITH KEPT LOCK文のいずれもレコード・ロックを得ることはない。

  5. レコードロック方式がAUTOMATICまたはMANUALである1つの順ファイルを複数の実行単位からEXTENDを指定して開くと、そのファイルが共有される。ただし、そのファイルの後ろに追加されるレコードの順序は保証されない。

  6. I-O用に開かれたファイルに関しては、以下のようになる。

    1. ファイルにLOCK MODE IS AUTOMATICが指定してあると、READ文にWITH NO LOCKを指定しないかぎり読み込まれた各レコードはロックされる。

    2. ファイルにLOCK MODE IS MANUALが指定してあると、READ文ではレコードロックを得ることはできない。レコードロックを得るためには、READ WITH LOCK文を使用する。READ文にWITH NO LOCKを指定しても、注記になる。

    3. レコードロックがいつ解除されるかは、単一のレコードをロックしたか複数のレコードをロックしたかによって異なる。 (環境部の章ののファイル管理段落節を参照。)

  7. ある実行単位からはI-OまたはINPUT用に開き、別の実行単位からはEXTEND用に開いたファイルに対してREAD文を実行した際に、ファイル終了状態が発生した場合、そのREAD文を実行しようとした実行単位側でそのファイルを閉じなければならない。そのファイルの状態は終了のまま残るため、その実行単位からはファイルの後ろに追加されたレコードを呼び出すことはできない。

形式 1、2 および 3 (順ファイル、相対ファイル、および索引ファイル)
  1. READ文の実行中にAT END条件が発生しなかった場合、AT END指定をしてあっても無視されて、以下の処理が行われる。

    1. ファイル位置指示子が設定されて、ファイル名-1に対応する入出力状態が更新される。

    2. ファイル終了条件以外の例外条件が発生していると、ファイル名-1に適用できるUSE AFTER EXCEPTION手続きが指定してあればそれが実行されて、その後でUSE文の規則に従って制御が移される。(手続き部 - SEARCH - XML PARSEの章のUSE(使用)文節を参照。)

    3. 例外条件が何も発生していなければ、読込み対象レコードがレコード領域中で利用できるようにされる。また、INTOを指定してあれば、暗黙の転記処理が行われる。その後で、制御はREAD文の末尾に移される。ただし、NOT AT END指定をしてあれば、制御は無条件文-2に移される。この場合、無条件文-2の中の個々の文に関する規則に従って、以降の処理が続行される。制御の明示移行をもたらす分岐文または条件文が実行された場合は、その文に関する規則に従って制御が移される。制御の明示移行をもたらす分岐文または条件文が実行されなかった場合は、無条件文-2の実行が終わると、制御はREAD文の末尾に移される。

  2. NEXT指定をしたREAD文を実行したときに、対象ファイル中に次の論理レコードが存在しないと、AT END条件が発生しREAD文の実行は不成功に終わったものとみなされる。(手続き部の章の入出力状態節を参照。)

  3. 順ファイルまたは

    順呼出し法で呼び出すファイルに関しては、NEXT指定は書いても書かなくてもよい。READ文の実行には影響を及ぼさない。.

形式 3 (相対ファイルおよび索引ファイル)
  1. 読み込んだレコードがロックされていると、ファイル位置指示子はそのレコードを指すように設定される。以降、READ NEXT文またはREAD PREVIOUS文は同じレコードを再び取り出す。

    NOT AT END指定は、READ文の実行が正常に終了した場合にだけ実行される。

  2. PREVIOUS指定をしたREAD文を実行したときに、対象ファイル中に前の論理レコードが存在しないと、AT END条件が発生しREAD文の実行は不成功に終わったものとみなされる。

  3. AT END条件が検出された場合、前の論理レコードが存在しないため、

    そのファイルに対して次に形式 3 のREAD文を実行するならば、NEXTを指定する。そうでなければ、

    下記の処理を続ける。

    1. 該当するファイルに対してCLOSE文を実行し、次いでOPEN文を実行する。いずれも正常に終了しなければならない。

    2. そのファイルに対してSTART文を実行する。正常に終了しなければならない。

    3. そのファイルに対して、形式 4(相対ファイル)または形式 5(索引ファイル)のREAD文を実行する。

  4. 動的呼出し法を指定したファイルに関して、NEXT指定をしたREAD文を実行すると、

    一般規則8に記述したように

    次の論理レコードが取り出される。

  5. READ文によって利用可能となるレコードは、下記の規則に従って決定される。

    1. OPEN文の実行によってファイル位置指示子が設定されているところへPREVIOUSを指定したREAD文を実行すると、AT END条件が発生する。

      START文またはOPEN文の実行によってファイル位置指示子が設定されていて、ファイル位置指示子によって指されるレコードの呼出しができる場合は、そのレコードが利用可能にされる。相対ファイルのレコードを削除したり索引ファイルの副レコードキーを変更したりすることによって、レコードが呼び出しできる状態になった場合は、参照キーによって確立されている呼出し経路中の次のレコードを指すように、ファイル位置指示子が更新される。

      ただし、PREVIOUS指定をしていると、

      前のレコードを指すように、ファイル位置指示子が更新される。そして、ファイル位置指示子によって指されるレコードが利用可能にされる。

    2. 前のREAD文の実行によってファイル位置指示子が設定された場合、ファイル位置指示子はファイル中に存在する次のレコードを指すように更新される。

      ただし、PREVIOUS指定をしていると、前のレコードを指すように、ファイル位置指示子が更新される。

      前のREAD文によってレコードがロックされた場合は、ファイル位置指示子は変更されない。そして、ファイル位置指示子によって指されるレコードが利用可能にされる。

形式 1、3、4 および 5 (順ファイル、相対ファイル、索引ファイル)
  1. 単一のレコードを手入力でロックするように指定したファイルを入出力両用に開くと、READ文にWITH LOCK指定をしたときにだけ、実行単位はレコードロックを取得する。単なるREAD文では、レコードロックを得ることはできない。ロックされているレコードを読み飛ばすためには、START文を用いてファイル位置指示子を更新する。ただし、キーの重複を認めている副レコードキーに関しては、この方法を採ることはできない。

  2. 複数のレコードを手入力でロックするように指定したファイルを入出力両用に開くと、READ文にWITH KEPT LOCK指定をしたときにだけ、実行単位はレコードロックを取得する。単なるREAD文では、レコードロックを得ることはできない。ロックされているレコードを読み飛ばすためには、START文を用いてファイル位置指示子を更新する。ただし、キーの重複を認めている副レコードキーに関しては、この方法を採ることはできない。

  3. WITH WAIT指定をすると、必要があれば待ってでも、レコードロックが必ず取得される。

形式 3 (相対ファイル)
  1. RELATIVE KEYを指定したファイルに対してREAD文を実行すると、利用可能にされたレコードの相対レコード番号が、RELATIVE KEYデータ項目に収められる。

形式 4 (相対ファイル)
  1. READ文を実行すると、ファイルのRELATIVE KEYに指定したデータ項目中に保持されている相対レコード番号がファイル位置指示子に設定され、そのレコードが利用可能にされる。ファイル中にその相対レコード番号のレコードが存在しない場合は、無効キー条件が発生し、READ文の実行は不成功に終わる。(手続き部の章の無効キー条件 節を参照。)

形式 3 および 5 (相対ファイルおよび索引ファイル)
  1. IGNORE LOCK指定をすると、READ文はレコードがロックされていないかのように実行される。

形式 3 (索引ファイル)
  1. 索引ファイルを順呼び出しする場合、検索のキーとしている副レコードキーに値が同じものがあると、これらはWRITE文またはREWRITE文によって書き出された順に利用可能にされる。

形式 5 (索引ファイル)
  1. KEY指定をしないと、主レコードキーが検索キーとして使用される。動的呼出しを指定すると、後に形式 3 のREAD文を実行するときにも、この検索キーが使用される。

  2. KEY指定をすると、データ名-1

    または分割キー名

    がその参照キーとして使用される。動的呼出しを指定すると、後に形式 3のREAD文を実行するときにも、この検索キーが使用される。ただし、別の参照キーを指定すると、今度はそれが使用されるようになる。

  3. 形式 5のREAD文を実行すると、参照キーの値がファイル中のレコードの対応するデータ項目に格納されている値と順次比較されて、両者の値が最初に一致するものが見つけ出される。ファイル位置指示子がそのレコードを指すように設定されて、そのレコードが利用可能とされる。両者の値が一致するレコードが見つからないと、無効キー条件が発生し、READ文の実行は不成功に終わる。(手続き部の章の無効キー条件節を参照。)

15.3 RELEASE(引き渡し)文

RELEASE(引き渡し)文は、整列処理の最初の段階にレコードを引き渡す。

一般形式

構文規則

  1. RELEASE文を使用できるのは、整列併合ファイル記述項にレコード名を記述したファイルを対象とするSORT文に関連する、入力手続きの範囲内だけである。(手続き部 - SEARCH - XML PARSEの章のSORT(整列)文節を参照。)

  2. レコード名は、関連する整列併合ファイル記述項内の論理レコードの名前とする。このレコード名は修飾してもよい。

  3. 一意名が関数一意名である場合は、英数字関数を参照しなければならない。一意名が関数一意名でない場合は、

    レコード名と一意名が同じ記憶領域を指してはならない。

  4. レコード名は、浮動小数点数項目として定義してあってもよい。

  5. 一意名は、浮動小数点数であってもよい。

一般規則

  1. RELEASE文を実行すると、レコード名が1件ずつ、整列処理の最初の段階に引き渡される。

  2. FROM指定をすると、一意名のデータ領域の内容がレコード名に転記されて、それからレコード名の内容が整列ファイルに引き渡される。この転記は、CORRESPONDING指定のないMOVE文に関する規則に従って行われる。レコード領域内のデータは利用できなくなるが、一意名のデータ領域のデータは引続き利用できる。

  3. RELEASE文の実行が終了した後は、レコード領域中の論理レコードは利用できなくなる。ただし、対応する整列併合ファイルをSAME RECORD AREA句に指定しておけば、利用できる。この場合、その論理レコードは そのSAME RECORD AREA句に指定した 他のファイルのレコードとしても利用できる 。入力手続きから制御が戻されると、整列用ファイルにはRELEASE文の実行によって引き渡されたすべてのレコードが格納されている。

15.4 RETURN(引き取り)文

RETURN(引き取り)文は、整列処理の最後の段階から整列済みのレコードを引き取るか、または併合処理中に併合済みのレコードを引き取る。

一般形式

構文規則

  1. ファイル名は、データ部の中の整列併合ファイル記述項に記述しておく。

  2. RETURN文を使用できるのは、ファイル名を対象とするSORT文またはMERGE文に関連する、出力手続きの範囲内だけである。

  3. 入力ファイルのレコード記述に大きさの異なる論理レコードが含まれているときは、INTO指定をしてはならない。一意名のデータ領域とファイル名のレコード領域が、同じ記憶領域を指していてはならない。

  4. 一意名-1は、浮動小数点数項目であってもよい。

一般規則

  1. 1つのファイルに論理レコードのレコード記述がいくつもある場合、これらのレコードは自動的に同じ記憶領域を共有する。これは、暗黙的にレコードを再定義することと同じである。現在のデータ・レコードの範囲を超えるデータ項目は、RETURN文の実行が終了した時点でその内容は、どうなっているかわからない。

  2. RETURN文の実行が終了すると、ファイル名のファイル中に存在する次のレコードが、そのレコード領域において利用可能とされる。このレコードの順序は、SORT文またはMERGE文中に指定されているキーによって決定される。ファイル名のファイル中に次の論理レコードが存在しないとファイル終了条件が発生し、AT END指定の無条件文-1に制御が移される。この場合、無条件文-1の中の各文に関する規則に従って、処理は続行される。その中で、制御を明示的に移行する手続きの分岐または条件文が実行された場合は、その文に関する規則に従って制御が移される。 そうでなければ、無条件文-1の実行が終了した時点で、制御はRETURN文の末尾に移される。

    この場合、NOT AT END指定があっても、無視される。

    ファイル終了条件が発生すると、RETURN文の実行は不成功に終わり、ファイル名のレコード領域の内容はどうなるかわからない。AT END指定中の無条件文-1の実行が終了した後では、現在の出力手続きの一環としてそれ以上RETURN文を実行することはできない。

  3. RETURN文の実行中にファイル終了条件が発生しなかった場合、レコードが利用可能にされる。次いでINTO指定に基づく暗黙の転記が行われた後で、無条件文-2を指定してあれば、制御はそちらに移される。無条件文-2を指定してなければ、制御はRETURN文の末尾に移される。

  4. END-RETURN指定は、RETURN文の範囲を区切る。

  5. 下記のどちらかの場合は、RETURN文中にINTO指定を含めることができる。

  6. INTO指定を伴うRETURN文を実行した結果は、下記の規則を順に適用することと同じである。

    1. INTO指定を伴わない同じ内容のRETURN文を実行する。

    2. 現在のレコード領域の内容を、一意名のデータ領域に転記する。転記の仕方はCORRESPONDING指定のないMOVE文の規則に従う。現在のレコードの大きさは、RECORD句の指定によって決まる。ファイル記述項にRECORD IS VARYING句が指定してある場合は、暗黙的に集団項目転記が行われるが、この転記は不成功に終わる。一意名に添字付けがされていれば、レコードが読み出された後、一意名のデータ項目に転記される直前に評価される。レコード領域および一意名-1のデータ項目の、 両方のデータが利用できる。

15.5 REWRITE(書き換え)文

REWRITE(書き換え)文は、ディスク・ファイル中に存在するレコードを論理的に置き換える。

一般形式

形式 1 (行順ファイル)

形式 2 (レコード順ファイル)

形式 3 (相対ファイルおよび索引ファイル)

指令およびランタイム・スイッチ

  1. 予約語リストにフラグを付けたり修正したりするコンパイラ指令に加えて、下記の指令によって、この項に記述した構文または意味が影響を受ける可能性がある。

  2. 下記のランタイム・スイッチによって、この項に記述した意味が影響を受ける可能性がある。

構文規則

すべての形式 (すべてのファイル)
  1. 一意名が関数一意名である場合、英数字関数を参照しなければならない。一意名が関数一意名でない場合、

    レコード名と一意名が、同じ記憶領域を指してはならない。

  2. レコード名は、データ部のファイル節の中の論理レコードの名前である。レコード名は修飾してもよい。

  3. レコード名は、浮動小数点数項目または2バイト文字項目であってもよい。

  4. 一意名は、USAGE DISPLAY-1(DBCS)項目または浮動小数点数項目であってもよい。
形式 3 (相対ファイルおよび索引ファイル)

  1. 順呼出し法でファイルを処理している場合には、REWRITE文にはINVALID KEYを指定できない。

    ただし、順呼出し法で索引ファイルを処理している場合には、REWRITE文にINVALID KEYを指定してもよい。

  2. 乱呼出し法または動的呼出し法でファイルを処理しているが、そのファイルに適用できるUSE手続きを指定していない場合には、REWRITE文にINVALID KEYを指定する。

一般規則

すべての形式 (すべてのファイル)
  1. 該当するレコード名のレコードが含まれるファイルは、ディスク・ファイルとする。この文を実行する時点では、入出力モードで開いておく。(手続き部 - MERGE - OPENの章のOPEN(開く)文節を参照。)

  2. ファイルを順呼出し法で処理している場合、REWRITE文を実行する前に実行した直前の入出力文は、正常に終了したREAD文でなければならない。オペレーティングシステムは、READ文によって呼び出されたレコードを論理的に置き換える。

  3. FROM指定をしたREWRITE文を実行することは、
         MOVE 一意名 TO レコード名

    を実行し、それからFROM指定をしないREWRITE文を実行することと同じである。暗黙のMOVE文が実行される前のレコード領域の内容は、REWRITE文の実行に影響を及ぼさない。

  4. ファイル位置指示子は、REWRITE文の実行の影響を受けない。

  5. REWRITE文を実行すると、更新対象のファイルに対応するFILE STATUSデータ項目を指定してあれば、その値が更新される。 (手続き部の章の入出力状態節を参照。)

  6. END-REWRITE指定は、REWRITE文の範囲を区切る。

  7. 書き換えようとするレコードが他の実行単位によってロックされていると、REWRITE文の実行は不成功に終わる。
形式 1 および 2 (順ファイル)
  1. レコード名のレコードの文字数は、新しい書き換え用のレコードの文字数と等しくする。

注: 圧縮された順ファイルにはREWRITE文を使用しないように勧める。その理由は、圧縮された新しいレコードの長さが圧縮された古いレコードの長さと同じでないと、REWRITE処理は正常に終了しないからである。


  1. REWRITE文の実行が正常に終了すると、レコード領域中の論理レコードは解放され、利用できなくなる。ただし、対応するファイルを SAME RECORD AREA句に指定しておけば、利用できる。この場合、その論理レコードは 、そのファイルの論理レコードとしてだけではなく、そのSAME RECORD AREA句に指定した 他のファイルのレコードとしても、利用できる。
形式 1 (行順ファイル)
  1. 書き込もうとするレコードの圧縮された長さが、元の圧縮されたレコードの長さ以下のとき、REWRITE文を使用して正常に終了させることができる。ここで、圧縮された長さとは、後行の空白を削除しタブを圧縮し空文字を挿入したものを指す。レコードを読み込むと、空文字とタブ文字が拡張されて、レコードの長さが長くなる。
形式 3 (相対ファイルおよび索引ファイル)
  1. REWRITE文の実行が正常に終了すると、レコード領域中の論理レコードは解放され、利用できなくなる。ただし、対応するファイルをSAME RECORD AREA句に指定しておけば、利用できる。この場合、その論理レコードは、 そのレコード名を含むファイルの論理レコードとしてだけではなく、そのSAME RECORD AREA句に指定した 他のファイルのレコードとしても利用できる。
形式 3 (相対ファイル)
  1. 乱呼出し法また動的呼出し法で処理しているファイルに関しては、オペレーティングシステムは、そのファイルの RELATIVE KEYデータ項目の内容によって指定されるレコードを論理的に置き換える。ファイル中に該当するレコードが存在しないと、無効キー条件が発生する(手続き部の章の無効キー条件節を参照。) この場合、更新処理は行われず、レコード領域中のデータは元のまま残る。
形式 3 (索引ファイル)
  1. 順呼出し法で処理しているファイルに関しては、書き換える対象のレコードは主レコードキーの値によって指定する。REWRITE文を実行するとき、置き換えようとするレコードの主レコードキー・データ項目中の値は、ファイルから最後に読み込んだレコードの主レコードキーの値と等しくなければならない。

  2. 乱呼出し法または動的呼出し法で処理しているファイルに関しては、書き換える対象のレコードは主レコードキー・データ項目の値によって指定する。

  3. これから書き換えられるレコードの副レコードキー・データ項目の内容は、置き換える側のものと違っていても構わない。オペレーティングシステムは、更新後にどのレコードキーを使用してもレコードを呼び出すことができるように、REWRITE文の実行中にレコードキー・データ項目の内容を使用する。

  4. 下記のどれかの場合に、無効キー条件が発生する。

    1. 順呼出し方式でファイルを処理しているときに、新しく置き換える側のレコードの主レコードキー・データ項目の値が、ファイルから最後に読み込んだレコードの主レコードキーの値と等しくない。

    2. 主レコードキー・データ項目の値と主レコードキーの値が一致するレコードが、ファイル中に存在しない。

    3. 副レコードキー・データ項目の値と副レコードキーの値が一致するレコードが、DUPLICATES句を指定していないファイルに関して、既にファイル中に存在する。

    上記の場合、更新処理は行われず、レコード領域中のデータは元のまま残る。(手続き部の章の無効キー条件節を参照。)

15.6 ROLLBACK(更新取消し)文

ROLLBACK(更新取消し)文は、実行単位によって押さえられているすべてのファイル中のすべてのレコードロックを解除する。

一般形式

一般規則

  1. ROLLBACK文を実行すると、実行単位によって押さえられているすべてのファイル中のすべてのレコードロックが解除される。

  2. 排他ファイル中のファイルロックは、ROLLBACK文の影響を受けない。

  3. 使用しているCOBOLシステムにおいて、SELECT文のWITH...ROLLBACK句が単なる注記ではなく実際に機能する場合、ROLLBACK文は下記の処理を行う。

    1. 現在のトランザクションを終了させる。

    2. 現在のトランザクションの処理中に行われたすべての変更を取り消す。

Copyright © 2002 Micro Focus International Limited. All rights reserved.
本書、ならびに使用されている固有の商標および商品名は国際法によって保護されています。


Previous 手続き部 - MERGE - OPEN 手続き部 - SEARCH - XML PARSE Next