TSAM RDB

본 절에서는 데이터를 Copybook 필드 별로 변환하여 관리할 수 있도록 VSAM 데이터셋을 정의하는 기능을 설명한다.

1. VSAM 데이터셋 정의 과정

TSAM RDB에서 IDCAMS를 통해 VSAM 데이터셋을 정의할 경우 수행되는 과정은 다음과 같다.

figure 3 7
VSAM 데이터셋 정의 과정
  1. 데이터셋과 동일한 이름의 Copybook을 파싱하여 이에 매핑되는 소스 코드를 생성한다.

  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 형태로 데이터를 저장하기 때문에 Migration 과정에서 변환 이슈는 존재하지 않지만 TSAM RDB에서는 필드 단위로 나눈 데이터를 변환하는 과정에서 데이터 검증이 처리가 추가되어 마이레이션 과정에서 오류가 발생할 수 있다.

AIX를 생성하는 경우 기존 TSAM과 다르게 별도의 테이블을 생성하지 않고, CLUSTER 테이블에 INDEX를 생성하여 처리한다.

다음은 TSAM RDB에서 AIX 생성한 결과 예이다.

$ 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

OCCURS 필드를 IDCAMS 옵션에 따라 단일 또는 풀어진 형태의 컬럼으로 생성 가능하다.

다음은 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 -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

기본적으로 Copybook에 정의된 필드에 맞게 컬럼이 생성되지만, VB 형태의 레코드를 처리하기 위해 단일 컬럼을 갖는 형태(BULK)로도 VSAM 데이터셋을 생성할 수 있다. 다만, 단일 컬럼을 갖기 위해서는 일반 필드와 이 필드를 재정의하는 필드만으로 구성한 Copybook이 작성되어야 한다.

다음은 단일 컬럼(BULK)을 갖는 VSAM KSDS 데이터셋을 정의하기 위해 사용되는 Copybook 파일의 작성과 해당 Copybook을 사용하여 데이터셋을 정의하는 예이다.

<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의 경우 RDB 버전이 아닌 기존 ESQL TSAM과 동일하게 VSAM KSDS로 생성되며, RDB 버전의 특징에 맞게 Copybook이 요구된다. 다만, 일반적인 VSAM KSDS 생성과 다르게 Copybook 파일 이름 앞에 논리 볼륨의 이름이 붙어 있어야 한다.

다음은 TSAM RDB 버전에서 ISAM 데이터셋을 정의하기 위해 사용되는 Copybook 파일과 해당 Copybook을 활용하여 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. Copybook 디렉터리 내 데이터셋과 동일한 이름의 Copybook 파일(예: 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. 데이터셋 테이블 및 Shared Object 파일(예: 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

AIX를 정의하는 절차는 데이터셋을 정의하는 절차와 동일하다.

다음은 VSAM KSDS 데이터셋의 AIX를 정의하는 예와 그 결과를 예이다.

<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