次の構文を使用すると、プログラムでファイルハンドラを明示的に呼び出すことができます。
call "EXTFH" using opcode fcd
各パラメータの内容は次のとおりです。
"EXTFH" | ファイルハンドラインターフェイスのモジュール名です。 |
opcode | ファイルハンドラのオペレーションコードです。後述の『オペレーションコード』を参照してください。 |
fcd | ファイルハンドラがアクセスするファイルの詳細を保持する FCD (ファイル制御記述) と呼ばれるデータ領域です。後述の『データ構造体』を参照してください。 |
最初の呼び出しの前に、次の手順を行う必要があります。
その後で、各ファイルハンドラ操作に対して次の手順を行います。
ファイルハンドラでは、ファイルの入出力操作中に次の 4 つのデータ構造体を使用します。
FCD は 使用中のファイルに関する情報が記述されているデータ領域です。
レコード領域は、レコードの読み取りや書き出しを行うデータ領域です。
ファイル名領域は、使用中のファイルの名前を記述するデータ領域で、オペレーティングシステムにより認識されます。
キー定義ブロックには、ファイルハンドラが索引ファイルの操作中に索引キー情報を記述します。
ファイル制御記述 (FCD) は、使用中のファイルに関する情報を記述するデータ領域です。Server Express 2.0 では、FCD の形式が FCD2 から FCD3 に変更されました。64 ビットのコンパイルでは、FCD3 形式のみを使用できます。32 ビットのコンパイルでは、FCD2 および FCD3 の両方の形式を使用できます。
コピー ファイル、 XFHFCD.CPY は、プログラムが P64 指令でコンパイルされている場合に FCD3 レコードを定義します。プログラムが P64 指令でコンパイルされていない場合は、XFHFCD.CPY は FCD2 レコードを定義します。FCD3 レコードは、ファイル、 xfhfcd3.cpy で直接、無条件に定義されます。また、 FCD2 レコードは、ファイル、 xfhfcd2.cpy で直接、無条件に定義されます。
ファイルハンドラを使用するには、プログラムで FCD をセットアップし、該当するフィールド (オペレーションコードによってフィールドが異なります) への入力とファイルハンドラの呼び出しを行います。FCD の該当フィールドに入力を行うと、ファイルハンドラがプログラムに情報を返します。
FCD で未使用の領域や予約済みの領域は、バイナリのゼロに設定する必要があります。
ファイルオープン呼び出しに使用した FCD はその後、このファイルに対してアクセスするときに必ず使用する必要があります。1 つのファイルに対して複数のオープン操作を実行できますが、各オープン操作ごとに別の FCD を使用する必要があります。
FCD には、レコード領域、ファイル名領域、キー定義ブロックへのポインタ (USAGE POINTER データ項目) を記述します。
FCD に含まれているフィールドを次の表に示します。フラグについては、該当のビットが有効な場合について説明しています。ビット 7 が MSB (左端) です。未使用のビットは将来使用するために予約されています。
フィールド名 | タイプ | フィールドの説明 | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
fcd-file-status | ユーザファイルの状態。このフィールドは、COMMIT または ROLLBACK 操作以外のすべての操作の後に、操作の状態を通知する標準のファイル状態値で更新されます。『fcd-access-mode』および『fcd-status-type』も参照してください。 | |||||||||||||||||||||||||||||||
fcd-status-key-1 | pic x | |||||||||||||||||||||||||||||||
fcd-status-key-2 | pic x | |||||||||||||||||||||||||||||||
fcd-length | pic xx comp-x | FCD の長さ。FCD3 の場合のみ。 | ||||||||||||||||||||||||||||||
fcd-version | pic x comp-x | バージョン番号
|
||||||||||||||||||||||||||||||
fcd-organization | pic x comp-x | ファイルの編成
|
||||||||||||||||||||||||||||||
fcd-access-mode | pic x comp-x | ユーザ状態インジケータとアクセスモードインジケータ。
ユーザ状態は、ビット 7 で示されます。ビット 7 は、ファイル状態を定義した場合に設定されます。ファイル状態を定義すると、一部の操作 (RETRYLOCK など) の実行方法に影響する場合があります。このビットは、ファイルハンドラを直接呼び出す場合に設定する必要があります。ただし、ファイル状態は、fcd-file-status から直接取得します。 アクセスモードは、次に示すビット 6~0 で示されます。
|
||||||||||||||||||||||||||||||
fcd-open-mode | pic x comp-x | オープンモード
ファイルを開く前にこのフィールドを 128 に設定する必要があります。 |
||||||||||||||||||||||||||||||
fcd-recording-mode | pic x comp-x | レコードモード
|
||||||||||||||||||||||||||||||
fcd-file-format | pic x comp-x | ファイル形式
|
||||||||||||||||||||||||||||||
fcd-device-flag | pic x comp-x | デバイスフラグ
|
||||||||||||||||||||||||||||||
fcd-lock-action | pic x comp-x | 予約済みフィールド | ||||||||||||||||||||||||||||||
fcd-data-compress | pic x comp-x | データ圧縮ルーチンインジケータ
|
||||||||||||||||||||||||||||||
fcd-blocking | pic x comp-x | 次の値で示される NODESIZE (バイト数)
|
||||||||||||||||||||||||||||||
fcd-idxcache-size | pic x comp-x | キャッシュされたメモリに格納されている索引ノードの数。4~64 の数値を指定する必要があります。0 に設定すると、デフォルトの 16 が使用されます。 | ||||||||||||||||||||||||||||||
fcd-percent | pic x comp-x | パーセントインジケータ | ||||||||||||||||||||||||||||||
fcd-block-size | pic x comp-x | データレコードのブロックサイズ (バイト数)
索引ファイルと相対ファイルについては、ゼロ以外の値を設定するとパフォーマンスが低下する場合があります。 |
||||||||||||||||||||||||||||||
fcd-flags-1 | pic x comp-x |
|
||||||||||||||||||||||||||||||
fcd-flags-2 | pic x comp-x |
|
||||||||||||||||||||||||||||||
fcd-mvs-flags | pic x comp-x | メインフレームエミュレーションフラグ
|
||||||||||||||||||||||||||||||
fcd-status-type | pic x comp-x | 状態の種類
ビット 1 と 2 は、オープン時にファイルハンドラによって設定されるかまたは設定解除されます。これは、N および T ランタイムシステムスイッチの設定によって決まります。これらのビットは、OPEN 操作の後に設定または設定解除して、N および T ランタイムシステムスイッチをオーバーライドすることができます。 |
||||||||||||||||||||||||||||||
fcd-other-flags | pic x comp-x |
|
||||||||||||||||||||||||||||||
fcd-trans-log | pic x comp-x |
|
||||||||||||||||||||||||||||||
fcd-locktypes | pic x comp-x |
|
||||||||||||||||||||||||||||||
fcd-fs-flags | pic x comp-x | Fileshare フラグ
|
||||||||||||||||||||||||||||||
fcd-config-flags | pic x comp-x |
|
||||||||||||||||||||||||||||||
fcd-misc-flags | pic x comp-x |
|
||||||||||||||||||||||||||||||
fcd-config-flags2 | pic x comp-x |
|
||||||||||||||||||||||||||||||
fcd-lock-mode | pic x comp-x | 共有可能なファイル用のロックモードフラグ
|
||||||||||||||||||||||||||||||
fcd-shr2 | pic x comp-x | その他のフラグ
|
||||||||||||||||||||||||||||||
fcd-nls-id | pic xx comp-x | NLS 識別子 | ||||||||||||||||||||||||||||||
fcd-fs-file-id | pic xx comp-x | 予約済みフィールド | ||||||||||||||||||||||||||||||
fcd-retry-open-count | pic xx comp-x | RETRYOPEN 回数フィールド | ||||||||||||||||||||||||||||||
fcd-name-length | pic xx comp-x | ファイル名の長さ | ||||||||||||||||||||||||||||||
fcd-idxname-length | pic xx comp-x | 予約済みフィールド | ||||||||||||||||||||||||||||||
fcd-retry-count | pic xx comp-x | 再試行回数 (RETRYLOCK がオンの場合に使用) | ||||||||||||||||||||||||||||||
fcd-key-id | pic xx comp-x | 参照キー (索引ファイルの場合)。
このフィールドでは、ランダム READ 操作に使用する参照キーを識別します。主キーを指定するには、このフィールドをゼロに設定します。例えば、最初に定義された副キーを指定するには、値 1 を使用します。2 番目に定義された副キーを指定するには、値 2 を使用します。 |
||||||||||||||||||||||||||||||
fcd-line-count | pic xx comp-x | 行数 (順ファイルの場合)。
このフィールドでは、ファイルの書込み時にスキップする行の数を指定します。例えば、次のようになります。 WRITE AFTER ADVANCING line-count LINES |
||||||||||||||||||||||||||||||
fcd-use-give | pic xx comp-x | 予約済みフィールド | ||||||||||||||||||||||||||||||
fcd-key-length | pic xx comp-x | 有効なキーの長さ。
索引ファイルで START 操作を使用している場合は、キー全体ではなく、キーの先頭部分のみを指定できます。このフィールドは、比較で使用するバイト数に設定する必要があります。このフィールドには、ゼロよりも大きく、使用中のキーよりも小さい値を指定する必要があります。 |
||||||||||||||||||||||||||||||
fcd-current-rec-len | FCD3: pic x(4) comp-x | 現在のレコードの長さ (バイト数) | ||||||||||||||||||||||||||||||
FCD2: pic x(2) comp-x | ||||||||||||||||||||||||||||||||
fcd-min-rec-length | pic x(4) comp-x | 最小レコード長 (バイト数) | ||||||||||||||||||||||||||||||
fcd-max-rec-length | pic x(4) comp-x | 最大レコード長 (バイト数) | ||||||||||||||||||||||||||||||
fcd-session-id | pic x(4) comp-x | 予約済みフィールド | ||||||||||||||||||||||||||||||
fcd-reladdr-offset | FCD3: pic x(8) comp-x | 相対バイトアドレス (『fcd-config-flags、ビット 4』も参照)。このフィールドの値は、OPEN 文の後には定義されません。 | ||||||||||||||||||||||||||||||
FCD2: pic x(4) comp-x | ||||||||||||||||||||||||||||||||
fcd-reladdr-big | pic x(8) comp-x | 8 バイトの相対バイトアドレス。FCD2 の場合は、個別フィールドになります。FCD3 の場合は、fcd-reladdr-offset を再定義します。FCD2 と FCD3 の間の互換性のために指定します。 | ||||||||||||||||||||||||||||||
fcd-max-rel-key | pic x(8) comp-x | 最大相対キー | ||||||||||||||||||||||||||||||
fcd-relative-key | pic x(8) comp-x | 相対キー | ||||||||||||||||||||||||||||||
fcd-handle | pointer | ファイルハンドル | ||||||||||||||||||||||||||||||
fcd-record-address | pointer | レコード領域へのポインタ | ||||||||||||||||||||||||||||||
fcd-filename-address | pointer | ファイル名領域へのポインタ | ||||||||||||||||||||||||||||||
fcd-idxname-address | pointer | 予約済みフィールド | ||||||||||||||||||||||||||||||
fcd-key-def-address | pointer | キー定義ブロックへのポインタ | ||||||||||||||||||||||||||||||
fcd-col-seq-address | pointer | 文字の大小順序へのポインタ (何も指定されていない場合はヌル) | ||||||||||||||||||||||||||||||
fcd-fildef-address | pointer | 予約済みフィールド | ||||||||||||||||||||||||||||||
fcd-dfsort-address | pointer | 予約済みフィールド |
レコード領域は、レコードの読み取りと書き出しを行うデータ領域です。
レコード領域のサイズは、ファイルの最大レコードよりも 4 バイト大きい必要があります。
次の例は、FCD にレコード領域へのポインタを設定する方法を示しています。
01 RECORD-AREA PIC X(85). ... SET FCD-RECORD-ADDRESS TO ADDRESS OF RECORD-AREA ...
ファイル名領域は、使用中のファイルの名前を記述するデータ領域で、オペレーティングシステムにより認識されます。
ドライブやパスの情報だけではなく、ファイルの実際の名前も記述することができます。名前の最後は空白文字でなければなりません。
このファイル名領域は、ファイルに対する最初の操作より前に記述する必要があります。
次の例は、FCD でファイル名領域へのポインタを設定する方法を示します。
01 FILENAME-AREA PIC X(65) VALUE "master.dat". ... MOVE 65 TO FCD-NAME-LENGTH SET FCD-FILENAME-ADDRESS TO ADDRESS OF FILENAME-AREA ...
キー定義ブロックは、索引ファイルを開くときに、ファイルハンドラに索引キー情報を渡すために使用します。キー定義ブロックは、次に示す 3 つのデータ領域で構成されます。
グローバル情報領域には、キー定義領域のサイズとファイルに含むキーの数を記述します。
未使用の領域や予約済みの領域はバイナリのゼロに初期化する必要があります。
オフセット | サイズ | フィールドの説明 |
---|---|---|
0 | 2 | キー定義ブロックの長さ |
2 | 4 | 予約済みフィールド。バイナリのゼロに設定する必要があります。 |
6 | 2 | キー数 |
8 | 6 | 予約済みフィールド。バイナリのゼロに設定する必要があります。 |
キー定義領域には、索引ファイルで使用するキーを記述します。
キー定義領域は、グローバル情報領域の次に配置され、ファイルにある各キーにつきキー定義を 1 つ記述します。
すべてのキーは、構成要素より前に定義する必要があります。
キー位置の順序に基づいてキーを識別するため、キーを定義する順序は重要です。例えば、主キーと 2 つの副キーを持つ索引ファイルがある場合は、キー定義領域に 3 つのキー定義を記述します。この場合、主キーをキー 0、最初の副キーをキー 1、2 番目の副キーをキー 2 とします。
次に、キー定義領域のレイアウトを示します。未使用の領域や予約済みの領域はすべてバイナリゼロに初期化する必要があります。
オフセット | サイズ | フィールドの説明 | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2 | 構成要素数。
通常のキーの場合、構成要素数は 1 になります。分割キーの場合、構成要素数は分割キーに含まれる構成要素の数になります。 |
||||||||||||||
2 | 2 | このキーの最初の構成要素定義領域に対するオフセット。
このオフセットは、グローバル情報領域の開始位置の相対位置になり、0 から開始します。 |
||||||||||||||
4 | 1 | キーフラグ
|
||||||||||||||
5 | 1 | 圧縮フラグ
|
||||||||||||||
6 | 1 | スパース文字。
キーフラグのビット 1 (オフセット 4) を設定すると、この文字で全体が構成されているキーは削除されます。 |
||||||||||||||
7 | 9 | 予約済みフィールド。バイナリゼロに設定する必要があります。 |
構成要素定義領域は、キー定義領域の後にあります。
この領域では、各キーの構成要素を定義します。分割キー以外の各キーは、1 つの構成要素から成り立ち、各構成要素をそれぞれ定義する必要があります。
構成要素の定義では、キー構成要素の位置と長さを指定します。
数字キーの場合は、構成要素定義領域を使用して、数値の型を指定することができます。その後で、IXNUMKEY コンパイラ指令を使用すると、数値の型にしたがってキーを順序付けることができます (デフォルトでは、キーが英数字順に並びます)。
構成要素定義領域のレイアウトを次に示します。未使用の領域や予約済みの領域はバイナリゼロに初期化する必要があります。
オフセット | サイズ | 説明 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | ビット 7 (x"80") は、順番に返される重複を示します。 ビット 6 (x"40") は DESCENDING キー構成要素を示します。 |
||||||||||||||||||||||||||||
1 | 1 |
ビット 7 (x"80") はこのフィールドが NUMERIC であることを示します。 |
||||||||||||||||||||||||||||
ビット 7 を設定すると (数値) 、次のようになります。
|
||||||||||||||||||||||||||||||
2 | 4 | レコード内の構成要素のオフセット (0 から開始) | ||||||||||||||||||||||||||||
6 | 4 | 構成要素の長さ (バイト数) |
プログラムで通常の COBOL 構文を使用してファイルの入出力操作を行う場合、各ファイルに対してファイル制御記述 (FCD) が自動的に作成されます。この自動的に作成された FCD にアクセスするには、FCDREG コンパイラ指令でプログラムをコンパイルします。これにより、FCD の読み取りや変更、FCD を使用したファイルハンドラの明示的な呼び出しなどが可能になります。
FCD にアクセスするには、プログラムの連絡節に FCD 定義を設定する必要があります。FCD 定義の例は、ファイル XFHFCD.CPY (Infomgr を使用して検索できます) に保存されています。プログラムで次の SET 文を使用すると、読み取りや変更を行う FCD にこの定義をマップすることができます。
set address of fcd to address of fh--fcd of file
各パラメータの内容は次のとおりです。
fcd | プログラムの連絡節に記述する FCD 定義の名前。 |
fh--fcd | (ハイフンが 2 つ必要です。) ファイルにアクセスするために、この COBOL システムで使用する FCD。 |
file | ファイルの FD 名。 |
この SET 操作に続けて、連絡部で設定した FCD のデータ項目にアクセスすると、ファイルの FCD へアクセスすることができます。
同様に、次のように指定すると、キー定義ブロックにアクセスすることができます。
set address of kdb to address of fh--keydef of file
kdb | プログラムの連絡節で記述するキー定義ブロックの名前。 |
fh--keydef | (ハイフンが 2 つ必要なことに注意してください。) ファイルにアクセスするために、この COBOL システムで使用するキー定義。 |
file | ファイルの FD 名。 |
次に、FCD へのアクセス例を示します。
次のプログラムでは、ファイルのキー定義ブロックで適切なビットを設定して、ファイルのキー圧縮を有効化します。
$set fcdreg select masterfile assign to ... organization is indexed record key is rec-key alternate key is m-alt-key-1 with duplicates alternate key is m-alt-key-2 alternate key is m-alt-key-3 with duplicates. select indexfile assign to ... organization is indexed record key is rec-key alternate key is t-alt-key-1 with duplicates. ... working-storage section. ... linkage section. 01 key-def-block. 03 filler pic x(6). 03 key-count pic 9(4) comp-x. 03 filler pic x(6). 03 key-def occurs 1 to 4 times depending on key-count. 05 filler pic x(5). 05 key-compression pic 9(2) comp-x. 05 filler pic x(10). ... procedure division. set address of key-def-block to address of fh--keydef of masterfile move 6 to key-compression (1) move 7 to key-compression (2) move 6 to key-compression (3) move 7 to key-compression (4) open I-O masterfile ... set address of key-def-block to address of fh--keydef of indexfile move 4 to key-compression (1) move 1 to key-compression (2) open input indexfile
ファイルハンドラが実行するファイル操作は、2 バイトのオペレーションコードで識別します。
オペレーションコードには、標準と特殊の 2 種類があります。
標準オペレーションコードでは、MSB に x"FA" が格納されます。LSB は、特定の操作を示します。
特殊オペレーションコードでは、MSB に x"00" が格納されます。LSB は、特定の操作を示します。
標準オペレーションコードでは、MSBに x"FA" が格納されます。LSB は、特定の操作を示します。
オペレーションコードの中には、特定のファイル編成でのみ有効なものがあります。各オペレーションコードの説明では、次のキーを使用して、対応するファイル編成のリストを示します。
L 行順
S レコード順 (vS を含む)
R 相対 (vR を含む)
I 索引
vS 可変形式の順のみ
vR 可変形式の相対のみ
必要に応じてオプションのリワインドおよびロックを使用し、ファイルおよびリールまたはユニットの処理を終了します。レコード順ファイルの場合は、「リール」および「ユニット」という用語を同じ意味で使用します。順ディスクファイルは、テープまたは似たような順メディアのファイルと同等に扱われます。
オペコード | 操作 | ファイルタイプ |
---|---|---|
80 | CLOSE | L S R I |
81 | CLOSE WITH LOCK | L S R I |
82 | CLOSE WITH NO REWIND | L S |
84 | CLOSE REEL/UNIT | L S |
85 | CLOSE REEL/UNIT FOR REMOVAL | L S |
86 | CLOSE REEL/UNIT WITH NO REWIND | L S |
なし
fcd-file-status | ユーザファイルの状態 |
実行ユニットによって保持されているすべてのファイルのレコードロックをすべて解除します。
オペコード | 操作 | ファイルタイプ |
---|---|---|
DC | COMMIT (すべてのファイルの UNLOCK) | L S R I |
ファイルが使用する FCD が常に必要です。
なし
レコードをディスクファイルから論理的に削除します。このコードは、相対または索引編成のファイルに対してのみ指定できます。
オペコード | 操作 | ファイルタイプ |
---|---|---|
F7 | DELETE | vS R I |
fcd-relative-key | 相対レコード番号への順アクセス以外のアクセス (R) |
fcd-record-address | レコードポインタへの順アクセス以外のアクセス (I) |
fcd-file-status | ユーザファイルの状態 |
指定されたファイルを、そのファイルが常駐している物理デバイスから物理的に削除します。
オペコード | 操作 | ファイルタイプ |
---|---|---|
F8 | DELETE FILE | L S R I |
ファイル名領域
fcd-organization | ファイル編成 |
fcd-name-length | ファイル名の長さ |
fcd-file-format | ファイル形式 |
fcd-filename-address | ファイル名領域へのポインタ |
fcd-file-status | ユーザファイルの状態 |
ファイルの処理を開始します。また、ラベルのチェックまたは書込み (およびその両方) およびその他の入出力操作も実行します。
オペコード | 操作 | ファイルタイプ |
---|---|---|
00 | OPEN INPUT | L S R I |
01 | OPEN OUTPUT | L S R I |
02 | OPEN I-O | L S R I |
03 | OPEN EXTEND | L S R I |
04 | OPEN INPUT WITH NO REWIND | L S |
05 | OPEN OUTPUT WITH NO REWIND | L S |
08 | OPEN INPUT REVERSED | L S |
ファイル名領域
キー定義ブロック (I)
fcd-organization | ファイル編成 |
fcd-access-mode | アクセスモード |
fcd-open-mode | オープンモード |
fcd-name-length | ファイル名の長さ |
fcd-lock-mode | ロックモードフラグ |
fcd-other-flags | その他のフラグ |
fcd-file-format | ファイル形式 |
fcd-max-rec-length | 最大レコード長 |
fcd-recording-mode | レコードモード |
fcd-min-rec-length | 最小レコード長 |
fcd-filename-address | ファイル名領域へのポインタ |
fcd-key-def-address | キー定義ブロックへのポインタ (I) |
fcd-data-compress | データ圧縮 |
fcd-locktypes | 言語間ロック |
fcd-file-status | ユーザファイルの状態 |
fcd-open-mode | オープンモード |
fcd-handle | このファイルに対するすべての順アクセスに対してこのファイルハンドルを使用します。 |
同じ物理ファイルにいくつかの FCD を割り当てて、それらのファイルを同時に開くことができます。オペレーティングシステムでは、これを 1 つの開かれたファイルとしてカウントします。物理ファイルは、その物理ファイルに割り当てたすべての論理ファイルが閉じてから、閉じます。
順アクセスの場合は、READ によりファイルから次または前の論理レコードを利用できます。ランダムアクセスの場合は、READ によりディスクファイルから指定したレコードを利用できます。
オペコード | 操作 | ファイルタイプ |
---|---|---|
8D | READ (順) WITH NO LOCK | L S R I |
D8 | READ (順) WITH LOCK | L S R I |
D9 | READ (順) WITH KEPT LOCK | L S R I |
F5 | READ (順) | L S R I |
8C | READ PREVIOUS WITH NO LOCK | R I |
DE | READ PREVIOUS WITH LOCK | R I |
DF | READ PREVIOUS WITH KEPT LOCK | R I |
F9 | READ PREVIOUS | R I |
8E | READ (ランダム) WITH NO LOCK | R I |
DA | READ (ランダム) WITH LOCK | R I |
DB | READ (ランダム) WITH KEPT LOCK | R I |
F6 | READ (ランダム) | R I |
8F | READ (直接) WITH NO LOCK | L S R I |
D6 | READ (直接) WITH LOCK | L S R I |
D7 | READ (直接) WITH KEPT LOCK | L S R I |
C9 | READ (直接) | L S R I |
F1 | READ (位置) | L S R I |
fcd-relative-key | READ がランダムまたは直接の場合の相対レコード数 (R) |
fcd-key-id | キー識別子 (I) |
fcd-record-address | レコード領域へのポインタ |
fcd-file-status | ユーザファイルの状態 |
fcd-current-rec-len | 現在のレコード長 |
fcd-reladdr-offset or fcd-rel-addr-big (FCD2 のみ) | 相対バイトアドレス |
実行ユニットで保持されているすべてのファイルのレコードロックをすべて解除します。
オペコード | 操作 | ファイルタイプ |
---|---|---|
DD | ROLLBACK (すべてのファイルを UNLOCK) | L S R I |
なし
なし
レコードの順検索について、相対ファイルまたは索引ファイルの論理位置決めに対する基礎を提供します。
オペコード | 操作 | ファイルタイプ |
---|---|---|
E8 | START 完全な長さの主キーと等価 | R I |
E9 | START 任意のキーまたはレコード番号と等価 | R I |
EA | START ~より大きい(>) | R I |
EB | START 以上 (>=) | R I |
FE | START 未満 (<) | R I |
FF | START 以下 (<=) | R I |
fcd-relative-key | 相対レコード番号 (相対ファイル) |
fcd-key-id | キー識別子 (索引ファイル) |
fcd-key-length | 有効なキーの長さ (索引ファイル) |
fcd-record-address | レコード領域へのポインタ |
fcd-file-status | ユーザファイルの状態 |
次の物理レコードへ進みます。この操作によって、レコードへのアクセスが大幅に高速化されます。
オペコード | 操作 | ファイルタイプ |
---|---|---|
90 | STEP NEXT WITH NO LOCK | L S R I |
D4 | STEP NEXT WITH LOCK | L S R I |
D5 | STEP NEXT WITH KEPT LOCK | L S R I |
CA | STEP NEXT | L S R I |
92 | STEP FIRST WITH NO LOCK | L S R I |
D0 | STEP FIRST WITH LOCK | L S R I |
D1 | STEP FIRST WITH KEPT LOCK | L S R I |
CC | STEP FIRST | L S R I |
fcd-record-address | レコード領域へのポインタ |
fcd-file-status | ユーザファイルの状態 |
STEP 操作は、相対ファイルまたは索引ファイルのレコードを順番に検索するための方法です。この操作では、キーまたは相対レコード番号を使用して読み取る必要はありません。通常、この方法を使用するとファイル内のデータへのアクセスが高速化されます。
STEP NEXT 操作によって、 (STEP または READ 操作により) ファイルで最後に検索されたレコードの次に物理的に格納されるレコードが返されます。
相対バイトアドレス指定を使用し、アクセスしたばかりのレコードに対して現在のレコードポインタが更新されるように指定している場合は、STEP 操作がこの新しい位置に対して実行されます。
相対バイトアドレスは、すべての STEP 操作で返されます。そのため、検索したばかりのレコードに対する現在のレコードポインタを更新する必要がある場合は、返されたアドレスを使用して READ (直接) 操作を実行します。
注: 現在のレコードポインタは、STEP 操作に影響されません。
指定したファイルに対し実行ユニットで保持されているすべてのレコードロックを解除します。
オペコード | 操作 | ファイルタイプ |
---|---|---|
0E | UNLOCK | L S R I |
なし
fcd-file-status | ユーザファイルの状態 |
新しいレコードをファイルへ書き込みます。
順ファイルの場合は、論理ページの垂直行の位置決めにも使用できます。
REWRITE 操作は既存のレコードを置き換えます。
オペコード | 操作 | ファイルタイプ |
---|---|---|
E1 | WRITE BEFORE | L S |
E2 | WRITE AFTER | L S |
E3 | WRITE BEFORE TAB | L S |
E4 | WRITE AFTER TAB | L S |
E5 | WRITE BEFORE PAGE | L S |
E6 | WRITE AFTER PAGE | L S |
EC | WRITE BEFORE mnemonic-name | S |
ED | WRITE AFTER mnemonic-name | S |
F3 | WRITE | L S R I |
F4 | REWRITE | L S R I |
fcd-relative-key | 相対レコード番号 (R) |
fcd-current-rec-len | 現在のレコード長 |
fcd-line-count | 行数 (WRITE のみ) (S) |
fcd-record-address | レコード領域へのポインタ |
fcd-file-status | ユーザファイルの状態 |
fcd-reladdr-offset or fcd-rel-addr-big (FCD2 のみ) | 相対バイトアドレス |
特殊オペレーション コードでは、MSB に x"00" が格納されます。LSB は、特殊操作を示します。
すべてのファイル編成について一般的なファイル情報を返し、索引ファイルについてファイルキーに関する情報をキー定義ブロックの形式で返します。
オペコード | 操作 | ファイルタイプ |
---|---|---|
06 | Return file information | I vS vR |
fcd-organization | ファイル編成 (x"FF" を指定可能) |
fcd-name-length | ファイル名の長さ |
fcd-filename-address | ファイル名領域へのポインタ |
fcd-key-def-address | キー定義ブロックへのポインタ (I) |
キー定義ブロック (I)
fcd-file-status | ユーザファイルの状態 |
fcd-organization | ファイル編成 |
fcd-file-format | ファイル形式 |
fcd-max-rec-length | 最大レコード長 |
fcd-recording-mode | レコードモード |
fcd-min-rec-length | 最小レコード長 |
fcd-file-status | ファイルサイズ |
fcd-data-compress | データ圧縮ルーチン |
返されるすべての情報を格納するためには、キー定義ブロックに十分な領域を割り当てる必要があります。十分な領域が割り当てられていないと、一部のデータ領域が破壊されます。
可変長の順ファイルおよび可変長の相対ファイルの場合は、キー定義情報が存在しません。
FCD の編成バイトを x"FF" に設定すると、ファイルタイプが判断されて、その関連情報セットが返されます。固定長の順ファイルが関連する場合は、このモードの操作は使用しないことをお奨めします。このモードでは、固定長の順ファイルの最初のレコードと可変長の順ファイルのヘッダーの違いを識別できません。ファイルタイプが非互換と判断されると、エラーコード 9/161 が返されます。
ファイルに新しい索引を追加するためのヘッダー情報のみを含む新しい .idx ファイルを作成します。
オペコード | 操作 | ファイルタイプ |
---|---|---|
07 |
Open new index |
I |
As OPEN
As OPEN
索引ファイルのデータファイル部分から次の物理レコードを取得します。
オペコード | 操作 | ファイルタイプ |
---|---|---|
08 |
Get next record |
I |
fcd-record-address | レコード領域へのポインタ |
fcd-file-status | ユーザファイルの状態 |
fcd-current-rec-len | 現在のレコード長 |
fcd-reladdr-offset or fcd-rel-addr-big (FCD2 only) | 相対バイトアドレス |
索引ファイルの索引ファイル部分にキー値を追加します。
オペコード | 操作 | ファイルタイプ |
---|---|---|
09 |
Add key value |
I |
fcd-key-id | キー識別子 |
fcd-record-address | レコード領域へのポインタ |
fcd-file-status | ユーザファイルの状態 |
提供されたキー定義ブロックを使用してファイルの索引を再作成します。
オペコード | 操作 | ファイルタイプ |
---|---|---|
0B |
Re-index file |
I |
fcd-key-def-address | キー定義ブロックへのポインタ |
なし
特定のファイルのすべてのデータをディスクに書き出します。
オペコード | 操作 | ファイルタイプ |
---|---|---|
0C |
Flush file |
L S R I |
なし
なし
ファイル内の特定のレコードをロック解除します。
オペコード | 操作 | ファイルタイプ |
---|---|---|
0F |
Unlock record |
I |
fcd-record-address | レコード領域へのポインタ |
なし
レコードの相対バイトアドレスは、特定のレコードに対するすべてのファイルハンドラの操作で FCD の fcd-reladdr-offset (またはビット 4 の fcd-config-flags が設定されている場合は fcd-reladdr-big) に配置されます。レコードの相対バイトアドレスを使用するには、READ 操作の後でこのフィールドの内容を保存するだけです。
相対バイトアドレスを使用すると、高速でレコードへアクセスできるようになります。ただし、次のような制限があります。
相対バイトアドレス操作では、レコードロックもサポートされています。
レコードの相対バイトアドレスを取得すると、それを使用して次の操作を実行することができます。
相対バイトアドレスを使用してファイルから具体的なレコードを読み取る方法には 2 種類あります。
READ (直接) 操作も同様に機能しますが、FCD にビットを設定する必要はありません。READ (直接) 操作では、常に FCD の相対バイトアドレスフィールドで指定されたアドレスのレコードを返し、現在のレコードポインタを更新します。
上記のどちらの方法でも、現在の参照キーを別のキーに切り替えることができます。例えば、主キーにより READ (順) 操作を行っている場合に、次の手順を実行すると、現在のレコードの最初の副キーにより読み取りを開始することができます。
FCD の fcd-reladdr-offset または fcd-reladdr-big にアドレスを入力し、FCD の fcd-config-flags にビット 6 を設定すると、レコードを特定のアドレスに再度書き込むことができます。
現在のレコードポインタを更新する場合は、FCD の fcd-config-flags にビット 5 を設定します。
次に、REWRITE 操作を実行します。
FCD の fcd-reladdr-offset または fcd-reladdr-big にアドレスを入力し、FCD の fcd-config-flags にビット 6 を設定すると、特定のアドレスのレコードを削除することができます。
次に DELETE 操作を実行します。
ユーザ独自のカスタマイズされたファイルハンドラを作成し、そのファイルハンドラを Server Express が提供するファイルハンドラの代わりに使用できます。また、相対ファイルなどの特定のタイプのファイルを処理するファイルハンドラを作成することもできます。
COBOL 入出力構文を処理する際にプログラムでカスタムファイルハンドラを使用するためには、CALLFH コンパイラ指令を使用します。例えば、USERFH という名前のファイルハンドラがある場合は、次の指令を使用してプログラムをコンパイルします。
CALLFH"USERFH"
この指令によって、すべての COBOL 入出力操作は USERFH の呼び出しにコンパイルされます。
注: CBL_EXIT_PROC を使用している場合は、優先順位を 200 に設定する必要があります。この設定により、アプリケーションでユーザ独自のファイルハンドラの呼び出しが終了すると、そのファイルハンドラも適切にシャットダウンされます。
特定のファイルタイプ用にカスタムファイルハンドラを作成し、デフォルトのファイルハンドラの代わりに使用することができます。
各ファイル編成タイプに対するデフォルトのファイルハンドラとレコード形式は次のとおりです。
ファイルタイプ |
デフォルトのファイルハンドラ |
||
---|---|---|---|
固定長レコード |
可変長レコード |
||
行順 | lsfile | lsfilev | |
順 | sqfile | sqfilev | |
索引 | ixfile | ixfilev | |
相対 | rlfile | rlfilev |
ここに示すデフォルトのファイルハンドラの代わりにアプリケーションにリンクさせるファイルハンドラは、この章で説明する呼び出しインターフェイスの形式に従っている必要があります。
カスタムファイルハンドラをアプリケーションにリンクさせるには、cob コマンド行に -m オプションを含める必要があります。このオプションの詳細については、『Server Express ユーザガイド』の『cob フラグの説明』の章を参照してください。
例えば、固定長の順ファイルの処理をカスタムファイルハンドラ (myseqfh) にリダイレクトする場合は、次のコマンド行を使用します。
cob -x -msqfile=myseqfh myapp.cbl myseqfh.o
特殊オペレーションコードを使用すると、次のように、既存の索引ファイルのデータファイル部から索引ファイルを再作成することができます。
次の例は、既存のデータファイルから新しい索引ファイルを作成する方法を示しています。
78 close-file value x"fa80" 78 open-new-index value x"0007". 78 get-next-rec value x"0008". 78 add-key-value value x"0009". ... move open-new-index to fh-opcode perform extfh-op move get-next-rec to fh-opcode perform extfh-op perform until fcd-status (1:1) not = "0" perform varying fcd-key-id from 0 by 1 until fcd-key-id = key-count or fcd-status (1:1) not = "0" move add-key-value to fh-opcode perform extfh-op end-perform move get-next-rec to fh-opcode perform extfh-op end-perform move close-file to fh-opcode perform extfh-op ... extfh-op. call "EXTFH" using fh-opcode, fcd if fcd-status of fcd (1:1) = "1" move 1 to return-code end-if.
ファイルハンドラがデータを圧縮するために使用する圧縮ルーチンは、スタンドアロンモジュールです。そのため、次のように使用することができます。
Micro Focus の圧縮ルーチンとユーザ独自の圧縮ルーチンは、どちらも最大 127 個まで使用できます。
Micro Focus の圧縮ルーチンは CBLDCnnn というモジュールに格納されています。nnn は 001~127 の数字のいずれかです。
Micro Focus の圧縮ルーチンを使用するには、FCD の fcd-data compress を 001~127 のいずれかの値に設定します。
Micro Focus の圧縮ルーチン CBLDC001 では、ランレングスエンコーディング (RLC) 形式を使用します。RLC は、同じ文字の文字列 (実行) を検出し、その文字列を文字の識別子、カウントまたは 1 つのオカレンスとして減らす圧縮方法です。
注: 2 バイト文字 (2 バイトの空白文字を含む) は圧縮されないため、このルーチンは 2 バイト文字のオカレンスを格納するファイルでは無効です。
CBLDC001 は、特に空白文字、バイナリのゼロと文字のゼロ (1 文字に減らすことができる)、印刷可能文字 (カウント数とその後に続く反復文字の計 2 文字に減らすことができる) に対して実行することを目的としています。
圧縮ファイルのバイトは、次のような意味を持っています (16 進値が示されます)。
20-7F | ほとんどの印刷可能な文字です。通常の ASCII 文字です。 |
80-9F | それぞれ 1~32 文字までの空白文字。 |
A0-BF | それぞれ 1~32 文字までのバイナリのゼロ。 |
C0-DF | それぞれ 1~32 文字までの文字のゼロ。 |
E0-FF | 後に続く文字の 1~32 回までのオカレンス数。 |
00-1F | 後に続く文字の 1~32 回までのオカレンス数。圧縮コードとしてではなく、文字どおり解釈します。元のデータに 00-1F、80-9F、A0-BF、C0-DF、E0-FF のいずれかの範囲の文字が存在するときに使用されます。(このような文字の 1 文字は 2 バイトに拡張されます。それ以外は、圧縮により発生する弊害はありません。) |
CBLDC001 と同様、このルーチンではランレングスエンコーディング (RLC) を使用しますが、1 バイトと 2 バイトの文字列 (実行) を検出します。このルーチンは DBCS 文字に適していますが、CBLDC001 の代わりに使用することもできます。
圧縮形式は、ヘッダーバイト 2 個の後に 1 つまたは複数の文字が続きます。ヘッダーバイトのビットの内容は次のとおりです。
ビット 15 | 設定解除 - 1 文字 |
ビット 14 | 設定 - 圧縮シーケンス 設定解除 - 非圧縮シーケンス |
ビット 0~13 | 圧縮した文字、または圧縮しない文字のカウント |
文字列の長さはヘッダーのビットによって異なります。
ビット 14 および 15 を設定した場合 | 2 つの反復文字 |
ビット 14 のみを設定した場合 | 1 つの反復文字 |
その他 | 1~63 文字までの非圧縮文字 |
データ ファイルを圧縮する場合は、ファイルハンドラは DATACOMPRESS コンパイラ指令で指定する圧縮ルーチンを呼び出します。
データを圧縮するために圧縮ルーチンを使用する場合は、プログラムから直接呼び出すことができます。
call "CBLDCnnn" using input-buffer, input-buffer-size, output-buffer, output-buffer-size, compression-type
各パラメータの内容は次のとおりです。
nnn | 001~127 までのデータ圧縮ルーチン。 |
input-buffer | PIC X データ項目。圧縮または圧縮解除するデータ。最大サイズは 65,535 バイト。 |
input-buffer-size | 2 バイトの (PIC XX COMP-5) データ項目。input-buffer のデータの長さを指定します。 |
output-buffer | PIC X データ項目。結果データを格納するバッファ。 |
output-buffer-size | 2 バイト (PIC XX COMP-5) のデータ項目。ルーチンを起動するときに、このデータ項目には使用可能な出力バッファのサイズが格納されます。ルーチンを終了するには、output-buffer のデータ長を格納します。 |
compression-type | 1 バイトの (PIC X) データ項目。入力データを圧縮するか、圧縮解除するかを指定します。 0 - 圧縮 1 - 圧縮解除 |
RETURN-CODE 特殊レジスタは、操作が成功したかどうかを示します。圧縮または圧縮解除は、出力バッファが小さく結果を受け付けられない場合にのみ失敗します。
ユーザ独自の圧縮ルーチンは、USRDnnn というモジュールに格納します。nnn は 128~255 までの数字です。
圧縮ルーチンを作成する場合は、以下に注意する必要があります。
COBOL プログラムで、SORT または MERGE 動詞を使用する場合は、コンパイラがこれらの文を呼び出し可能ソートモジュール (Extsm) の呼び出しに自動で変換します。この章では、プログラムで呼び出し可能ソートモジュールを明示的に呼び出してソートを実行する方法を説明します。
呼び出し可能ソートモジュールを明示的に呼び出してファイルをソートまたはマージするには、次の呼び出し文をプログラムに挿入します:
call "EXTSM" using function-code, sort-fcd
この場合のパラメータは、次のようになります:
パラメタ | 説明 |
---|---|
function-code | 実行する操作の種類を示す 2 バイトのコード。有効なコードの詳細は、C『ファンクションコード』の項を参照してください。 |
sort-fcd | ソートファイル制御記述 (FCD)。これは、ファイルを記述するデータ部の領域です。この領域には、レコード領域、ファイル名、文字の大小順序、キー定義ブロックおよびファイル定義ブロックへのポインタを格納します。ソート FCD の詳細については、『ソートファイル制御記述』の項を参照してください。 |
ファンクションコード値の一覧、ソートFCDの詳細仕様を含む、より詳しい情報は、 呼び出し可能ソートモジュール を参照してください。
Copyright © 2006 Micro Focus (IP) Ltd. All rights reserved.