REWRITE(書き換え)文は、ディスク・ファイル中に存在するレコードを論理的に置き換える。
一般形式
形式 1 (行順ファイル)
形式 2 (レコード順ファイル)
形式 3 (相対ファイルおよび索引ファイル)
指令およびランタイム・スイッチ
予約語リストにフラグを付けたり修正したりするコンパイラ指令に加えて、下記の指令によって、この項に記述した構文または意味が影響を受ける可能性がある。
WRITE-LOCK - 複数のレコード・ロックを使用するときに、REWRITE文用のレコード・ロックを取得する。
下記のランタイム・スイッチによって、この項に記述した意味が影響を受ける可能性がある。
N - 行順レコードを書くときに、制御文字の前の空文字の挿入を制御する。
T - 行順レコードを書くときに、タブ文字の挿入を制御する。
構文規則
すべての形式 (すべてのファイル)
一意名が関数一意名である場合、英数字関数を参照しなければならない。一意名が関数一意名でない場合、
レコード名と一意名が、同じ記憶領域を指してはならない。
レコード名は、データ部のファイル節の中の論理レコードの名前である。レコード名は修飾してもよい。
レコード名は、浮動小数点数項目または2バイト文字項目であってもよい。
一意名は、USAGE DISPLAY-1(DBCS)項目または浮動小数点数項目であってもよい。
形式 3 (相対ファイルおよび索引ファイル)
順呼出し法でファイルを処理している場合には、REWRITE文にはINVALID KEYを指定できない。
ただし、順呼出し法で索引ファイルを処理している場合には、REWRITE文にINVALID KEYを指定してもよい。
乱呼出し法または動的呼出し法でファイルを処理しているが、そのファイルに適用できるUSE手続きを指定していない場合には、REWRITE文にINVALID KEYを指定する。
一般規則
すべての形式 (すべてのファイル)
該当するレコード名のレコードが含まれるファイルは、ディスク・ファイルとする。この文を実行する時点では、入出力モードで開いておく。(手続き部 の章のOPEN(開く)文 節を参照。)
ファイルを順呼出し法で処理している場合、REWRITE文を実行する前に実行した直前の入出力文は、正常に終了したREAD文でなければならない。オペレーティングシステムは、READ文によって呼び出されたレコードを論理的に置き換える。
FROM指定をしたREWRITE文を実行することは、
MOVE 一意名 TO レコード名
を実行し、それからFROM指定をしないREWRITE文を実行することと同じである。暗黙のMOVE文が実行される前のレコード領域の内容は、REWRITE文の実行に影響を及ぼさない。
ファイル位置指示子は、REWRITE文の実行の影響を受けない。
REWRITE文を実行すると、更新対象のファイルに対応するFILE STATUSデータ項目を指定してあれば、その値が更新される。 (手続き部 の章の入出力状態 節を参照。)
END-REWRITE指定は、REWRITE文の範囲を区切る。
書き換えようとするレコードが他の実行単位によってロックされていると、REWRITE文の実行は不成功に終わる。
形式 1 および 2 (順ファイル)
レコード名のレコードの文字数は、新しい書き換え用のレコードの文字数と等しくする。
注: 圧縮された順ファイルにはREWRITE文を使用しないように勧める。その理由は、圧縮された新しいレコードの長さが圧縮された古いレコードの長さと同じでないと、REWRITE処理は正常に終了しないからである。
REWRITE文の実行が正常に終了すると、レコード領域中の論理レコードは解放され、利用できなくなる。ただし、対応するファイルを SAME RECORD AREA句に指定しておけば、利用できる。この場合、その論理レコードは 、そのファイルの論理レコードとしてだけではなく、そのSAME RECORD AREA句に指定した
他のファイルのレコードとしても、利用できる。
形式 1 (行順ファイル)
書き込もうとするレコードの圧縮された長さが、元の圧縮されたレコードの長さ以下のとき、REWRITE文を使用して正常に終了させることができる。ここで、圧縮された長さとは、後行の空白を削除しタブを圧縮し空文字を挿入したものを指す。レコードを読み込むと、空文字とタブ文字が拡張されて、レコードの長さが長くなる。
形式 3 (相対ファイルおよび索引ファイル)
REWRITE文の実行が正常に終了すると、レコード領域中の論理レコードは解放され、利用できなくなる。ただし、対応するファイルをSAME RECORD AREA句に指定しておけば、利用できる。この場合、その論理レコードは、 そのレコード名を含むファイルの論理レコードとしてだけではなく、そのSAME RECORD AREA句に指定した
他のファイルのレコードとしても利用できる。
形式 3 (相対ファイル)
乱呼出し法また動的呼出し法で処理しているファイルに関しては、オペレーティングシステムは、そのファイルの RELATIVE KEYデータ項目の内容によって指定されるレコードを論理的に置き換える。ファイル中に該当するレコードが存在しないと、無効キー条件が発生する(手続き部 の章の無効キー条件 節を参照。) この場合、更新処理は行われず、レコード領域中のデータは元のまま残る。
形式 3 (索引ファイル)
順呼出し法で処理しているファイルに関しては、書き換える対象のレコードは主レコードキーの値によって指定する。REWRITE文を実行するとき、置き換えようとするレコードの主レコードキー・データ項目中の値は、ファイルから最後に読み込んだレコードの主レコードキーの値と等しくなければならない。
乱呼出し法または動的呼出し法で処理しているファイルに関しては、書き換える対象のレコードは主レコードキー・データ項目の値によって指定する。
これから書き換えられるレコードの副レコードキー・データ項目の内容は、置き換える側のものと違っていても構わない。オペレーティングシステムは、更新後にどのレコードキーを使用してもレコードを呼び出すことができるように、REWRITE文の実行中にレコードキー・データ項目の内容を使用する。
下記のどれかの場合に、無効キー条件が発生する。
順呼出し方式でファイルを処理しているときに、新しく置き換える側のレコードの主レコードキー・データ項目の値が、ファイルから最後に読み込んだレコードの主レコードキーの値と等しくない。
主レコードキー・データ項目の値と主レコードキーの値が一致するレコードが、ファイル中に存在しない。
副レコードキー・データ項目の値と副レコードキーの値が一致するレコードが、DUPLICATES句を指定していないファイルに関して、既にファイル中に存在する。
上記の場合、更新処理は行われず、レコード領域中のデータは元のまま残る。(手続き部 の章の無効キー条件 節を参照。)