ファイル位置指示子(file position indicator)は、ファイルに一連の入出力操作を施している際に、次に呼び出されるレコードを指す働きをする。ファイル位置指示子の設定に影響する文は、CLOSE, OPEN, START, READだけである。出力モードまたは拡張モードで開かれたファイルに対しては、ファイル位置指示子は影響を及ぼさない。
ファイル管理記述項にFILE STATUS句を指定すると、ファイル入出力操作の結果を示す2文字のデータ項目がとられる。OPEN, CLOSE, READ, WRITE, DELETE, UNLOCK, STARTの各文を実行すると、その 結果を示す値がこのデータ項目に設定される。実行する条件に該当するUSE手続きがある場合、それが実行される前にこの値が設定される。
以下に記述するファイル状態キーは、ANSI標準に全面的に準拠したものであるとともに、このCOBOLシステムで使用できる拡張機能を、何も使用していないファイルに関するものである。
たとえば、拡張機能を使用してファイルをLINE SEQUENTIALと指定すると、返される状態キーに影響が出る。詳しいことは関連する動詞の箇所に説明してある。
FILE STATUSデータ項目の左端の文字を、状態キー1という。どのような編成のものでも、ファイルの入出力操作が終了すると、このデータ項目に下記の条件のいずれかを示す値が設定される。
"0" | - 正常終了(successful completion) |
"1" | - ファイル終了(at end) |
"2" | - 無効キー(invalid key) |
"3" | - 永続誤り(permanent error) |
"4" |
- ![]() |
"9" | - ランタイム システム エラー メッセージ(run-time system error message) |
上記の各条件の意味は下記のとおり。
FILE STATUSデータ項目の右端の文字を、状態キー2という。状態キー2は入出力操作の結果の、さらに詳細を示すために使用される。
状態キー1と状態キー2の組合せによって、入出力操作の結果が下記のように細かく定義される。
正常終了
状態キー1の値が"0" で、入出力操作が正常に終了したことが示されている場合、状態キー2にはその原因を示す下記のいずれかの値が設定される。
"0" | (すべてのファイル)それ以上詳しい情報はない。 |
"2" | (索引ファイルだけ)下記の2通りの可能性を示す。
|
"4" |
|
"5" |
|
"7" |
|
状態キー1の値が"1" で、ファイル終了条件(at end condition)が発生したことが示されている場合、状態キー2にはその原因を示す下記のいずれかの値が設定される。
"0" | (すべてのファイル)次の論理レコードが存在しないことを示す。この条件が発生する場合は下記の2通りある。
|
"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" |
![]()
|
状態キー1の値が"3" で、永続誤り条件(permanent error condition)が発生したことが示されている場合、状態キー2にはその原因を示す下記のいずれかの値が設定される。
"0" | (すべてのファイル)誤りの原因について、それ以上詳しい情報はないことを示す。 |
"4" | (順編成ファイルだけ)区域外書き出し条件が発生したことを示す。つまり、外部的に定義されているファイル境界を超えて、レコードを書き込もうとした。 |
"5" |
![]() |
"7" |
![]()
|
"8" |
![]() |
"9" |
![]() |
状態キー1の値が "4" で、論理誤り条件(logic error condition)が発生したことが示されている場合、状態キー2にはその原因を示す下記のいずれかの値が設定される。
"1" | (すべてのファイル)既に開かれているファイルに対して、OPEN文を実行しようとしたことを示す。 |
"2" | (すべてのファイル)開かれていないファイルに対して、CLOSE文を実行しようとしたことを示す。 |
"3" | (すべてのファイルに関して、順呼び出しの場合だけ)DELETE文またはREWRITE文を実行しようとしたが、その直前の入出力操作としてREAD文が実行され正常終了していない。 |
"4" | (レコード順編成ファイルだけ)区域外書き出しが発生したことを示す。その原因として考えられるのは、対象のファイルのRECORD IS VARYING句によって認められている最大レコードよりも長いか最小レコードよりも短いレコードを、WRITEまたはREWRITEしようとしたことである。 |
"5" | (すべてのファイル)ファイルのレコードをREWRITEしようとしたが、元のレコードの大きさと書き換えレコードの大きさが等しくない。
|
"6" | (すべてのファイル)入力モードまたは入出力両用モードで開かれているファイルに対して、順呼び出しのREAD文を実行しようとしたが、有効な次のレコードが存在しないことを示す。その原因としては、下記のものがある。
|
"7" | (すべてのファイル)入力モードまたは入出力両用モードで開かれていないファイルに対してREAD文またはSTART文を実行しようとしたことを示す。 |
"8" | (すべてのファイル)入出力両用モード、出力モード、拡張モードのいずれかで開かれていないファイルに対してWRITE文を実行しようとしたか、または順呼び出し法の入出力両用モードで開かれたファイルに対してWRITE文を実行しようとしたことを示す。 |
"9" | (すべてのファイル)入出力両用モードで開かれていないファイルに対して、DELELTE文またはREWRITE文を実行しようとしたことを示す。 |
状態キー1の値が" 9" で、作成者が定義したエラー メッセージが発生したことが示されている場合、 状態キー2には該当するエラー メッセージ番号が2進数で設定される。エラー メッセージについて詳しくは、使用しているCOBOLシステムのマニュアルを参照。
以下の表で、 "S" はレコード順編成ファイル、
"L " は行順編成ファイル、
"R" は相対ファイル、"I" は索引ファイルを示す。
表 10-4中の状態キー1の行と状態キー2の列が交差する部分に文字が記されている場合に、そのファイル編成に関してその状態キー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に"9" が設定されたときは、INVALID KEY指定によって誤りが捕らえられるのではないことに注意。この場合は、明示的に状態キーを検査するか、または宣言部分を使用して、別途誤りを捕られなければならない。
ランタイム システム(RTS)では、このCOBOLシステムのマルチユーザー機能をサポートしている。このマルチユーザー機能によって、マルチユーザー環境下で利用者がファイルを共有すること、あるプログラムがデータを更新する間は他のプログラムが該当するファイル全体またはそのレコードをアクセスできないようにすることが可能になる。
シングルユーザー環境下では、マルチユーザー用の構文は実行時に効力を発揮しない。しかし、シングルユーザーとマルチユーザーの両方の環境で使用できるように、プログラムを作成しておくことができる。
ファイルはアクティブか非アクティブのどちらかの状態をとる。アクティブ ファイルとはいくつかの実行単位に対して開かれているものである。非アクティブ ファイルとはどの実行単位に対しても開かれていないものである。
アクティブ ファイルには、排他モード(exclusive mode)と共有モード(sharable mode)の2つのモードがある。
排他モードにあるファイルは、1つの実行単位にだけ開かれている。他の実行単位はそのファイルにアクセスしようとすると、「ファイルロック」誤りを引き起こし、アクセスを拒否される。排他モードということは、1つの実行単位だけがファイルの鍵(ファイルロック)を保持していて、そのファイルにアクセスできるということである。実行単位においてそのファイルが閉じられると、そのファイルのロックが解除(release)される。
共有モードにあるファイルは、任意の数の実行単位に開かれている。各実行単位は、ファイルを使用する間その中のレコードを一時に何件かロック(施錠)することによって、データを保護できる。他の実行単位は、ロック(施錠)されている個々のレコードの鍵(レコード ロック)を取得できなくなる。しかし、その点を除けば、他の実行単位がファイルにアクセスできなくなるわけではない。ファイルの編成によって、ファイルを共有できる形態に違いが生じる。
ファイルの共有方法は、以下に示すファイル構成に影響される。
入力用に開かれたレコード順編成ファイルは、いくつかの実行単位で共有できる。しかし、そのファイル中のレコードをロックすることはできない。入出力両用または拡張用に開かれたファイルもまた、いくつかの実行単位で共有することができる。この場合は、各実行単位はそのファイルに関してレコード ロックをいくつか保持できる。出力用に開かれたファイルは、常に排他的にロックされている。
入力用または拡張用に開かれた行順編成ファイルは、いくつかの実行単位で共有できる。しかし、そのファイル中のレコードをロックすることはできない。出力用に開かれたファイルは、常に排他的にロックされている。
入力モードで開かれた行順編成ファイルは、いくつかの実行単位で共有できる。しかし、そのファイル中のレコードをロックすることはできない。入出力両用モードで開かれたファイルも、共有できる。しかし、出力用または拡張用に開かれたファイルは、排他的である。
ファイルへのアクセスを共有する各実行単位は、そのファイル中の単一のレコードまたは複数のレコードをロックすることができる。ただし、1つの実行単位が同じファイルに対して、単一レコードのロックと複数レコードのロックの両方を選択することはできない。
あるファイルに対して(明示的にまたは暗黙的に)単一レコードのロックを指定した実行単位は、一時点ではそのファイル中の1レコードだけをロックできる。実行単位がレコード ロックを獲得する方法には、手動と自動の2通りがある。
READ WITH LOCK文によってレコードを呼び出した場合にだけ、実行単位はレコード ロックを取得できる。
ファイル中のレコードを読むときに、実行単位はレコード ロックを自動的に取得する。ただし、READ WITH NO LOCK文を使用した場合は、例外である。
ロック解除はロックした実行単位によって、下記のいずれかの方法によって行われる。
ファイル編成が相対か索引かレコード順の場合にだけ、複数レコードをロックできる。
複数レコードをロックすることを指定した実行単位は、1つのファイル中で同時に何件ものレコード ロックを保持できる。他の実行単位は、ロックされているレコードを更新したりロックしたりすることができなくなる。しかし、他の実行単位がロックされていないレコードへのアクセスを拒否されるわけではない。実行単位がレコード ロックを獲得する方法には、手動と自動の2通りがある。
READ WITH LOCK文 またはREAD WITH KEPT LOCK文によってレコードを呼び出した場合にだけ、実行単位はレコード ロックを取得できる。
ファイル中のレコードを読むときに、実行単位はレコード ロックを自動的に取得する。ただし、ロックしないことを明示的に指定した場合は、例外である。プログラムをCOBOLシステムに投入したときにWRITELOCK指令を設定しておくと、WRITE文またはREWRITE文によって実行単位がファイルにアクセスすると、ロックされる。
ロック解除はロックした実行単位によって、下記のいずれかの方法によって行われる。
表 10-5、10-6、および10-7 に、ファイル編成別にファイルをオープンするモードごとの省略時解釈のロック型を示す。 この省略時解釈のロック型は、 プログラムをCOBOLに投入するときにAUTOLOCK指令を設定することによって、変更できる 。また、表には、個々のファイルごとに、省略時解釈のロック型を変更することができるか否かについても示す。ファイルごとにロック型を変更するには、そのファイルのSELECT句中に適切な句を挿入する 。(構文の詳細については、環境部の章のファイル管理記述項節を参照。)
X/Open では、自動ロックでの単一レコード ロック、またはマニュアルロックでの複数レコード ロックのどちらかを使用する原始プログラムに従う
X/Open を制限している。
開くモード | 指令なし | AUTOLOCKコンパイラ 指令 |
SELECT文での変更 |
INPUT | ロックなし | ロックなし | 可、ただし排他へだけ |
I-O | 排他 | 単一レコードのロック | 可 |
OUTPUT | 排他 | 排他 | 不可 |
EXTEND | 排他 | ロックなし | 可、ファイルを共有可できるがレコードはロックできない |
開くモード | 指令なし | AUTOLOCKコンパイラ指令 |
SELECT文での変更 |
INPUT | ロックなし | ロックなし | 不可 |
I-O | 排他 | ロックなし | 不可 |
OUTPUT | 排他 | 排他 | 不可 |
EXTEND | 排他 | ロックなし | 不可 |
開くモード | 指令なし | AUTOLOCKコンパイラ指令 |
SELECT文での変更 |
INPUT | ロックなし | ロックなし | 可、ただし排他へだけ |
I-O | 排他 | 単一レコードの自動ロック | 可 |
OUTPUT | 排他 | 排他 | 不可 |
EXTEND | 排他 | 排他 | 不可 |
注: