ファイル入出力の概要

ファイル位置指示子

ファイル位置指示子(file position indicator)は、ファイルに一連の入出力操作を施している際に、次に呼び出されるレコードを指す働きをする。ファイル位置指示子の設定に影響する文は、CLOSE, OPEN, START, READだけである。出力モードまたは拡張モードで開かれたファイルに対しては、ファイル位置指示子は影響を及ぼさない。

入出力状態

ファイル管理記述項にFILE STATUS句を指定すると、ファイル入出力操作の結果を示す2文字のデータ項目がとられる。OPEN, CLOSE, READ, WRITE, DELETE, UNLOCK, STARTの各文を実行すると、その 結果を示す値がこのデータ項目に設定される。実行する条件に該当するUSE手続きがある場合、それが実行される前にこの値が設定される。

以下に記述するファイル状態キーは、ANSI標準に全面的に準拠したものであるとともに、このCOBOLシステムで使用できる拡張機能を、何も使用していないファイルに関するものである。

たとえば、拡張機能を使用してファイルをLINE SEQUENTIALと指定すると、返される状態キーに影響が出る。詳しいことは関連する動詞の箇所に説明してある。

状態キー 1

FILE STATUSデータ項目の左端の文字を、状態キー1という。どのような編成のものでも、ファイルの入出力操作が終了すると、このデータ項目に下記の条件のどれかを示す値が設定される。

"0" - 正常終了(successful completion)
"1" - ファイル終了(at end)
"2" - 無効キー(invalid key)
"3" - 永続誤り(permanent error)

"4"

- 論理誤り(logic error)
"9" - ランタイム・システム・エラーメッセージ(run-time system error message)

上記の各条件の意味は下記のとおり。

"0" 正常終了: 入出力文の実行が正常に完了した。
"1" ファイル終了: 順呼出しのREAD文の実行が不成功に終わった。その理由は2通りある。ファイル中に次の論理レコードが存在しない。または、OPTIONAL句が記述されているファイルに対して最初のREAD文が実行されたが、 OPEN文を実行した時点でそのファイルがそのプログラムで利用可能でなかった。
"2" 無効キー: 順ファイルでないファイルに対する入出力文の実行が不成功に終わった。その理由としては、下記のものがある。

順序に誤りがある
重複キーがある
レコードが見つからない
区域外書き出しが行われた

"3" 永続誤り: 入出力文の実行が不成功に終わった。その理由は2通りある。 順ファイルに対して区域外書き出しが行われた。または、奇偶検査誤りや伝送誤りのような入出力誤りがあった。
"4"

論理誤り: 入出力文の実行が不成功に終わった。その理由は2通りある。ファイルに対する入出力操作の順序が不適切である。 または、利用者によって設定されている制限を超えた処理が行われた。

"9" ランタイム・システム・エラーメッセージ: ランタイム・システムによって定義されているエラーメッセージ条件が発生したために、入出力文の実行が不成功に終わった。状態キー1または状態キー1と状態キー2の組合せによって予め定義されている条件に該当しない条件が発生した場合にだけ、この状態値が使用される。

状態キー 2

FILE STATUSデータ項目の右端の文字を、状態キー2という。状態キー2は入出力操作の結果の、さらに詳細を示すために使用される。

状態キー1と状態キー2の組合せによって、入出力操作の結果が下記のように細かく定義される。

正常終了

状態キー1の値が"0" で、入出力操作が正常に終了したことが示されている場合、状態キー2にはその原因を示す下記のどれかの値が設定される。

"0" (すべてのファイル)それ以上詳しい情報はない。
"2" (索引ファイルだけ)下記の2通りの可能性を示す。

  • READ文で読み込んだレコードの参照キーの値が、その索引における次のレコードの参照キーと等しい。

  • WRITE文またはREWRITE文によって書かれたレコードの副レコードキーの値が、最低1つ既にファイルに存在している。ただし、その副レコードキーには重複が許されている。
"4"

(すべてのファイル)処理したレコードの長さが、そのファイルのファイル固有属性に従っていない。

"5"

(すべてのファイル)OPEN文が実行されたとき、参照した不定ファイルが存在しない。

"7"

(レコード順ファイルだけ)NO REWIND, REEL/UNIT, FOR REWINDのどれかの指定を伴うCLOSE文、またはNOREWIND指定を伴うOPEN文が実行されたが、対象となったファイルはリール/ユニット媒体ではない。

ファイル終了条件による不成功

