バージョン 8.1.3
 —  ユーティリティ  —

処理

このドキュメントでは、次のトピックについて説明します。


セグメント化されたレコードに関する考慮事項

ADACMP の非圧縮レコードが長すぎてシーケンシャルデータセットで許容されている最大レコード長に収まらない場合(32 KB 以下)、ADACMP では、このレコードを複数の物理レコードにセグメント化することができます。 1 つの非圧縮論理レコードを 1 つ以上の非圧縮物理レコードにスパンすることができます。

また、ADACMP ユーティリティでは、非圧縮出力に特別なヘッダー(ADAH および ADAC)を作成することができます。 これらの特別なヘッダーは、ADACMP 処理でのみ使用されます。 論理レコード内のペイロードデータの位置、および同じ論理レコード内の複数の物理レコード間の関係は、これらのヘッダーから識別されます。 ADAH ヘッダーが論理レコードの最初の物理レコードに使用され、ADAC ヘッダーが論理レコードを構成する 2 番目以降の物理レコードに使用されます。 非圧縮論理レコードのセグメント化が必要ない場合(1 つの物理レコードに収まる場合)、ADAH ヘッダーのみが作成されます。ADAC ヘッダーは不要です。

ADACMP 圧縮解除ロジックおよびレコードスパニングで発生するレコードのセグメンテーションと混同しないでください。 スパンドレコードも複数の物理レコード(1 つのプライマリレコードと複数のセカンダリレコード)で構成されますが、圧縮レコードになります。 また、各スパンドレコードには、標準スパンドレコードヘッダーが自動的に割り当てられます。このヘッダーは、ADACMP を使用して非圧縮レコード用に作成可能な ADAH および ADAC ヘッダーとは異なります。ADACMP によって生成されるセグメント化されたレコードには、標準スパンドレコードヘッダーは含まれません。 スパンドレコードの詳細については、「スパンドレコード」を参照してください。

このセクションでは、次のトピックについて説明します。

ADACMP ヘッダーの作成とサポート

ADACMP DECOMPRESS の HEADER パラメータでは、圧縮解除ロジックで出力にヘッダーを作成するかどうかを制御します。 ADACMP COMPRESS の HEADER パラメータでは、圧縮ロジックで非圧縮入力の一部として ADACMP ヘッダーを許容するかどうかを制御します。

ADAH および ADAC ヘッダーの説明

このセクションでは、次のトピックについて説明します。

ADAH ヘッダー

ADACMP ヘッダーを使用する場合、論理レコードの最初の物理レコードは、次の情報を含む ADAH ヘッダーで始まります。

ペイロードデータは、ADAH ヘッダーの後に続きます。

ADAH DSECT は、分散 Adabas 8 MVSSRCE ライブラリのメンバ ADAH 内にあります。

ADAC ヘッダー

ADACMP 非圧縮レコードのセグメント化を行った場合、および ADACMP ヘッダーが要求された場合は、論理レコードを構成する 2 番目以降のすべての物理レコードの先頭に、次の情報を含む ADAC ヘッダーが置かれます。

ペイロードデータは、ADAC ヘッダーの後に続きます。

ADAC DSECT は、分散 Adabas 8 MVSSRCE ライブラリのメンバ ADAC 内にあります。

次の表は、非圧縮データの 3 つの論理レコードを 7 つの物理レコードにスパンした例を示しています。

注意:
ADAH および ADAC ヘッダーの DSECT は、分散 Adabas 8 MVSSRCE ライブラリのメンバ ADAH および ADAC 内にあります。

論理レコード 物理レコードヘッダー ヘッダーフィールド 説明
フィールド
1 ADAH ADAHEYE ADAH ADAH ヘッダーのアイキャッチャー
ADAHLEN 32 ADAH ヘッダー長
ADAHIND C 継続インジケータ。 正しい値は次のとおりです。

C:後続の継続レコードセグメント
E:論理レコードの終わり(最終セグメント)

