TSAM RDB

本付録では、データをコピーブックのフィールドごとに変換して管理できるように、VSAMデータセットを定義する機能について説明します。

1. VSAMデータセットの定義プロセス

TSAM RDBでIDCAMSを使用してVSAMデータセットを定義するプロセスは以下のとおりです。

figure 3 7
VSAM データセットの定義プロセス
  1. データセットと同じ名前のコピーブックを解析し、それにマッピングするソースコードを作成します。

  2. 作成されたソースコードとテンプレート・ファイル(TSAM_@.template)を結合します。

  3. 完成されたソース・ファイルをシェル・スクリプト(tsam_compile.sh)でコンパイルして、DSNAME.soを作成します。

  4. DSNAME.soに定義されているtsrdb_create APIを呼び出して、データセットのテーブルを作成します。

2. TSAM RDBの特徴

本節では、TSAM RDBの主な特徴について説明します。

TSAM RDBはレコードをフィールド単位に分割した後、各フィールドのタイプに合わせてデータを変換してテーブルに保存します。

以下は、従来のTSAMとTSAM RDBの違いです。

  • 従来のTSAM

    KEY                  DAT
    -------------------- -------------------------------------------------------
    30303031303030303030 3030303130303030303030303034303030303030 ...
    30303032303030303030 3030303230303030303030303033303030303030 ...
    30303033303030303030 3030303330303030303030303032303030303030 ...
    30303034303030303030 3030303430303030303030303031303030303030 ...
  • TSAM RDB

    FLD_KEY    FLD_AKEY   FLD_DAT
    ---------- ---------- -------------------------------------------------------
    0001000000 0004000000 ...
    0002000000 0003000000 ...
    0003000000 0002000000 ...
    0004000000 0001000000 ...

従来のTSAMではデータをBLOB型で保存するため、移行の際に変換に関する問題は発生しませんでしたが、TSAM RDBではフィールド単位でデータを変換し、その際にデータの検証処理プロセスが追加されたため、移行の際にエラーが発生することがあります。

代替索引(AIX)を作成する場合は、従来のTSAMとは異なって、別のテーブルを作成せずにクラスター・テーブルに索引を作成します。

以下は、TSAM RDBで代替索引を作成した例です。

$ idcams define AIX -n SAMPLE.KSDS.AIX -r SAMPLE.KSDS -k 10,10 -l 80,80
COLUMN_NAME         TYPE                         CONSTARINT
------------------- ---------------------------- ------------------------
FLD_KEY             NUMBER(10)                  PRIMARY KEY
FLD_AKEY            VARCHAR(10)
FLD_DAT             VARCHAR(60)


INDEX_NAME             TYPE                      COLUMN_NAME
---------------------- ------------------------- ------------------------
SAMPLE_KSDS_AIX_INDEX   NORMAL                   FLD_AKEY
SAMPLE_KSDS_KEY         NORMAL                   FLD_KEY

idcamsツールのオプション設定に従って、OCCURSフィールドのすべてのエレメントをデータベース表の1つの列として作成するか、エレメントごとに列を作成することができます。

以下は、OCCURSフィールドのすべてのエレメントをデータベース表の1つの列として作成する例です。

<SAMPLE.KSDS.cpy>

01 REC.
    03 FLD-KEY PIC 9(10).
    03 FLD-OCC PIC X(10) OCCURS 5 TIMES.
    03 FLD-DAT PIC X(20).
    :
    :
$ idcams define CL -n SAMPLE.KSDS -o KS -k 10,0 -l 80,80 -O
COLUMN_NAME         TYPE                         CONSTARINT
------------------- ---------------------------- ------------------------
FLD_KEY             NUMBER(10)                   PRIMARY KEY
FLD_OCC             VARCHAR(50)
FLD_DAT             VARCHAR(20)


INDEX_NAME          TYPE                         COLUMN_NAME
------------------- ---------------------------- ------------------------
SAMPLE_KSDS_KEY     NORMAL                       FLD_KEY

以下は、OCCURSフィールドのエレメントごとに列を作成する例です。

<SAMPLE.KSDS.cpy>

01 REC.
    03 FLD-KEY PIC 9(10).
    03 FLD-OCC PIC X(10) OCCURS 5 TIMES.
    03 FLD-DAT PIC X(20).
    :
    :
$ idcams define CL -n SAMPLE.KSDS -o KS -k 10,0 -l 80,80
COLUMN_NAME             TYPE                    CONSTARINT
----------------------- ----------------------- -------------------------
FLD_KEY                 NUMBER(10)              PRIMARY KEY
FLD_OCC1                VARCHAR(10)
FLD_OCC2                VARCHAR(10)
FLD_OCC3                VARCHAR(10)
FLD_OCC4                VARCHAR(10)
FLD_OCC5                VARCHAR(10)
FLD_DAT                 VARCHAR(20)