状態キー1の値が"1" で、ファイル終了条件(at end condition)が発生したことが示されている場合、状態キー2にはその原因を示す下記のどれかの値が設定される。

"0"

(すべてのファイル)次の論理レコードが存在しないことを示す。この条件が発生する場合は下記の2通りある。

  • ファイルの末尾に到達した。

  • 不定入力ファイル(optional input file)に対して、順呼出しREAD文が初めて実行されたが、対象とするファイルが存在しない。
"4"

(相対ファイルだけ)使用された相対レコード番号の桁数が、ファイル用に定義されている相対キーデータ項目の桁数よりも大きい。

無効キー条件による不成功

状態キー1の値が "2" で、無効キー条件(invalid key condition)が発生したことが示されている場合、状態キー2にはその原因を示す下記のどれかの値が設定される。

"1" 索引ファイルを順呼び出しした場合)順序誤り(sequence error)があったことを示す。その原因は、次の2通りある。連続するキーの値が昇順になっていなかった。 (手続き部 - SEARCH - XML PARSEの章のWRITE(書き出し)文節を参照。)または、READ文が正常に実行されてからREWRITE文が実行されるまでの間に、そのファイルの主レコードキーが変更された。
"2" (相対ファイルおよび索引ファイルだけ)キーの値が重複することを示す。その原因は、次の2通りある。主レコードキーの値が重複になるレコードを書き込もうとした。または、副レコードキーにDUPLICATES指定がなされていないのに、副レコードキーの値が重複になるレコードを書き込みまたは書き換えようとした。
"3" (相対ファイルおよび索引ファイルだけ)レコードが見つからなかったことを示す。その原因は、次の2通りある。レコードを呼び出すときに指定したキーに対応するレコードが、ファイル中に存在しなかった。または、不定入力ファイルに対してSTART文またはREAD文を実行したが、対象とするファイルが存在しなかった。
"4" 相対ファイルおよび索引ファイルだけ)区域外書き出し(boundary violation)条件が発生したことを示す。その原因は、次の2通りある。

  • 外部的に定義されているファイル境界を超えて、レコードを書き込もうとした。

  • 相対ファイルに対して順書き込みのWRITE文が実行されたが、使用された相対レコード番号の桁数が、ファイに定義されている相対キーデータ項目の桁数よりも大きい。

永続誤り条件による不成功

状態キー1の値が"3" で、永続誤り条件(permanent error condition)が発生したことが示されている場合、状態キー2にはその原因を示す下記のどれかの値が設定される。

"0" (すべてのファイル)誤りの原因について、それ以上詳しい情報はないことを示す。
"4" (順ファイルだけ)区域外書き出し条件が発生したことを示す。つまり、外部的に定義されているファイル境界を超えて、レコードを書き込もうとした。
"5" (すべてのファイル)INPUT、I-O、またはEXTENDのどれかの指定を伴うOPEN文が実行されたが、対象となる不定でないファイルが存在しないことを示す。
"7" EXTENDのどれかの指定を伴うOPEN文が実行されたが、対象となる不定でないファイルが存在しないことを示す。 その理由には下記のものがある。

  • EXTEND指定またはOUTPUT指定がなされたが、対象となるファイルには出力操作を行うことはできない。

  • I-O指定がなされたが、対象となるファイルには入出力両用モードで開かれた相対ファイル適用できる入出力操作を行うことはできない。

  • INPUT指定がなされたが、対象となるファイルには入力操作を行うことはできない。
"8" (すべてのファイル)閉じてロック(施錠)されているファイルに対して、OPEN文を実行しようとしたことを示す。
"9" (レコード順、相対、索引ファイル)ファイル固有属性(fixed file attribute)とプログラム中でファイルに対して指定された属性との間に、矛盾が検出されたことを示す。

論理誤り条件による不成功

状態キー1の値が "4" で、論理誤り条件(logic error condition)が発生したことが示されている場合、状態キー2にはその原因を示す下記のどれかの値が設定される。

"1" (すべてのファイル)既に開かれているファイルに対して、OPEN文を実行しようとしたことを示す。
"2" (すべてのファイル)開かれていないファイルに対して、CLOSE文を実行しようとしたことを示す。
"3" (すべてのファイルに関して、順呼出しの場合だけ)DELETE文またはREWRITE文を実行しようとしたが、その直前の入出力操作としてREAD文が実行され正常終了していない。
"4" (レコード順ファイルだけ)区域外書き出しが発生したことを示す。その原因として考えられるのは、対象のファイルのRECORD IS VARYING句によって認められている最大レコードよりも長いか最小レコードよりも短いレコードを、WRITEまたはREWRITEしようとしたことである。
"5" (すべてのファイル)ファイルのレコードをREWRITEしようとしたが、元のレコードの大きさと書き換えレコードの大きさが等しくない。