予約済み 0 バイナリの 0 を含んでいる必要があります。
ADAHTLEN 50000 論理レコードの全体の長さ。 最初のセグメントが書き込まれるときに全体の長さが不明な場合、この値は 0 になることがあります。
予約済み 0 予約済み
ADAHSLEN 27962 このセグメントの長さ(ペイロードデータの長さ)。 ADAHLEN と ADAHSLEN の値の合計が、物理レコードの最小長です。 物理レコードはこの値よりも長くすることができます。この場合、超過したデータに意味はなく、無視されます。
ADAHDATA 'Record 1 - payload data part 1' ペイロードデータ
ADAC ADACEYE ADAC ADAC ヘッダーのアイキャッチャー
ADACLEN 32 ADAC ヘッダー長
ADACIND E 継続インジケータ。 正しい値は次のとおりです。

C:後続の継続レコードセグメント
E:論理レコードの終わり(最終セグメント)

予約済み 0 予約済み
ADACSEQ 1 論理レコードにおける継続レコードのシーケンス番号(最初の ADAC レコードのシーケンス番号は "1")。
ADACOFFS 27962 論理レコードにおけるセグメントのオフセット(最初のペイロードデータバイトのオフセットは "0")。
予約済み 0 予約済み
ADACSLEN 22038 このセグメントの長さ(ペイロードデータの長さ)。 ADACLEN と ADACSLEN の値の合計が、物理レコードの最小長です。 物理レコードはこの値よりも長くすることができます。この場合、超過したデータに意味はなく、無視されます。
ADACDATA 'Record 1 - payload data part 2' 継続レコードのペイロードデータ
2 ADAH ADAHEYE ADAH ADAH ヘッダーのアイキャッチャー
ADAHLEN 32 ADAH ヘッダー長
ADAHIND E 継続インジケータ。 正しい値は次のとおりです。

C:後続の継続レコードセグメント
E:論理レコードの終わり(最終セグメント)

予約済み 0 バイナリの 0 を含んでいる必要があります。
ADAHTLEN 25000 論理レコードの全体の長さ。 最初のセグメントが書き込まれるときに全体の長さが不明な場合、この値は 0 になることがあります。
予約済み 0 予約済み
ADAHSLEN 25000 このセグメントの長さ(ペイロードデータの長さ)。 ADAHLEN と ADAHSLEN の値の合計が、物理レコードの最小長です。 物理レコードはこの値よりも長くすることができます。この場合、超過したデータに意味はなく、無視されます。
ADAHDATA 'Record 2 - payload data' ペイロードデータ
3 ADAH ADAHEYE ADAH ADAH ヘッダーのアイキャッチャー
ADAHLEN 32 ADAH ヘッダー長
ADAHIND C 継続インジケータ。 正しい値は次のとおりです。

C:後続の継続レコードセグメント
E:論理レコードの終わり(最終セグメント)

予約済み 0 バイナリの 0 を含んでいる必要があります。
ADAHTLEN 0 論理レコードの全体の長さ。 最初のセグメントが書き込まれるとき、全体の長さが不明な場合は、この値はゼロになることがあります(論理レコード 3 の場合など)。
予約済み 0 予約済み
ADAHSLEN 27962 このセグメントの長さ(ペイロードデータの長さ)。 ADAHLEN と ADAHSLEN の値の合計が、物理レコードの最小長です。 物理レコードはこの値よりも長くすることができます。この場合、超過したデータに意味はなく、無視されます。
ADAHDATA 'Record 3 - payload data part 1' ペイロードデータ
ADAC ADACEYE ADAC ADAC ヘッダーのアイキャッチャー
ADACLEN 32 ADAC ヘッダー長
ADACIND C 継続インジケータ。 正しい値は次のとおりです。

C:後続の継続レコードセグメント
E:論理レコードの終わり(最終セグメント)

