13.3.2 インタフェース領域の形式
COBOL入出力サービスルーチンで使用するインタフェース領域を,次に示します。
インタフェース領域の名称 (構造体のtypedef名称) |
サイズ(バイト) |
用途 |
|
---|---|---|---|
AIX(32),Linux(x86)の場合 |
AIX(64),Linux(x64)の場合 |
||
管理情報インタフェース領域 (CBLCOMFL) |
256 |
312 |
|
パラメタインタフェース領域 (CBLPARMFL) |
32 |
48 |
|
- 〈この項の構成〉
(1) 管理情報インタフェース領域
管理情報インタフェース領域の形式を,「表13‒3 管理情報インタフェース領域の形式(1)」,および「表13‒4 管理情報インタフェース領域の形式(2)」に示します。
データ項目名 |
AIX(32),Linux(x86)の場合 |
AIX(64),Linux(x64)の場合 |
設定/参照する値 |
CBLOPENサービスルーチンでの指定 |
|||||||
---|---|---|---|---|---|---|---|---|---|---|---|
区分 |
名称 |
位置 |
長さ |
データ形式 |
位置 |
長さ |
データ形式 |
OUTPUT指定 |
OUTPUT以外 |
||
属性チェック無 |
属性チェック有 |
||||||||||
ファイル情報 |
ファイル編成とレコード形式 |
0 |
4 |
char[4] |
0 |
4 |
char[4] |
SAMF:順ファイル固定長レコード形式 SAMV:順ファイル可変長レコード形式 RELF:相対ファイル固定長レコード形式 RELV:相対ファイル可変長レコード形式 |
○ |
△※1 |
○ |
最大レコード長 |
4 |
4 |
int |
4 |
4 |
int |
レコード長 (固定長形式の場合レコード長) |
○ |
△※1 |
○ |
|
最小レコード長 |
8 |
4 |
int |
8 |
4 |
int |
レコード長 (固定長形式の場合は無視される) |
○ |
△ |
○ |
|
未使用 |
− |
− |
− |
12 |
4 |
char[4] |
サービスルーチン予備領域 |
NULL(X'00')を指定してクリアしておくこと |
NULL(X'00')を指定してクリアしておくこと |
NULL(X'00')を指定してクリアしておくこと |
|
ファイル名称アドレス |
12 |
4 |
char* |
16 |
8 |
char* |
オープンするファイル名称のアドレスファイル名称はNULLで終わる文字列とする。 CBLOPENサービスルーチンを呼び出す時だけ指定が必要。 CBLOPENサービスルーチンの呼び出しが成功したあと,CBLCLOSEサービスルーチン実行までの入出力文で,COBOL2002は,このアドレス,およびアドレスが指す領域を参照しない。 |
○ |
○ |
○ |
|
属性チェックオプション※2 |
16 |
1 |
char |
24 |
1 |
char |
|
− |
○ CBLCOM_NOCHK |
○ CBLCOM_CHK |
|
ファイルOPEN文のモード |
17 |
1 |
char |
25 |
1 |
char |
|
○ CBLCOM_OPEN_OUTPUT |
○ |
○ |
|
ファイル施錠モード |
18 |
1 |
char |
26 |
1 |
char |
|
○ |
○ |
○ |
|
ディスク書き込みオプション |
19 |
1 |
char |
27 |
1 |
char |
詳細は「13.6 COBOL入出力サービスルーチンでのディスク書き込み保証」を参照。 |
○ |
○ (読み取り専用では無視) |
○ (読み取り専用では無視) |
|
ファイルアクセスモード |
20 |
1 |
char |
28 |
1 |
char |
|
○ |
○ |
○ |
|
ラージファイル対応オプション |
21 |
1 |
char |
29 |
1 |
char |
|
○ |
○ |
○ |
|
未使用 |
22 |
6 |
char[6] |
30 |
10 |
char[10] |
サービスルーチン予備領域 |
○ NULL(X'00')を指定してクリアしておくこと |
○ NULL(X'00')を指定してクリアしておくこと |
○ NULL(X'00')を指定してクリアしておくこと |
- (凡例)
-
○:必ず指定する項目
△:COBOL2002が値を返す項目
−:無視される項目
- 注
-
表中の「CBLCOM_xxx」は,COBOL2002で使用できるインクルードファイル(CBL85fl.h)中で定義されているマクロです。CBL85fl.hファイルは,次のディレクトリの下に提供されています。
- AIX(32),Linux(x86)の場合
/opt/HILNGcbl2k/include/cbl
- AIX(64),Linux(x64)の場合
/opt/HILNGcbl2k64/include/cbl
- 注※1
-
順固定長ファイルに対して入出力する場合は,必ず指定してください。
- 注※2
-
順固定長ファイルではこの指定は無視され,レコード長に従います。
- 注※3
-
順ファイルでは手動施錠を指定できません。
表13‒4 管理情報インタフェース領域の形式(2) データ項目名
AIX(32),Linux(x86)の場合
AIX(64),Linux(x64)の場合
設定/参照する値
備考
区分
名称
位置
長さ
データ形式
位置
長さ
データ形式
エラー情報
入出力状態
(FILE STATUS)
28
2
short
40
2
short
0〜99
正常/エラーに関係なく,必ず値が返される。
返される値の詳細は「付録G 入出力状態の値」を参照
システムエラー情報有無
30
1
char
42
1
char
- CBLCOM_ERR_NOSYSTEM:
-
システムエラー情報なし
- CBLCOM_ERR_SYSTEM:
-
システムエラー情報有り
未使用
31
1
char
43
1
char
サービスルーチン予備領域
COBOLメッセージ番号
32
2
short
44
2
short
3001〜4099
COBOLエラーメッセージ番号
システムコール番号
34
2
short
46
2
short
1〜999
エラーとなったシステムコールを表すCOBOL2002が定める関数番号
システムエラー情報有りの場合に有効。
番号と内容については,マニュアル「COBOL2002 メッセージ」を参照
システムエラーコード
36
4
int
48
4
int
システムが返すエラーコード
システムエラー情報有りの場合に有効。
システムのマニュアルを参照
COBOLエラー詳細情報
40
1
char
52
1
char
インタフェース領域指定誤り,およびファイル属性エラー発生時の詳細情報
COBOLメッセージ番号が3701〜3703,および3801〜3803の場合に有効。
設定される値は,「表13‒5 COBOLエラー詳細情報の一覧」を参照
未使用
41
15
char[15]
53
15
char[15]
サービスルーチン予備領域
デバッグ情報
デバッグ情報出力指示
56
1
char
68
1
char
- CBLCOM_DBG_NO:
-
デバッグ情報を出力しない
- CBLCOM_DBG_BEF:
-
各入出力サービスルーチン実行の前にデバッグ情報を出力する
- CBLCOM_DBG_AFT:
-
各入出力サービスルーチン実行後にデバッグ情報を出力する
- CBLCOM_DBG_BEFAFT:
-
各入出力サービスルーチン実行の前とあとでデバッグ情報を出力する
未使用
57
11
char[11]
69
11
char[11]
サービスルーチン予備領域
ユーザ領域
68
16
char[16]
80
16
char[16]
プログラムで使用可能な領域。
COBOL2002では管理しない
システムで使用する領域
84
172
char[132]
char *[10]
96
216
char[136]
char *[10]
システムで使用する領域。
最初のオープンを実行する前にNULL(X'00')を指定してクリアしておく
NULL(X'00')クリア以降,この領域を更新してはならない
- 注
-
表中の「CBLCOM_xxx」は,COBOL2002で使用できるインクルードファイル(CBL85fl.h)中で定義されているマクロです。CBL85fl.hファイルは,次のディレクトリの下に提供されています。
- AIX(32),Linux(x86)の場合
/opt/HILNGcbl2k/include/cbl
- Linux(x64)の場合
/opt/HILNGcbl2k64/include/cbl
管理情報インタフェース領域のデータ項目に関する注意事項
- (a)属性チェックオプション
-
属性チェックオプションには,ファイルのオープン時に管理情報インタフェース領域の値とファイル実体の属性をチェックするかどうかを指定します。
- (i)属性をチェックしない場合
-
属性チェックオプションにCBLCOM_NOCHKを指定すると,ファイルの属性がチェックされません。この場合,CBLOPENサービスルーチンの呼び出し成功時に,ファイル実体に基づいて次のデータ項目が自動的に設定されます。
-
ファイル形式
順ファイル可変長レコード形式の場合 :SAMV
相対ファイル固定長レコード形式の場合:RELF
相対ファイル可変長レコード形式の場合:RELV
-
最大レコード長
-
最小レコード長
-
入出力状態
00が返されます。
ユーザは,設定されたデータ項目の値から,入出力に必要なバッファ領域を用意するようなプログラムを作成する必要があります。また,ファイル形式が妥当かどうかをユーザプログラム側で必ず判定するようにしてください。
-
- (ii)属性をチェックする場合
-
属性チェックオプションにCBLCOM_CHKを指定すると,次のデータ項目についてファイルの属性がチェックされます。
-
ファイル編成とレコード形式
-
最大レコード長
-
最小レコード長
また,CBLOPENサービスルーチンの呼び出し成功時に,入出力状態に00が返されます。
属性チェックの結果,管理情報インタフェース領域の設定とファイル実体の属性が一致しなかった場合,サービスルーチンはエラーの戻り値を返し,ファイルは開かれません。
-
- 注意事項
-
-
OPEN文のモードに「書き込み専用・新規作成(OPEN_OUTPUT)」を指定した場合,属性チェックオプションの指定は無視され,管理情報インタフェース領域に指定されたファイル編成,およびレコード長に従って新規にファイルが作成されます。
-
ファイル編成とレコード形式にSAMF(順ファイル固定長レコード形式)を指定した場合,属性チェックオプションの指定は無視され,指定したレコード長に従ってファイルの入出力処理が実行されます。
-
ファイル編成とレコード形式に順ファイル固定長レコード形式(SAMF)を指定しないで,かつ,属性チェックオプションにチェックしない(CBLCOM_NOCHK)を指定した場合,順固定長ファイルに対してCBLOPENサービスルーチンを実行すると,対象外ファイルとみなされます。
-
- (b)エラー情報
-
エラー情報に設定される値は,サービスルーチンの終了状態によって次のように異なります。
サービスルーチンの終了状態
入出力状態
COBOLメッセージ番号
システムエラー情報有無
システムコール番号/システムエラーコード
正常終了
00
0
なし
(CBLCOM_ERR_NOSYSTEM)
0
エラー発生
入出力状態を表す値
メッセージ番号
(0以外)
なし
(CBLCOM_ERR_NOSYSTEM)
0
あり
(CBLCOM_ERR_SYSTEM)
該当するコードが設定される
COBOLメッセージ番号,システムコール番号,およびシステムエラーコードの値は,COBOL2002が独自に定めた値,またはシステム固有のコードです。そのため,エラー発生時のプログラム実行制御には,入出力状態の値を使用してください。
- (c)COBOLエラー詳細情報
-
COBOLエラー詳細情報に返される情報,およびその意味を次に示します。
表13‒5 COBOLエラー詳細情報の一覧 COBOLメッセージ番号
エラー種別
マクロ名称
値
エラー項目/エラーの意味
3701
3801
管理情報インタフェース領域指定誤り
CBLCOM_ERRC_FORM
1
ファイル編成とレコード形式
CBLCOM_ERRC_MAX
2
最大レコード長
(最大レコード長の値が1〜1,073,741,799以外,または最小レコード長より小さい)
CBLCOM_ERRC_MIN
3
最小レコード長
(最小レコード長の値が1〜1,073,741,799以外)
CBLCOM_ERRC_PATH
4
ファイル名称アドレス
CBLCOM_ERRC_FLOPT
5
属性チェックオプション
CBLCOM_ERRC_OPEN
6
ファイルオープンモード
CBLCOM_ERRC_LOCK
7
ファイル施錠モード
CBLCOM_ERRC_FSYNC
8
ディスク書き込みオプション
CBLCOM_ERRC_DBGINF
9
デバッグ情報出力指示
CBLCOM_ERRC_ACCESS
10
ファイルアクセスモード
CBLCOM_ERRC_MSGBUFSIZ
11
メッセージ出力用バッファ長
CBLCOM_ERRC_LARGEFILE
12
ラージファイル対応オプション
3702
3802
パラメタインタフェース領域指定誤り
CBLCOM_ERRP_RDBUF
21
読み込みバッファアドレス
CBLCOM_ERRP_WRBUF
22
書き出しバッファアドレス
CBLCOM_ERRP_LOCK
23
WITH LOCK指定
CBLCOM_ERRP_KEY
24
レコード番号キー
CBLCOM_ERRP_ACCESS
25
レコード単位アクセスモード
CBLCOM_ERRP_KEYMODE
26
キー比較条件
3703
3803
ファイル属性エラー
CBLCOM_ERRF_CBL
41
ファイルフォーマット
(COBOL以外で作成したファイル,またはファイル破壊)
CBLCOM_ERRF_FORM
42
ファイル形式(ファイル編成,またはレコード形式)
CBLCOM_ERRF_MAX
43
最大レコード長
CBLCOM_ERRF_MIN
44
最小レコード長
インタフェース領域中の複数のデータ項目に誤りがある場合や,ファイルの属性チェックで複数の項目の属性が一致しなかった場合,COBOLエラー詳細情報には,最初に発見されたエラー項目に関する値が設定されます。
(2) パラメタインタフェース領域
パラメタインタフェース領域の形式を,次に示します。
データ項目名 |
AIX(32),Linux(x86)の場合 |
AIX(64),Linux(x64)の場合 |
設定/参照する値 |
各サービスルーチンでの指定 |
||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
区分 |
名称および意味 |
位置 |
長さ |
データ形式 |
位置 |
長さ |
データ形式 |
OP |
CL |
RE |
WR |
RW |
DE |
ST |
UN |
WD |
||
入出力パラメタ |
読み込みバッファ アドレス |
0 |
4 |
char * |
0 |
8 |
char * |
読み込んだレコードを格納する領域のアドレス |
− |
− |
○ |
− |
− |
− |
− |
− |
− |
|
読み込み サイズ |
4 |
4 |
int |
8 |
4 |
int |
読み込んだレコードの長さを返す |
− |
− |
△ |
− |
− |
− |
− |
− |
− |
||
未使用 |
− |
− |
− |
12 |
4 |
char[4] |
サービスルーチン予備領域 |
− |
− |
− |
− |
− |
− |
− |
− |
− |
||
書き出しバッファアドレス |
8 |
4 |
char * |
16 |
char * |
書き出すレコードのバッファアドレス |
− |
− |
− |
○ |
○ |
− |
− |
− |
− |
|||
書き出しサイズ |
12 |
4 |
int |
24 |
4 |
int |
書き出すレコードの長さ |
− |
− |
− |
○※1 |
○※1 |
− |
− |
− |
− |
||
相対レコード番号キー (RELATIVE KEY |
16 |
4 |
int |
28 |
4 |
int |
入出力対象レコードキー番号※2 |
ファイルアクセスモード:順アクセス |
− |
− |
△ |
△ |
N |
N |
○ |
− |
− |
|
ファイルアクセスモード:乱アクセス |
− |
− |
○ |
○ |
○ |
○ |
E |
− |
− |
|||||||||
ファイルアクセスモード:動的アクセス |
− |
− |
※3 |
○ |
○ |
○ |
○ |
− |
− |
|||||||||
WITH LOCK指定 |
20 |
1 |
char |
32 |
1 |
char |
CBLPARM_NOLOCK:レコード施錠要求なし(WITH NO LOCK) CBLPARM_LOCK:レコード施錠要求あり(WITH LOCK) レコード施錠の詳細は,マニュアル「COBOL2002 言語 標準仕様編」を参照 |
○ |
− |
○ |
− |
− |
− |
− |
− |
− |
||
レコード単位アクセスモード |
21 |
1 |
char |
33 |
1 |
char |
CBLPARM_ACCESS_NEXT:順アクセス(READ NEXT) CBLPARM_ACCESS_KEY:乱アクセス(READ KEY) |
− |
− |
○※4 |
− |
− |
− |
− |
− |
− |
||
キー比較条件 |
22 |
1 |
char |
34 |
1 |
char |
位置づける相対レコード番号とキー(key)の比較条件 CBLPARM_KEY_EQUAL:キーの値と等しい(EQUAL) CBLPARM_KEY_GREAT:キーの値より大きい(GREATER THAN) CBLPARM_KEY_NOTLESS:キーの値より小さくない(NOT LESS THAN) CBLPARM_KEY_GREATEQ:キーの値より大きいか,または等しい(GREATER THAN OR EQUAL) |
− |
− |
− |
− |
− |
− |
○ |
− |
− |
||
未使用 |
23 |
9 |
char[9] |
35 |
13 |
char[13] |
サービスルーチン予備領域 |
※5 |
※5 |
※5 |
※5 |
※5 |
※5 |
※5 |
※5 |
※5 |
- (凡例)
-
OP:CBLOPENサービスルーチン
CL:CBLCLOSEサービスルーチン
RE:CBLREADサービスルーチン
WR:CBLWRITEサービスルーチン
RW:CBLREWRITEサービスルーチン
DE:CBLDELETEサービスルーチン
ST:CBLSTARTサービスルーチン
UN:CBLUNLOCKサービスルーチン
WD:CBLWDISKサービスルーチン
○:必ず指定する項目
△:COBOL2002が値を返す項目
E:エラー(乱アクセス法の場合,CBLSTARTサービスルーチンは実行できない)
N:無視される項目(直前にCBLREADサービスルーチンの呼び出しが成功したレコードが対象となる)
−:無視される項目
- 注※1
-
固定長レコード形式の場合,このデータ項目の指定は無視されます。
- 注※2
-
入出力対象レコードキー番号について次に示します(○△だけ該当)。
-
最初のレコード番号は1,以降2,3,…となり1ずつ増えます。
-
このデータ項目の指定は,相対ファイルだけで有効となります。順ファイルで指定した場合は,無視されます。
-
順アクセスの場合,CBLREADサービスルーチンやCBLWRITEサービスルーチンによって読み書きされたレコードの,相対レコード番号が返されます。
-
乱アクセス,または動的アクセスの場合,入出力文を実行する前に入出力対象レコードの相対レコード番号を設定する必要があります。
-
- 注※3
-
ファイルアクセスモードが動的アクセスのCBLREADサービスルーチンを実行したときは,レコード単位アクセスモードの指定によって,順アクセスか乱アクセスかが決まります。
- 注※4
-
順ファイルの場合,このデータ項目の指定は無視されます。
- 注※5
-
最初にCBLOPENサービスルーチンを実行する前にNULL(X'00')を指定して,領域をクリアしておく必要があります。
パラメタインタフェース領域のデータ項目に関する注意事項
- (a)レコード単位アクセスモード
-
レコード単位アクセスモードには,相対ファイルに対するCBLREADサービスルーチンの実行が,順アクセスか,乱アクセスかを指定します。順ファイルに対してこの項目を指定した場合,指定は無視され,常に順アクセスとなります。
レコード単位アクセスモードに指定する値による動作の違いを,次に示します。
指定する値
レコード単位
アクセスモード
指定可能な
ファイルアクセスモード
(CBLOPENサービスルーチン実行時の指定)
動作
CBLPARM_ACCESS_NEXT
順アクセス
-
順アクセス法
-
動的アクセス法
次のどちらかのレコードを読み込む。
-
直前のCBLREADサービスルーチンによって位置づけられたレコードの,次のレコード
-
直前のCBLSTARTサービスルーチンによって位置づけられたレコード
ただし,CBLOPENサービスルーチンを実行した直後の場合は,有効な先頭レコードを読み込む。
CBLPARM_ACCESS_KEY
乱アクセス
-
乱アクセス法
-
動的アクセス法
相対レコード番号キーに指定した番号のレコードを読み込む。
レコードのアクセスモードが順アクセスの場合,直前のCBLREADサービスルーチン,またはCBLSTARTサービスルーチンがエラー(パラメタエラーを含む)になると,それに続くCBLREADサービスルーチンもエラーになります。
-
- (b)キー比較条件
-
キー比較条件には,相対ファイルに対するCBLSTARTサービスルーチンで,位置づける相対レコード番号とキーの比較条件を指定します。キー比較条件の指定値と意味を,次に示します。
指定する値
比較条件
対応するCOBOL START文のKEY指定
位置づけるレコード(以下の条件を満たさない時はエラー)
CBLPARM_KEY_EQUAL
キーの値と等しい
KEY IS EQUAL TO
(KEY IS = TO)
相対レコード番号がキーと等しいレコード
CBLPARM_KEY_GREAT
キーの値より大きい
KEY IS GREATER THAN
(KEY IS > )
相対レコード番号がキーの値より大きい最初のレコード
CBLPARM_KEY_NOTLESS
キーの値より小さくない
KEY IS NOT LESS THAN
(KEY IS NOT < )
相対レコード番号がキーの値より小さくない最初のレコード
CBLPARM_KEY_GREATEQ
キーの値より大きいか,または等しい
KEY IS GREATER THAN
OR EQUAL TO
(KEY IS >= )
相対レコード番号がキーの値より大きいか,または等しい最初のレコード