行順ファイルの場合、このレコードの大きさは、空白を除去しタブを圧縮し空文字を挿入した後のレコードの物理的な大きさを指す。この場合、新しいレコードの物理的な大きさが元のレコードよりも小さくなってもよい。

"6" (すべてのファイル)入力モードまたは入出力両用モードで開かれているファイルに対して、順呼出しのREAD文を実行しようとしたが、有効な次のレコードが存在しないことを示す。その原因としては、下記のものがある。

  • 先行するSTART文が不成功であった。

  • 先行するREAD文がファイル終了以外の条件で不成功であった。

  • 先行するREAD文によってファイルの末尾に達した。
"7" (すべてのファイル)入力モードまたは入出力両用モードで開かれていないファイルに対してREAD文またはSTART文を実行しようとしたことを示す。
"8" (すべてのファイル)入出力両用モード、出力モード、拡張モードのどれかで開かれていないファイルに対してWRITE文を実行しようとしたか、または順呼出し法の入出力両用モードで開かれたファイルに対してWRITE文を実行しようとしたことを示す。
"9" (すべてのファイル)入出力両用モードで開かれていないファイルに対して、DELELTE文またはREWRITE文を実行しようとしたことを示す。

ランタイム・システムによるエラーメッセージ

状態キー1の値が" 9" で、作成者が定義したエラーメッセージが発生したことが示されている場合、 状態キー2には該当するエラーメッセージ番号が2進数で設定される。エラーメッセージについて詳しくは、使用しているCOBOLシステムのマニュアルを参照。

状態キー1と2の有効な組合わせ

以下の表で、 "S" はレコード順ファイル、

"L " は行順ファイル、

"R" は相対ファイル、"I" は索引ファイルを示す。

表 10-4中の状態キー1の行と状態キー2の列が交差する部分に文字が記されている場合に、そのファイル編成に関してその状態キー1と状態キー2の組合せが有効である。

> 表 10-4:状態キー1と2の有効な組合わせ
状態キー 1 状態キー 2
0 1 2 3 4 5 6 7 8 9
正常終了 0 SRIL   I   SRIL SRIL   S    
ファイル終了 1 SRIL       R          
無効キー 2   I RI RI RI          
永続誤り 3 SRIL       SL SRIL   SRIL SRIL SRI
論理誤り 4   SRIL SRIL SRIL SRIL   SRIL SRIL SRIL SRIL
作成者定義 9 ランタイムシステムのエラーメッセージ (SRIL)

ファイル終了条件

READ文を実行した結果、ファイル終了条件が発生することがある。その原因の詳細については、手続き部 - PERFORM - ROLLBACK の章のREAD(読み込み)文節を参照。

無効キー条件

START文、READ文、WRITE文、REWRITE文、DELETE文を実行した結果、無効キー条件が発生することがある。その原因の詳細については、手続き部 - PERFORM - ROLLBACK の章のREAD(読み込み)文 およびREWRITE(書き換え)文手続き部 - SEARCH - XML PARSEの章のSTART(開始)文 および WRITE(書き出し)文の各節を参照。

入出力文に指定された入出力操作が実行された後で無効キー条件が発生すると、下記の動作が記してある順に行われる。

  1. 該当ファイルにFILE STATUSデータ項目を指定してあると、そこに無効キー条件の内容を示す値が設定される。(前述の入出力状態の節を参照。)

  2. 無効キー条件を引き起こした文の中にINVALID KEYを指定してあると、制御はINVALID KEY指定中の無条件文に移される。該当ファイルにUSE手続きが指定されていても、実行されない。

  3. 無効キー条件を引き起こした文の中にINVALID KEYを指定しないで、該当ファイルにUSE手続きが明示的または暗黙的に指定されていると、その手続きが実行される。

無効キー条件が発生すると、そのことを認識する入出力文は不成功となる。この場合、ファイルは影響を受けない。

状態キー1に"9" が設定されたときは、INVALID KEY指定によって誤りが捕らえられるのではないことに注意。この場合は、明示的に状態キーを検査するか、または宣言部分を使用して、別途誤りを捕られなければならない。