予約済み 0 予約済み
ADACSEQ 1 論理レコードにおける継続レコードのシーケンス番号(最初の ADAC レコードのシーケンス番号は "1")。
ADACOFFS 27962 論理レコードにおけるセグメントのオフセット(最初のペイロードデータバイトのオフセットは "0")。
予約済み 0 予約済み
ADACSLEN 27962 このセグメントの長さ(ペイロードデータの長さ)。 ADACLEN と ADACSLEN の値の合計が、物理レコードの最小長です。 物理レコードはこの値よりも長くすることができます。この場合、超過したデータに意味はなく、無視されます。
ADACDATA 'Record 3 - payload data part 2' 継続レコードのペイロードデータ
ADAC ADACEYE ADAC ADAC ヘッダーのアイキャッチャー
ADACLEN 32 ADAC ヘッダー長
ADACIND C 継続インジケータ。 正しい値は次のとおりです。

C:後続の継続レコードセグメント
E:論理レコードの終わり(最終セグメント)

予約済み 0 予約済み
ADACSEQ 2 論理レコードにおける継続レコードのシーケンス番号(最初の ADAC レコードのシーケンス番号は "1")。
ADACOFFS 55924 論理レコードにおけるセグメントのオフセット(最初のペイロードデータバイトのオフセットは "0")。
予約済み 0 予約済み
ADACSLEN 27962 このセグメントの長さ(ペイロードデータの長さ)。 ADACLEN と ADACSLEN の値の合計が、物理レコードの最小長です。 物理レコードはこの値よりも長くすることができます。この場合、超過したデータに意味はなく、無視されます。
ADACDATA 'Record 3 - payload data part 3' 継続レコードのペイロードデータ
ADAC ADACEYE ADAC ADAC ヘッダーのアイキャッチャー
ADACLEN 32 ADAC ヘッダー長
ADACIND E 継続インジケータ。 正しい値は次のとおりです。

C:後続の継続レコードセグメント
E:論理レコードの終わり(最終セグメント)

予約済み 0 予約済み
ADACSEQ 3 論理レコードにおける継続レコードのシーケンス番号(最初の ADAC レコードのシーケンス番号は "1")。
ADACOFFS 83886 論理レコードにおけるセグメントのオフセット(最初のペイロードデータバイトのオフセットは "0")。
予約済み 0 予約済み
ADACSLEN 16114 このセグメントの長さ(ペイロードデータの長さ)。 ADACLEN と ADACSLEN の値の合計が、物理レコードの最小長です。 物理レコードはこの値よりも長くすることができます。この場合、超過したデータに意味はなく、無視されます。
ADACDATA 'Record 3 - payload data part 4' 継続レコードのペイロードデータ

Top of page

データの検証

ADACMP では、U(アンパック形式)または P(パック形式)フォーマットで定義されたフィールドをチェックし、フィールド値が数字であり、かつ正しいフォーマットであることを確認します。 値が空値である場合、この空値はそのフィールドに指定されたフォーマットに対応している必要があります(「フィールド定義ステートメント」セクションの「SQL 空値の表現」を参照)。

英数字(A) 空白(16 進数 X'40')
2 進数(B) バイナリの 0(16 進数 X'00')
固定小数点(F) バイナリの 0(16 進数 X'00')
浮動小数点(G) バイナリの 0(16 進数 X'00')
パック形式(P) 符号付きパック 10 進数のゼロ(右端の下位バイトに、X'00' に続けて X'0F'、X'0C'、または X'0D' を伴う)
アンパック形式(U) 符号付アンパック 10 進数のゼロ(右端の下位バイトに、X'F0' に続けて X'C0' または X'D0' を伴う)

無効なデータを含むレコードは、すべて ADACMP エラー(DDFEHL)データセットに書き込まれ、圧縮データセットには書き込まれません。

Top of page

データ圧縮

各フィールドの値は(FI オプションの指定がない限り)次のように圧縮されます。

データ圧縮の例

graphics/cmp3_following_anchor5.png

ADACMP 圧縮

下図は、次のフィールド定義とその値が ADACMP によってどのように処理されるかを示しています。

FNDEF='01,ID,4,B,DE'
FNDEF='01,BD,6,U,DE,NU'
FNDEF='01,SA,5,P'
FNDEF='01,DI,2,P,NU'
FNDEF='01,FN,9,A,NU'
FNDEF='01,LN,10,A,NU'
FNDEF='01,SE,1,A,FI'
FNDEF='01,HO,7,A,NU'