INDEX_NAME              TYPE                    COLUMN_NAME
----------------------- ----------------------- -------------------------
SAMPLE_KSDS_KEY         NORMAL                  FLD_KEY

基本的にコピーブックに定義されたフィールドに合わせて列が作成されますが、VB形式のレコードを処理するためにデータベース表の1つの列(BULK)でVSAMデータセットを作成することもできます。ただし、その場合は、一般フィールドとこのフィールドを再定義するフィールドだけで構成されたコピーブックが作成される必要があります。

以下は、1つの例(BULK)を持つVSAM KSDSデータセットを定義するために使用されるコピーブック・ファイルを作成し、そのコピーブックを使用してデータセットを定義する例です。

<BULK.KSDS.cpy>

01 REC.
    03 FLD-DAT  PIC 9(80).
    03 FLD-BULK PIC X(80) REDEFINES FLD-DAT.
    :
    :
$ idcams define CL -n BULK.KSDS -o KS -k 10,0 -l 80,80
COLUMN_NAME             TYPE                     CONSTARINT
----------------------- ------------------------ ------------------------
FLD_DAT                 VARCHAR(80)
BULK_KSDS_COL           VARCHAR(10)


INDEX_NAME              TYPE                     COLUMN_NAME
----------------------- ------------------------ ------------------------
BULK_KSDS_KEY           FUNCTION-BASED NORMAL    - EXPRESSION COLUMN -

再定義フィールドは、フィールド・タイプに関係なく、文字型の列が作成されます。

ISAMの場合は、既存のESQL TSAMと同様にVSAM KSDSが生成され、RDBバージョンの特徴に合わせてコピーブックが要求されます。ただ、一般的なVSAM KSDSの作成とは異なって、コピーブック・ファイル名の前に論理ボリューム名が付けられる必要があります。

以下は、TSAM RDBバージョンでISAMデータセットを定義するために使用されるコピーブック・ファイルとこのコピーブックを使用してdscreateツールでISAMデータセットを定義する例です。

<DEFVOL_SAMPLE.ISAM.cpy>

01 REC.
    03 FLD-KEY PIC X(10).
    03 FLD-DAT PIC X(70).
    :
    :
$ dscreate SAMPLE.ISAM -o IS -k 10 -p 0 -l 80 -v DEFVOL
COLUMN_NAME                   TYPE                 CONSTARINT
----------------------------- -------------------- ----------------------
FLD_KEY                       VARCHAR(10)          PRIMARY KEY
FLD_DAT                       VARCHAR(70)


INDEX_NAME                    TYPE                 COLUMN_NAME
----------------------------- -------------------- ----------------------
DEFVOL_SAMPLE_ISAM_KEY        NORMAL                 FLD_KEY

3. 使用例

VSAMデータセットを定義する手順は以下のとおりです。

  1. コピーブック・ディレクトリに、データセットと同じ名前のコピーブック・ファイル(例: SAMPLE.KSDS.cpy)を作成します。

    <SAMPLE.KSDS.cpy>

    01 REC.
        03 FLD-KEY  PIC 9(10).
        03 FLD-AKEY PIC X(10).
        03 FLD-DAT  PIC X(60).
        :
        :
  2. idcamsツールまたはユーティリティでVSAMデータセットを定義します。

    $ idcams define CL -n SAMPLE.KSDS -o KS -k 10,0 -l 80,80
  3. データセット・テーブルと共有オブジェクト・ファイル(例: SAMPLE.KSDS.so)の作成を確認します。

    COLUMN_NAME              TYPE                    CONSTARINT
    ------------------------ ----------------------- ------------------------
    FLD_KEY                  NUMBER(10)              PRIMARY KEY
    FLD_AKEY                 VARCHAR(10)
    FLD_DAT                  VARCHAR(60)
    
    
    INDEX_NAME               TYPE                    COLUMN_NAME
    ------------------------ ----------------------- ------------------------
    SAMPLE_KSDS_KEY          NORMAL                  FLD_KEY

代替索引を定義する手順はデータセットを定義する手順と同じです。

以下は、VSAM KSDSデータセットの代替索引を定義する例とその結果の例です。

<SAMPLE.KSDS.cpy>

01 REC.
    03 FLD-KEY  PIC 9(10).
    03 FLD-AKEY PIC X(10).
    03 FLD-DAT  PIC X(60).
    :
    :
$ idcams define AIX -n SAMPLE.KSDS.AIX -r SAMPLE.KSDS -k 10,10 -l 80,80
COLUMN_NAME              TYPE                    CONSTARINT
------------------------ ----------------------- ------------------------
FLD_KEY                  NUMBER(10)              PRIMARY KEY
FLD_AKEY                 VARCHAR(10)
FLD_DAT                  VARCHAR(60)


INDEX_NAME               TYPE                    COLUMN_NAME
------------------------ ----------------------- ------------------------
SAMPLE_KSDS_AIX_INDEX    NORMAL                  FLD_AKEY
SAMPLE_KSDS_KEY          NORMAL                  FLD_KEY