マルチユーザーシステム上でのファイルの共有

ランタイムシステム(RTS)では、このCOBOLシステムのマルチユーザー機能をサポートしている。このマルチユーザー機能によって、マルチユーザー環境下で利用者がファイルを共有すること、あるプログラムがデータを更新する間は他のプログラムが該当するファイル全体またはそのレコードをアクセスできないようにすることが可能になる。

シングルユーザー環境下では、マルチユーザー用の構文は実行時に効力を発揮しない。しかし、シングルユーザーとマルチユーザーの両方の環境で使用できるように、プログラムを作成しておくことができる。

ファイルはアクティブか非アクティブのどちらかの状態をとる。アクティブ・ファイルとはいくつかの実行単位に対して開かれているものである。非アクティブ・ファイルとはどの実行単位に対しても開かれていないものである。

アクティブ・ファイルには、排他モード(exclusive mode)と共有モード(sharable mode)の2つのモードがある。

ファイルの共有方法は、以下に示すファイル構成に影響される。

ファイルへのアクセスを共有する各実行単位は、そのファイル中の単一のレコードまたは複数のレコードをロックすることができる。ただし、1つの実行単位が同じファイルに対して、単一レコードのロックと複数レコードのロックの両方を選択することはできない。

単一レコードのロック

あるファイルに対して(明示的にまたは暗黙的に)単一レコードのロックを指定した実行単位は、一時点ではそのファイル中の1レコードだけをロックできる。実行単位がレコードロックを獲得する方法には、手動と自動の2通りがある。

ロック解除はロックした実行単位によって、下記のどれかの方法によって行われる。

複数レコードのロック

ファイル編成が相対か索引かレコード順の場合にだけ、複数レコードをロックできる。

複数レコードをロックすることを指定した実行単位は、1つのファイル中で同時に何件ものレコードロックを保持できる。他の実行単位は、ロックされているレコードを更新したりロックしたりすることができなくなる。しかし、他の実行単位がロックされていないレコードへのアクセスを拒否されるわけではない。実行単位がレコードロックを獲得する方法には、手動と自動の2通りがある。

ロック解除はロックした実行単位によって、下記のどれかの方法によって行われる。

省略時解釈のレコードロック

表 10-5、10-6、および10-7 に、ファイル編成別にファイルをオープンするモードごとの省略時解釈のロック型を示す。 この省略時解釈のロック型は、 プログラムをCOBOLに投入するときにAUTOLOCK指令を設定することによって、変更できる 。また、表には、個々のファイルごとに、省略時解釈のロック型を変更することができるか否かについても示す。ファイルごとにロック型を変更するには、そのファイルのSELECT句中に適切な句を挿入する 。(構文の詳細については、環境部の章のファイル管理記述項節を参照。)

X/Open では、自動ロックでの単一レコードロック、またはマニュアルロックでの複数レコードロックのどちらかを使用する原始プログラムに従う X/Open を制限している。

>表 10-5: レコード順ファイルの省略時解釈のロック型
開くモード 指令なし AUTOLOCKコンパイラ
指令
SELECT文での変更
INPUT ロックなし ロックなし 可、ただし排他へだけ
I-O 排他 単一レコードのロック
OUTPUT 排他 排他 不可
EXTEND 排他 ロックなし 可、ファイルを共有可できるがレコードはロックできない
>表 10-6: 行順ファイルの省略時解釈のロック型
開くモード 指令なし AUTOLOCKコンパイラ指令
SELECT文での変更
INPUT ロックなし ロックなし 不可
I-O 排他 ロックなし 不可
OUTPUT 排他 排他 不可
EXTEND 排他 ロックなし 不可
>表 10-7: 相対ファイルおよび索引ファイルの省略時解釈のロック型
開くモード 指令なし AUTOLOCKコンパイラ指令
SELECT文での変更
INPUT ロックなし ロックなし 可、ただし排他へだけ
I-O 排他 単一レコードの自動ロック
OUTPUT 排他 排他 不可
EXTEND 排他 排他 不可


注:

  1. 出力用に開いたファイルは、指定したロックのモードにかかわりなく、排他モードとされる。

  2. プログラマは、省略時解釈のロック方式(表 4-15, 4-16, 4-17を参照)を受け入れるか、またはファイル管理記述項にLOCK MODE句 (環境部ファイル管理記述項節を参照) を含めるかして、ロックの型を選択できる。