Top of page

非圧縮データの LOB 値と値参照の表現

このセクションでは、ラージオブジェクト(LB)フィールドの値、LB フィールドの値参照、および 32 KB より長い論理レコードを ADACMP COMPRESS 機能の入力データセットでどのように表現する必要があり、これらの項目が ADACMP DECOMPRESS 機能の出力データセットでどのように表現されるかについて説明します。

ラージオブジェクト(LB)フィールドの値

FORMAT パラメータを指定せずに ADACMP を実行した場合、非圧縮データ内の各ラージオブジェクト(LB)フィールド値の先頭に 4 バイトの長さフィールドが付けられます。 長さの値は、固有の LB フィールド値の長さに、長さフィールド自体の 4 バイトを加えた値になります。 NB オプションを指定せずに定義されたフィールドの場合、空の LB フィールド値は、値 5 と 1 つの空白を含む長さフィールドで構成されます。NB オプションを指定して定義されたフィールドの場合、空の LB フィールド値は、値 4 のみを含む長さフィールドで構成されます。

ADACMP COMPRESS を使用して LB フィールドを含む FDT を定義する場合、非圧縮入力の各 LB フィールド値は 253 バイトと等しいかそれより小さくする必要があります。

ラージオブジェクト(LB)フィールドの値参照

LOBVALUES=NO を指定して ADACMP DECOMPRESS 機能を実行し、LOB ファイルグループ基本ファイル内のレコードのみを圧縮解除した場合(関連する LOB ファイルに格納されている LB フィールド値はすべて省略)、LOB ファイル内の LB フィールド値に対する基本ファイルレコード内の各参照は、非圧縮出力で次のように表現されます。

ADACMP COMPRESS 機能で LOBVALUES=NO を指定した場合、処理対象の基本ファイルに関連付られている LOB ファイルに格納されている LB フィールド値の場所で、同じ構造が要求されます。

ADACMP COMPRESS の入力として使用する LB フィールド値参照は、ADACMP DECOMPRESS から取得する必要があります。 COMPRESS を使用して新しい LB フィールド値参照を取り入れる適切な方法はありません。これは、LOB ファイル内の既存の LB フィールド値を正しく参照できないためです。

Top of page

圧縮レコード内の 191 を超える MU および PE オカレンスの特定

圧縮レコード内に 191 を超える MU および PE オカレンスがある場合は、そのオカレンスカウントの先頭に x'C0' バイトが付加されることによって、そのことが示されます。 このバイトは、レコードの圧縮時に ADACMP ユーティリティまたはニュークリアスにより設定されます。 x'C0' インジケータバイトの後に、後続の MU または PE オカレンスカウントに使用されるカウントバイトの数を示すバイトが続きます。 例えば、次のインジケータの場合を考えます。

X’C0020204’

この例では、x'C0' はこれが拡張カウントであることを示し、x'02' はカウントバイトが 2 つあることを示します。また、x'0204' は、このフィールドに 516 個のオカレンスが存在することを示します。

Top of page

再スタートに関する考慮事項

ADACMP には再スタート機能は備えられていません。 ADACMP の実行が中断された場合、最初からやり直す必要があります。

Top of page

ユーザー出口 6

ADACMP COMPRESS 処理時の編集用に、ユーザー出口 6 と呼ばれるユーザー作成ルーチンを使用することができます。 このルーチンは、アセンブラまたは COBOL で記述できます。 記述したルーチンは、アセンブルまたはコンパイルした後、Adabas ロードライブラリ(またはそれに連結されたライブラリ)にリンクする必要があります。

ユーザー出口 6 は、次のように指定して呼び出します。

ADARUN UEX6=program

ここで、program はロードライブラリ内のルーチン名です。

ユーザー出口 6 の構造とパラメータの詳細は、ユーザー出口とハイパー出口に関する説明を参照してください。

Top of page