데이터 셋 유틸리티

본 장에서는 데이터 셋 유틸리티에 대해 기술한다.

1. 개요

다음은 데이터 셋 유틸리티 목록이다. 각 유틸리티에 대한 설명은 해당 절에서 자세하게 기술한다.

프로그램명 설명

CTFE

카탈로그 편집을 수행한다.

FCHK

직접 액세스 볼륨에 존재하는 모든 파일의 속성을 인쇄한다.

FCPY

직접 액세스 볼륨 또는 자기 테이프 볼륨의 데이터 셋을 복사한다.

FDLT

직접 액세스 볼륨에 존재하는 파일을 삭제한다.

FDMP

직접 액세스 볼륨에 존재하는 파일의 내용을 편집하고 인쇄하는 파일을 덤프한다.

GDGM

시스템/마스터 카탈로그에 등록된 GDG의 GDS를 관리한다.

ISFG

일반 Non-VSAM 파일을 가지고 직접 액세스 볼륨에 존재하는 인덱스 파일을 생성한다.

JYQDDUTY

RDBII 데이터 셋 정보를 생성, 삭제 및 ETL 수행한다.

KBKARCS

BACKUP과 RESTORE 명령을 통해 데이터 셋이나 볼륨의 백업 및 복원 기능을 사용한다.

KQCAMS

VSAM과 Non-VSAM 데이터 셋 및 카탈로그 정보를 생성하고 관리한다.

2. CTFE

CTFE(Catalog File Editor)는 카탈로그 편집을 수행하는 유틸리티이다.

일반적으로 자기테이프 볼륨의 데이터 셋이나 직접 액세스 볼륨의 데이터 셋을 사용하는 경우 사용자는 JCL의 FD 구문에 파일명과 그 데이터 셋이 존재하는 볼륨의 일련번호를 지정한다. 그러나 카탈로그로 데이터 셋을 관리할 경우 카탈로그가 데이터셋 이름과 데이터 셋이 존재하는 볼륨의 볼륨 일련번호에 대한 대응 관계를 포함하고 있으므로 사용자는 데이터셋 이름만을 지정하여 데이터 셋에 접근할 수 있다. 이는 유틸리티에서 데이터 셋을 지정할 경우에 볼륨 일련번호의 생략이 가능하다는 의미이다.

2.1. FD 설정

FD 설정 항목은 다음과 같다.

항목 설명

COIN

제어문 입력 데이터 셋이다.

LIST

리스트 출력 데이터 셋이다.

2.2. 명령어 설정

COIN으로 입력된 명령들은 각각의 명령이 의미하는 작업을 수행하기 위한 명령 자체와 이를 위한 각종 옵션 또는 오퍼랜드들로 구성된다. CTFE는 실행할 명령들을 COIN으로부터 읽어 들여 동작한다.

FILE

특정 데이터 셋을 선택할 때 사용된다. FILE 문에는 CATALOG형과 REFERENCE형이 있다. 카탈로그에 등록하기 위한 데이터 셋을 지정할 때는 CATALOG형 FILE 구문을 사용하고, 그 외 카탈로그로부터의 삭제, 카탈로그에 등록된 데이터셋 정보 인쇄를 위한 FILE을 지정할 때는 REFERENCE형 FILE 구문을 사용한다.

  • CATALOG형

    카탈로그에 등록할 데이터 셋을 지정할 때 사용한다. CATALOG형 FILE 명령어 형식은 다음과 같다.

    /[Label]    F[ILE]    FileName,VolSerial 1[(VolSequence 1)]
                          [,VolSerial 2[(VolSequence 2)] …
    항목 설명

    FileName

    카탈로그에 등록할 데이터셋 이름을 지정한다. 지정할 수 있는 데이터 셋은 카탈로그에 미등록된 일반 데이터 셋과 GDS 데이터 셋이다. 단, GDS 데이터 셋을 등록할 때에는 GDS 데이터셋(+1)부터 GDS 데이터셋(+99) 사이의 데이터 셋들만 등록할 수 있다.

    일반 데이터셋 이름(0)은 변경의 경우에만 사용할 수 있고 일반 데이터셋 이름(-1)부터 일반 데이터셋 이름(-99) 사이의 데이터 셋들은 등록될 수 없다.

    VolSerial (1~n)

    데이터 셋이 존재하는 볼륨의 일련번호를 지정한다. 멀티 볼륨의 경우 최대 255개의 볼륨 일련번호를 지정할 수 있다.

    OpenFrame에서는 멀티 볼륨을 지원하지 않기 때문에 여러 개의 볼륨 일련번호가 지정되었을 경우 가장 처음에 지정된 볼륨 일련번호만 유효하다.

    이전 FUJITSU XSP에서 사용하던 COIN 구문을 파싱하기 위해서 문법 상으로만 지원한다.

    VolSequence (1~n)

    볼륨 일련번호의 순서를 지정한다. n은 3자리 숫자로만 지정이 가능하다. OpenFrame에서는 사용되지 않으며 이전 FUJITSU XSP에서 사용되던 COIN 구문을 파싱하기 위해서 문법 상으로만 지원한다.

  • REFERENCE형

    카탈로그로부터 삭제, 카탈로그에 등록된 데이터셋 정보 인쇄를 목적으로 데이터 셋을 지정할 때 사용한다. REFERENCE형 FILE 명령어 형식은 다음과 같다.

    /[Label]    F[ILE]    FileName
    항목 설명

    FileName

    카탈로그로부터의 삭제, 카탈로그에 등록된 데이터 셋의 정보 인쇄에 사용할 데이터 셋을 지정한다.

    일반 데이터셋 이름(+1)~일반 데이터셋 이름(+99)을 제외한 나머지 GDG 데이터 셋들과 일반 데이터셋 이름의 지정이 가능하다.

CATL

카탈로그에 지정된 데이터 셋과 볼륨 일련번호의 대응관계를 등록한다. 만약 등록하려는 데이터셋 이름과 동일한 데이터 셋이 카탈로그에 이미 존재하고 이 두 데이터 셋의 볼륨 일련번호가 일치하지 않으면 에러로 처리한다.

CATL 명령어 형식은 다음과 같다.

/[Label]    C[ATL]    [Comments]

카탈로그에 등록 또는 변경될 데이터 셋은 FILE 구문으로 지정한다. CATL 문에 이어서 추가될 FILE 문은 CATALOG형이어야 한다. 이 FILE 구문의 개수에는 제한이 없다.

카탈로그되어 있지 않은 데이터 셋을 카탈로그에 등록할 때 필요한 데이터의 속성 정보는 VTOC에서 얻어 올 수 있다.

UNCA

이미 등록된 데이터 셋과 볼륨 일련번호와의 대응관계를 카탈로그로부터 삭제한다.

UNCA 명령어 형식은 다음과 같다.

/[Label]    U[NCA]    [Comments]

카탈로그에서 삭제될 데이터 셋은 FILE 구문으로 지정한다. UNCA 문에 이어서 추가될 FILE 문은 REFERENCE형이어야 한다. 이 FILE 구문의 개수에는 제한이 없다.

TAKE

카탈로그에 등록되어 있는 데이터셋 이름과 볼륨 일련번호 등의 카탈로그와 연관된 정보를 인쇄를 목적으로 출력한다. 카탈로그 정보는 다음의 두 가지 방법으로 출력된다.

  • FILE 구문을 사용하여 지정된 데이터 셋만 출력

  • 카탈로그에 등록되어 있는 모든 데이터셋 출력

인쇄를 위해 출력되는 데이터 셋의 정보는 다음과 같다.

  • 절대 데이터셋 이름

  • 카탈로그가 등록된 날짜

  • 볼륨 일련번호

TAKE 명령어 형식은 다음과 같다.

/[Label]    T[AKE]    [{SEP|GNR|GDG}]
항목 설명

SEP

GDS(Generation Data Set) 데이터 셋과 일반 데이터 셋을 구분한 다음 카탈로그에 등록된 모든 데이터 셋의 정보를 출력한다.

GNR

카탈로그에 등록된 일반 데이터 셋의 정보만 출력한다. GDS 데이터 셋은 출력에서 제외한다.

GDG

카탈로그에 등록된 GDS 데이터 셋의 정보만 출력한다. 일반 데이터 셋은 출력에서 제외한다.

  1. 카탈로그에 등록된 모든 데이터 셋의 정보를 인쇄하기 위해서 FILE 구문을 사용하지 않을 경우에만 옵션을 지정해야 한다. 옵션을 지정한다면 FILE 구문을 사용할 수 없다.

  2. 카탈로그에 등록된 특정 데이터 셋의 정보를 인쇄하기 위해서는 FILE 구문을 사용하여 지정한다. 여기서 사용되는 FILE 문은 REFERENCE형이어야 한다. 이 FILE 구문의 개수에는 제한이 없다. FILE 구문이 생략되었을 경우 카탈로그에 등록된 모든 데이터 셋들의 정보를 인쇄한다.

VUNC

특정 볼륨에 존재하는 데이터셋 중 카탈로그에 등록된 데이터 셋들만 카탈로그에서 삭제한다. GDS(Generation Data Set) 데이터 셋은 처리대상에서 제외한다.

VUNC 명령어 형식은 다음과 같다.

/[Label]    V[UNC]    VolSerial
항목 설명

VolSerial

카탈로그로부터 삭제할 데이터 셋들이 존재하는 볼륨의 일련번호를 지정한다.

  1. 지정된 볼륨 내에 존재하는 데이터 셋들 중 GDS 데이터 셋을 제외하고 카탈로그에 등록된 모든 데이터 셋들을 카탈로그로부터 삭제한다.

  2. 한 개의 볼륨 일련번호만 지정할 수 있다.

FIN

CTFE 유틸리티 제어문의 마지막을 나타내는 구문이며 생략 가능하다.

FIN 명령어 형식은 다음과 같다.

/[Label]    FIN    [Comments]

2.3. 사용예제

다음은 Non-VSAM 데이터 셋을 CTFE 명령어의 CATL 구문을 이용하여 다음의 미등록된 일반 데이터 셋과 GDS 데이터 셋들을 카탈로그에 등록하는 예이다.

데이터셋 이름 볼륨 일련번호

ABCD

V00001

A.B.C.D

V00002

G(+1)

V00003

G(+2)

V00003

\ JOB  CTFE01
\ EX    CTFE
\  FD    LIST=DA,SOUT=A
\  FD    COIN=*
/ CATL
/ FILE ABCD,V00001
/ F   A.B.C.D,V00002
/ F   G(+1),V00003
/ F   G(+2),V00003
/ FIN
\ JEND

다음은 UNCA 구문을 이용하여 카탈로그에 이미 등록되어 있는 데이터 셋을 카탈로그에서 삭제하는 예이다. 삭제 대상 데이터 셋은 ABCD, A.B.C.D, G(-1)이다.

\ JOB  CTFE02
\  EX    CTFE
\  FD    LIST=DA,SOUT=A
\  FD    COIN=*
/ UNCA
/ FILE ABCD
/ F   A.B.C.D
/ F   G(-1)
/ FIN
\ JEND

다음은 VUNC 구문을 이용하여 지정한 볼륨 내에서 카탈로그에 등록되어 있는 데이터 셋들을 삭제하는 예이다. 삭제할 볼륨 일련번호는 V00005이다.

\ JOB  CTFE03
\  EX    CTFE
\  FD    LIST=DA,SOUT=A
\  FD    COIN=*
/ VUNC  V00005
/ FIN
\ JEND

다음은 TAKE 구문을 이용하여 카탈로그에 등록된 특정 FILE들의 정보를 출력하는 예이다. 인쇄할 데이터셋 이름은 X.Y.Z, X.*.ABC000 (데이터셋 이름이 ‘X’로 시작하고 .’ABC000’으로 끝나는 데이터 셋들)이다.

\ JOB  CTFE04
\  EX    CTFE
\  FD    LIST=DA,SOUT=A
\  FD    COIN=*
/ TAKE
/ FILE  X.Y.Z
/  FILE  X.*.ABC000
/  FIN
\ JEND

다음은 TAKE 구문을 이용하여 카탈로그에 등록된 모든 FILE들의 정보를 출력하는 예이다.

\ JOB  CTFE05
\  EX    CTFE
\  FD    LIST=DA,SOUT=A
\  FD    COIN=*
/ TAKE
/  FIN
\ JEND

다음은 TAKE 구문을 이용하여 카탈로그에 등록된 모든 데이터 셋들의 정보를 일반 데이터 셋과 GDS 데이터 셋로 구분하여 출력하는 예이다.

\ JOB  CTFE06
\  EX    CTFE
\  FD    LIST=DA,SOUT=A
\  FD    COIN=*
/ TAKE  SEP
/  FIN
\ JEND

2.4. 유의사항

CTFE 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.

  • 정상적으로 실행한 경우

    유틸리티의 정상 종료 코드 10을 반환한다.

  • 에러가 발생한 경우

    해당 에러 메시지를 LIST FD에 출력하고 각 에러에 해당하는 코드를 반환한다.

    CTFE 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.

    코드 설명

    20

    진행이 가능한 에러가 발생함을 의미한다.

    30

    진행이 불가능한 에러가 발생함을 의미한다.

[참고]

다음과 같은 명령어 약자를 사용할 수 있다.

명령어 약어

CATL

C

UNCA

U

TAKE

T

VUNC

V

FILE

F

2.5. 관련 환경설정

CTFE 관련 환경설정은 OpenFrame 환경설정의 ctfe 서브젝트에서 한다. 설정 내용을 변경하여 CTFE 몇 가지 동작을 사용자의 요구에 맞게 조정할 수 있다.

환경설정 항목에 대한 자세한 내용은 OpenFrame Batch "환경설정 안내서"를 참고한다.

3. FCHK

FCHK는 File Check의 약자로 직접 액세스 볼륨에 존재하는 모든 파일의 속성을 인쇄하는 유틸리티이다.

FCHK 유틸리티를 통해 인쇄될 파일 속성은 다음과 같다.

  • 직접 액세스 장치의 기종

  • 직접 액세스 볼륨의 볼륨 일련번호

  • 파일명

  • 데이터셋 구성

  • 레코드 형식

  • 블록 크기

  • 레코드 길이

  • 키 길이

  • 유효 기일

  • 최종 사용 날짜

3.1. FD 설정

FD 설정 항목은 다음과 같다.

항목 설명

U01

입력 파일의 액세스명이다.

LIST

리스트 출력 파일이다.

3.2. 명령어 설정

필요한 정보가 JCL의 FD 구문에 지정되지 않았을 경우 FCHK 유틸리티는 WTOR(Write To Operator with Reply) 방식을 이용한다. 콘솔을 통해 오퍼레이터로부터 볼륨 일련번호를 제어문으로 얻어온다. 볼륨의 정보가 FD 문으로 주어진 경우 FCHK 제어문은 생략된다.

FCHK

‘XTC0510R FCHK PLEASE KEY-IN PARAMETER’ 메시지가 콘솔에 표시된 후 오퍼레이터는 처리 대상의 직접 액세스 볼륨의 일련번호와 볼륨 패스워드를 입력한다. OpenFrame에서는 볼륨 패스워드가 존재하지 않기 때문에 볼륨 패스워드는 생략이 가능하다.

3.3. 사용예제

다음은 FD 문으로 볼륨 일련번호를 지정하는 예이다.

\ JOB  FCHK
\ EX   FCHK
\ FD   U01=DA,FILE=VOLUME,VOL=000001
\ FD   LIST=DA,VOL=WORK,TRK=(10,3),SOUT=A
\ JEND
항목 설명

U01

입력 직접 액세스 볼륨이다.

FILE

파일명이다.

VOL

볼륨 일련번호이다.

LIST

처리 결과 출력 파일이다.

다음은 FD 문의 입력 파일로 DUMMY를 주었을 때 콘솔에 입력 요구 메시지가 표시되고 콘솔로부터 볼륨 일련번호를 입력받는 예이다.

\ JOB  FCHK
\ EX   FCHK
\ FD   U01=DUMMY
\ FD   LIST=DA,VOL=WORK,TRK=(10,3),SOUT=A
\ JEND

[UTIL;20100101_120000;37;0;JOB00001;1000] XTC0510R FCHK PLEASE KEY-IN PARAMETER
Input Message: 000001 《 Enter 》
항목 설명

U01

입력 직접 액세스 볼륨이다.

LIST

처리 결과 출력 파일이다.

3.4. 유의사항

입력 직접 액세스 볼륨을 정의하는 FD 문의 파일명은 'FILE=VOLUME’으로 지정하고 출력하고자하는 VOL을 지정해야 한다. 'FILE=VOLUME’이라고 지정하면 runner에서는 해당 FD를 임시 데이터 셋으로 처리하고 지정한 VOL만을 FCHK에서 유효하게 사용한다. 콘솔을 통한 오퍼레이터 입력 지정의 경우 'U01=DUMMY’로 지정한다.

FCHK 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.

  • 정상적으로 실행한 경우

    유틸리티의 정상 종료 코드 10을 반환한다.

  • 에러가 발생한 경우

    해당 에러 메시지를 LIST FD에 출력하고 각 에러에 해당하는 코드를 반환한다.

    FCHK 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.

    코드 설명

    20

    진행이 가능한 에러가 발생함을 의미한다.

    50

    진행이 불가능한 에러가 발생함을 의미한다.

4. FCPY

FCPY는 File Copy의 약자로 직접 액세스 볼륨 또는 자기 테이프 볼륨의 데이터 셋을 복사하는 유틸리티이다. PS(Physical Sequential), PO(Partitioned) 또는 IS(Indexed Sequential)으로 구성된 데이터 셋들만 입력 데이터 셋으로 사용할 수 있다. 출력 데이터 셋은 PS와 PO 구성만 허용한다.

4.1. FD 설정

FD 설정 항목은 다음과 같다.

항목 설명

COIN

제어문 입력 데이터 셋이다.

LIST

출력 리스트 데이터 셋이다. 복사한 레코드 건수를 출력한다.

U01

입력 데이터 셋의 액세스명이다.

U02

출력 데이터 셋의 액세스명이다.

4.2. 명령어 설정

FCPY 유틸리티가 제공하는 기능을 수행하기 위한 명령어를 JCL PARA 문의 오퍼랜드에 기술하거나 COIN에 기술한다.

PARA 오퍼랜드의 FCPY

JCL PARA 문의 오퍼랜드 명령어 구문은 다음과 같다.

¥PARA /[label] FCPY  IN=U01,OUT=U02
COIN의 FCPY

이 구문은 데이터 셋의 복사를 실행하며 단 한번만 사용될 수 있다.

COIN의 FCPY 명령어 구문은 다음과 같다.

/[label]   FCPY    IN=[{U01|Input_Access}],OUT=[{U02|Output_Access}]
                   [,NL=({F|V|U}[B],Input_RecordLen,Input_BlockSize)]
                   [,BL=Output_BlockSize]
                   [,COUNT={YES|NO}]
항목 설명

IN

입력 데이터 셋의 액세스명을 지정한다.

OUT

출력 데이터 셋의 액세스명을 지정한다.

NL

NL(No Label) 오퍼랜드는 자기테이프 볼륨의 데이터 셋을 입력할 때 사용된다.

  • F : 고정 길이 레코드 형식의 데이터 셋을 입력한다.

  • V : 가변 길이 레코드 형식의 데이터 셋을 입력한다.

  • U : 정해져 있지 않은 레코드 형식의 데이터 셋을 입력한다.

  • B : 블록화되어 있는 레코드 형식의 데이터 셋을 입력한다.

  • Input_RecordLen : 입력 레코드 길이는 1~32760 범위 내에서 지정한다.

  • Input_Block_Size : 입력 블록 길이는 1~32760 범위 내에서 지정한다.

BL

출력 데이터 셋의 블록 크기를 지정한다.

COUNT

  • YES : 오퍼레이터 콘솔에 복사된 레코드 건수를 표시한다.

  • NO : 오퍼레이터 콘솔에 복사된 레코드 건수를 표시하지 않는다. (기본값)

FIN

FCPY 유틸리티 제어문의 마지막을 나타내는 구문이며 생략 가능하다.

FIN 명령어 형식은 다음과 같다.

/[Label]    FIN    [Comments]

4.3. 사용예제

다음은 카탈로그된 데이터 셋을 직접 액세스 볼륨에 신규 데이터 셋으로 복사하는 예이다. 신규 데이터 셋의 블록 사이즈는 800으로 설정한다.

\ JOB  FCPY01
\ EX   FCPY
\  FD   U01=DA,FILE=F1,VOL=100000,DISP=KEEP
\  FD   U02=DA,FILE=F2,VOL=100000
\  FD   LIST=DA,VOL=WORK,SOUT=A
\  PARA / FCPY IN=U01,OUT=U02,BL=800
\ FIN
\ JEND
  • 입력 데이터셋

    구분 설정값

    데이터셋 이름

    F1

  • 출력 데이터셋

    구분 설정값

    데이터셋 이름

    F2

    볼륨 일련번호

    100000

    블록 크기

    800

다음은 카탈로그된 데이터 셋을 직접 액세스 볼륨에 신규 데이터 셋으로 복사하는 예이다. 오퍼레이터 콘솔에 복사된 레코드 건수를 표시한다.

\ JOB  FCPY02
\  EX   FCPY
\  FD   U01=DA,FILE=F3,VOL=100001,DISP=KEEP
\  FD   U02=DA,FILE=F4,VOL=100001
\  FD   LIST=DA,VOL=WORK,SOUT=A
\  FD   COIN=*
/  FCPY IN=U01,OUT=U02,COUNT=YES
/  FIN
\  JEND
  • 입력 데이터셋

    구분 설정값

    데이터셋 이름

    F3

  • 출력 데이터셋

    구분 설정값

    데이터셋 이름

    F4

    볼륨 일련번호

    100001

4.4. 유의사항

FCPY 유틸리티를 사용하는데 다음의 사항에 유의한다.

  • JCL의 FD 문으로 FCB 서브 파라미터 값이 주어져도 FCPY 제어문의 NL 파라미터, BL 파라미터의 값이 우선시된다.

  • 입력과 출력 데이터 셋으로 동일한 직접 액세스 볼륨의 동일한 데이터셋 이름을 지정하면 안 된다.

  • 입력 데이터셋 FD 문은 임시 데이터 셋을 지정하면 안 된다. 단 instream 데이터 셋을 지정하거나, 이전 STEP에서 FD 문으로 지정한 임시 데이터 셋을 SW 문으로 지정하는 것은 가능하다.

  • 기본적으로 출력 데이터 셋은 입력 데이터 셋의 LRECL, RECFM 값으로 FCB 정보를 오버라이드하여 생성한다. 출력 데이터셋 FD 문의 FCB 파라미터가 지정 되더라도 BLKSIZE 값만 유효하다.

그러나 예외적으로 다음과 같은 경우에 입력 데이터 셋의 LRECL, RECFM 값으로 오버라이드하지 않고 출력 데이터 셋의 FCB 정보 그대로 생성한다.

  • 출력 데이터셋 FD문의 FILE 파라미터에 AD 서브 파라미터가 지정된 경우

    \ JOB  FCPY
    \  EX   FCPY
    \  FD   U01=DA,VOL=100001,FILE=IFILE
    \  FD   U02=DA,VOL=100001,FILE=(OFILE,AD)
    \  FD   LIST=DA,SOUT=A
    \  FD   COIN=*
    /  FCPY IN=U01,OUT=U02
    /  FIN
    \  JEND
  • 입력 데이터셋 FD문에 DUMMY 데이터 셋이 지정된 경우

    \ JOB  FCPY
    \  EX   FCPY
    \  FD   U01=DUMMY
    \  FD   U02=DA,VOL=100001,FILE=OFILE,TRK=(1,1),DISP=CAT,
       FCB=(BLKSIZE=100,LRECL=100,RECFM=FB)
    \  FD   LIST=DA,SOUT=A
    \  FD   COIN=*
    /  FCPY IN=U01,OUT=U02
    /  FIN
    \  JEND
  • 입력 데이터셋 FD문에 DUMMY 데이터셋, FCB 파라미터에 LRECL, RECFM이 지정되고, 출력 데이터 셋이 기존에 작성된 데이터 셋인 경우

    \ JOB  FCPY
    \  EX   *
    \  FD   U02=DA,VOL=100001,FILE=OFILE,TRK=(1,1),DISP=CAT,
       FCB=(BLKSIZE=100,LRECL=100,RECFM=FB)
    \  EX   FCPY
    \  FD   U01=DUMMY,FCB=(BLKSIZE=200,LRECL=200,RECFM=VB)
    \  FD   U02=DA,FILE=OFILE
    \  FD   LIST=DA,SOUT=A
    \  FD   COIN=*
    /  FCPY IN=U01,OUT=U02
    /  FIN
    \  JEND
  • 출력 데이터셋 FD문에 임시 데이터 셋이 지정되고, FCB 파라미터에 LRECL, RECFM이 지정된 경우

    \ JOB  FCPY
    \  EX   FCPY
    \  FD   U01=DA,VOL=100001,FILE=IFILE
    \  FD   U02=DA,VOL=100001,TRK=(1,1),
       FCB=(BLKSIZE=100,LRECL=100,RECFM=FB)
    \  FD   LIST=DA,SOUT=A
    \  FD   COIN=*
    /  FCPY IN=U01,OUT=U02
    /  FIN
    \  JEND

FCPY 유틸리티 프로그램을 실행한 결과는 다음과 같다.

  • 정상적으로 실행한 경우

    유틸리티의 정상 종료 코드 10을 반환한다.

  • 에러가 발생한 경우

    해당 에러 메시지를 LIST FD에 출력하고 각 에러에 해당하는 코드를 반환한다.

    FCPY 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.

    코드 설명

    20

    진행이 가능한 에러가 발생함을 의미한다.

    50

    진행이 불가능한 에러가 발생함을 의미한다.

5. FDLT

FDLT은 File Delete의 약자로 직접 액세스 볼륨에 존재하는 파일을 삭제하는 유틸리티이다.

FDLT 유틸리티는 다음과 같이 삭제 기능을 수행한다.

  • FDLT 문에 볼륨 일련번호가 지정되어 있으면 카탈로그되어 있지 않은 파일로 간주하여 VTOC 에서만 삭제한다.

  • FDLT 문에 볼륨 일련번호가 생략되어 있으면 카탈로그되어 있는 파일로 간주하여 카탈로그에 등록된 정보도 삭제한다.

  • 파일명에 애스터리스크(*)가 포함되어 있는 경우 애스터리스크가 지정된 레벨 이하 모든 레벨의 모든 파일을 삭제하고 카탈로그에 등록된 파일의 정보도 삭제한다.

  • GDG 파일이 지정되었을 경우 지정된 파일을 삭제하고 카탈로그에 등록된 정보도 삭제한다.

5.1. FD 설정

FD 설정 항목은 다음과 같다.

항목 설명

COIN

제어문 입력 파일이다.

LIST

출력 리스트 파일이다.

U50

삭제 대상 파일이다.

5.2. 명령어 설정

COIN으로 입력된 각 명령들은 작업을 수행하기 위한 명령어와 이를 위한 각종 옵션 또는 오퍼랜드들로 구성되며 FDLT는 실행할 명령들을 COIN으로부터 읽어 들여 동작한다.

FDLT

파일의 삭제를 실행한다.

FDLT 문의 구문은 다음과 같다.

/[label]    FDLT    FileName,
                   {[,VolSerial][,Password]
                    [,VOL=(VolSerial[,…])]
                    [,PSW=Password]}
항목 설명

FileName

삭제하려는 파일명을 지정한다.

지정할 수 있는 파일명은 볼륨 일련번호 지정의 유무에 따라 다르다.

VolSerial

삭제하려는 파일이 존재하는 직접 액세스 볼륨의 일련 번호를 지정한다. 이 파라미터는 위치 또는 키워드 파라미터로 지정할 수 있다. 파라미터가 생략되어 있으면 삭제하려는 파일이 카탈로그에 등록된 파일로 간주된다.

볼륨 일련번호의 존재 유무에 따라 지정할 수 있는 파일명은 다음과 같다.

  • 볼륨 일련번호가 있는 경우 : 일반 파일명

  • 볼륨 일련번호가 없는 경우 : 일반 파일명, 카탈로그에 등록된 파일명, GDG 파일

OpenFrame에서는 멀티 볼륨이 사용되지 않으며 이전 FUJITSU XSP에서 사용되던 COIN 구문을 파싱하기 위해서 문법상으로만 지원한다.

Password

삭제할 파일이 패스워드를 가지고 있는 경우 그 패스워드를 지정한다.

이 파라미터는 위치 파라미터 또는 키워드 파라미터로 지정할 수 있다. 볼륨 일련번호가 위치 파라미터로 지정되었을 경우 패스워드도 위치 파라미터로 지정되어야 하며, 볼륨 일련번호가 키워드 파라미터로 지정되었을 경우 패스워드 또한 키워드 파라미터로 지정되어야 한다.

OpenFrame에서는 파일 패스워드 기능이 없으므로 문법상으로만 지원한다.

FIN

FDLT 유틸리티 제어문의 마지막을 나타내는 구문이며 생략 가능하다.

FIN 명령어 형식은 다음과 같다.

/[Label]    FIN    [Comments]

5.3. 사용예제

다음은 카탈로그에 등록되어 있는 'A.*.C’에 해당하는 파일들을 모두 삭제하고 카탈로그에 등록된 정보도 삭제하는 예이다.

\ JOB  FDLT01
\ EX    FDLT
\  FD    LIST=DA,VOL=WORK,SOUT=B
\  FD    COIN=*
/ FDLT A. *. C
/ FIN
\ JEND

다음은 카탈로그에 등록되어 있는 'A.B.*' 파일과 GDG 파일 'A(-2)'을 삭제하고 카탈로그에 등록된 정보도 삭제하는 예이다.

\ JOB  FDLT02
\ EX    FDLT
\  FD    LIST=DA,VOL=WORK,SOUT=B
\  FD    COIN=*
/ FDLT A.B.*
/ FDLT A(-2)
/ FIN
\ JEND

다음은 볼륨 일련번호 '100000’에 존재하는 파일 'ABCD’를 삭제하는 예이다.

\ JOB  FDLT03
\ EX   FDLT
\ FD   LIST=DA,VOL=WORK,SOUT=A
\ FD   COIN=*
/ FDLT ABCD,100000
/ FIN
\ JEND

5.4. 유의사항

액세스명이 U50인 파일을 사용하는 경우 다음 사항에 유의해야 한다.

  • U50=DUMMY로 지정하거나 생략해야 한다.

  • U50=DUMMY로 지정해도 이전의 JOB STEP에서 액세스명이 U50인 파일이 CONT 지정으로 사용되고 있으면 안 된다.

FDLT 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.

  • 정상적으로 실행한 경우

    유틸리티의 정상 종료 코드 10을 반환한다.

  • 에러가 발생한 경우

    해당 에러 메시지를 LIST FD에 출력하고 각 에러에 해당하는 코드를 반환한다.

    FDLT 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.

    코드 설명

    20

    볼륨이 지정되어 있고, 해당 볼륨에 지정한 파일이 존재하지 않음을 의미한다.

    40

    볼륨이 지정되어 있지 않거나, 지정한 파일도 존재하지 않음을 의미한다.

    50

    진행이 불가능한 에러가 발생함을 의미한다.

6. FDMP

FDMP는 File Dump의 약자로 직접 액세스 볼륨에 존재하는 파일의 내용을 편집하고 인쇄하는 파일 덤프 유틸리티이다.

FDMP 유틸리티가 FCHK 유틸리티와 다른 점은 FCHK 유틸리티는 파일의 속성만 인쇄하는 반면, FDMP 유틸리티는 파일의 콘텐츠에 대한 인쇄 작업을 수행한다는 것이다.

  • 직접 액세스 볼륨의 파일 인쇄

    구분 설명

    DSORG

    • PS (Physical Sequential)

    • PO (Partitioned)

    • IS (Indexed Sequential)

    인쇄 문자

    16진수

6.1. FD 설정

FD 설정 항목은 다음과 같다.

항목 설명

COIN

제어문 입력 파일이다.

LIST

리스트 출력 파일이다.

U01

입력 파일이다.

6.2. 명령어 설정

FDMP 유틸리티가 제공하는 기능을 수행하기 위한 명령어를 COIN에 기술하거나 JCL PARA 문의 오퍼랜드를 이용하여 명령어를 기술할 수 있다.

FDMP

FDMP 제어문은 한번만 지정할 수 있다. 이 구문에서는 입력 파일, 리스트 파일의 액세스명 및 가나 문자 출력의 유무를 지정한다.

FDMP 문의 구문은 다음과 같다.

/[label]    FDMP       IN=Input_Access,OUT=Output_Access
                       [,KANA={YES|NO}]
항목 설명

IN

입력 파일의 액세스명을 지정한다.

OUT

리스트 파일의 액세스명을 지정한다.

KANA

가나 문자의 출력 여부를 결정한다. 형식적으로만 지원한다.

DUMP

DUMP 제어문은 데이터셋 구조 또는 자기테이프 파일을 지정하고 인쇄 범위 및 인쇄 형식을 지정한다. 인쇄 가능한 데이터셋 중에 IS(Indexed Sequential)는 KEY 제어문의 형식을 지정한다. DUMP 제어문은 FDMP 다음에 지정한다.

DUMP 문의 구문은 다음과 같다.

/[label]    DUMP    PS=*,*
                       [,RCD]
                    PO=*
                       [,RCD]
                    IS={KEY |
                        KEY,LEN=mmm |
                        KEY,* |
                        *,KEY |
                        *,*}
                        [,KMOD={E|H}]

다음은 DUMP 문의 오퍼랜드에 대한 설명이다.

  • PS= *,*[, RCD]

    PS 파일을 인쇄한다. PS 파일의 인쇄 범위는 다음과 같다.

    오퍼랜드 인쇄 범위

    *,*

    파일의 처음부터 파일의 마지막까지의 모든 블록을 인쇄한다.

    RCD

    레코드 단위의 인쇄 작업을 실행한다. 생략했을 경우 블록 단위의 인쇄 작업을 한다. OpenFrame에서는 형식적으로만 지원하며 항상 RCD가 있는 것처럼 동작한다.

  • PO=*[, RCD]

    PO 파일을 인쇄한다. 특정 멤버를 인쇄하는 경우 JCL의 FD 문으로 멤버명을 지정한다. 디렉터리 전체를 인쇄하는 경우 멤버명을 지정하면 안 된다. 현재 OpenFrame에서는 특정 멤버의 인쇄만 지원한다.

    PO 파일의 인쇄 범위는 다음과 같다.

    오퍼랜드 인쇄 범위

    *

    특정 멤버의 모든 블록을 인쇄한다.

    RCD

    특정 멤버를 레코드 단위로 인쇄한다. 디렉터리를 인쇄하는 경우 파일 단위로 인쇄한다.

    OpenFrame에서는 항상 RCD가 있는 것처럼 동작한다.

  • IS={KEY | KEY, LEN=mmm | KEY,* | *, KEY | *,*}[, KMOD={E | H}]

    삭제되지 않은 IS 파일을 인쇄한다. 다음의 범위를 인쇄한다.

    오퍼랜드 인쇄 범위

    KEY

    KEY 문으로 지정한 키를 가지는 레코드를 인쇄한다.

    KEY, LEN=mmm

    KEY 문으로 지정한 키의 처음부터 mmm Byte 내에 지정한 키를 가지는 레코드를 인쇄한다. mmm은 254Byte 이내에서 지정한다.

    KEY,*

    KEY 문으로 지정한 값을 갖는 레코드부터 파일의 마지막 레코드까지 인쇄한다.

    *, KEY

    파일의 처음부터 KEY 문으로 지정한 값을 갖는 레코드까지 인쇄한다.

    *,*

    파일의 모든 레코드를 인쇄한다.

    KMOD= {E|H}

    KEY 파라미터를 지정한 경우 KEY 문의 형식을 지정한다.

    • E : EBCDIC 문자

    • H : 16 진수

    OpenFrame에서는 형식적으로만 지원한다.

    다음은 KEY,LEN=mmm을 지정할 때의 예이다.

    /  KEY  ‘7001234’
    • LEN=3일 때 KEY의 범위는 7000000 ≤ KEY< 7010000 이다.

    • LEN=4일 때 KEY의 범위는 7001000 ≤ KEY< 7002000 이다.

KEY

DUMP 문에서 IS 파일의 인쇄 범위로 KEY 오퍼랜드를 지정했을 경우 KEY 문을 사용하여 키 값을 입력한다. DUMP 문에서 KEY 오퍼랜드가 지정되지 않았을 경우에는 생략 가능하다.

KEY 문의 구문은 다음과 같으며 최대 50개의 구문을 지정할 수 있다.

/[label]     KEY       ‘XXXXXX’
항목 설명

‘XXXXXX’

키 값을 작은따옴표(' ') 내에 지정한다.

키의 최대 길이는 다음과 같다.

KMOD 옵션 IS 파일의 최대 길이

KMOD=E

254

KMOD=H

508

다음과 같이 KEY 값이 여러 줄에 표시될 경우에는 72번째 칼럼에 스페이스가 아닌 캐릭터를 입력하고 그 다음 줄에 이어서 입력한다.

                                                                       72
/  KEY  'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXC
         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXC
         XXXX''
FIN

FDMP 유틸리티 제어문의 마지막을 나타내는 구문이며 생략 가능하다. FIN 문이 FDMP 제어문의 처음에 지정되었을 경우 FDMP 프로그램은 어떠한 처리도 하지 않고 정상 종료한다.

FIN 명령어 형식은 다음과 같다.

/[Label]    FIN    [Comments]

6.3. 사용예제

다음은 직접 액세스 볼륨의 PS(Physical Sequential) 파일을 인쇄하는 예이다.

\ JOB  FDMP01
\ EX   FDMP
\ FD   U01=DA,VOL=USER10,FILE=F1
\ FD   LIST=DA,VOL=WORK,CYL=(5,1),SOUT=A
\ FD   COIN=*
/ FDMP IN=U01,OUT=LIST,KANA=YES
/ DUMP PS=*,*,RCD
/ FIN
\ JEND
항목 설명

볼륨 일련번호

USER10

파일명

F1

인쇄 범위

모든 블록

인쇄 단위

레코드 단위

다음은 직접 액세스 볼륨의 PO(Partitioned) 파일을 인쇄하는 예이다.

\ JOB  FDMP03
\ EX   FDMP
\ FD   U01=DA,VOL=USER10,FILE=F3,MEMBER=AAA
\ FD   LIST=DA,VOL=WORK,CYL=(5,1),SOUT=A
\ FD   COIN=*
/ FDMP IN=U01,OUT=LIST
/ DUMP PO=*
/ FIN
\ JEND
항목 설명

볼륨 일련번호

USER10

파일명

F3

멤버명

AAA

인쇄 범위

모든 블록

인쇄 단위

블록 단위

다음은 직접 액세스 볼륨의 IS(Indexed Sequential) 파일을 인쇄하는 예이다.

\ JOB  FDMP07
\ EX   FDMP
\ FD   U01=DA,VOL=USER10,FILE=F7
\ FD   LIST=DA,VOL=WORK,CYL=(5,1),SOUT=A
\ FD   COIN=*
/ FDMP IN=U01,OUT=LIST
/ DUMP IS=*,*
/ FIN
\ JEND
항목 설명

볼륨 일련번호

USER10

파일명

F7

인쇄 범위

모든 레코드 인쇄

다음은 직접 액세스 볼륨의 IS(Indexed Sequential) 파일을 인쇄하는 예이다.

\ JOB  FDMP07
\ EX   FDMP
\ FD   U01=DA,VOL=USER10,FILE=F8
\ FD   LIST=DA,VOL=WORK,CYL=(5,1),SOUT=A
\ FD   COIN=*
/ FDMP IN=U01,OUT=LIST
/ DUMP IS=KEY
/  KEY='12345'
/ FIN
\ JEND
항목 설명

볼륨 일련번호

USER10

파일명

F8

KEY 값

12345

6.4. 유의사항

FDMP 프로그램은 FL(파일 라벨)을 인쇄하지 않는다.

FDMP 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.

  • 정상적으로 실행한 경우

    유틸리티의 정상 종료 코드 10을 반환한다.

  • 에러가 발생한 경우

    해당 에러 메시지를 LIST FD에 출력하고 각 에러에 해당하는 코드를 반환한다.

    FDMP 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.

    코드 설명

    20

    진행이 가능한 에러가 발생함을 의미한다.

    50

    진행이 불가능한 에러가 발생함을 의미한다.

7. GDGM

GDGM(Generation Data Group Manager)은 시스템/마스터 카탈로그에 등록된 GDG의 GDS를 관리하기 위한 유틸리티이다.

제어문에서는 볼륨 종류와 GDG 이름, GDG 세대번호를 지정해줄 수 있으며, GDGM은 카탈로그에서 해당 GDG의 지정된 세대번호만큼의 GDS를 남기고 이전 세대를 삭제한 뒤 그 결과를 출력한다. 또한 지정된 볼륨 종류가 DA(=DASD)일 경우 GDS를 카탈로그에서 삭제하면서 실제 볼륨에서도 삭제한다. 만약 세대번호를 '/'로 지정했을 경우 GDGM은 삭제를 수행하지 않고 해당 GDG의 상태만을 출력한다.

7.1. FD 설정

FD 설정 항목은 다음과 같다.

항목 설명

COIN

제어문 입력 데이터 셋이다.

LIST

리스트 출력 데이터 셋이다.

7.2. 명령어 설정

COIN으로 입력되는 명령어들은 GDGM, FILE, EJECT, FIN이 있으며 각각에 대한 상세한 정보는 다음과 같다.

GDGM

GDGM 작업을 시작하기 위한 제어문으로 이어지는 FILE 문의 GDG가 속한 볼륨의 종류를 기술한다. 첫 GDGM 문이 나타나기 전까지 기술된 다른 제어문은 모두 무시된다.

GDGM 명령어 구문의 형식은 다음과 같다.

/[Label]    G[DGM]    [ { DA | MT } ]
항목 설명

DA

이후의 FILE 문에서 기술하는 GDG가 속한 볼륨이 직접 액세스 볼륨임을 나타낸다. 볼륨 종류가 DA로 설정될 경우 GDGM은 카탈로그에서 GDS를 삭제할 때 실제 볼륨에서도 GDS를 삭제한다.

MT

이후의 FILE 문에서 기술하는 GDG가 속한 볼륨이 자기 테이프 볼륨임을 나타낸다. 볼륨 종류가 MT로 설정될 경우 GDGM은 카탈로그에서 GDS를 삭제할 때 볼륨에서의 삭제는 수행하지 않는다.

FILE

GDGM에서 처리할 GDG 이름과 세대 번호를 기술한다. 세대번호는 네 가지 형태로 지정될 수 있다.

FILE 명령어 구문의 형식은 다음과 같다.

/[Label]    FILE      GDGName{(0) | (m) | (-n) | (/)}
항목 설명

GDGName

GDGM이 처리할 GDG 이름을 지정한다. 입력은 최대 17자까지 가능하다.

(0)

지정한 GDG에 대해 최신의 세대만을 남기고 이전 세대의 GDS를 모두 삭제한다. 이 경우 m = 1과 같이 동작한다.

(m)

지정한 GDG에 대해 최신의 m개 세대를 남기고 나머지 GDS를 모두 삭제한다.

예를 들어 m = 3일 경우 최신의 세대(GDG(0))를 포함한 세 세대(GDG(-1), GDG(-2))까지를 남기고 그 이전 세대(GDG(-3), GDG(-4) …​)를 삭제한다. m은 2자리수 이내의 정수여야 한다.

(-n)

지정한 GDG에 대해 최신 세대에서 -n 세대까지를 남기고 나머지 GDS를 모두 삭제한다. 이 경우 m = n+1과 같이 동작한다. n은 2자리수 이내의 정수여야 한다.

(/)

지정한 GDG에 대해 GDS의 삭제 없이 출력만을 수행한다.

EJECT

출력하는 리스트를 교체해주기 위한 명령어 구문으로 현재 OpenFrame에선 지원하지 않는다.

FIN

GDGM 제어문의 종료를 나타내는 제어문으로 생략할 수 있다.

FIN 명령어 구문의 형식은 다음과 같다.

/[Label]    FIN    [Comments]

7.3. 사용예제

다음은 GDGM 유틸리티를 이용해 GDG1과 GDG2에서 최신의 3개 세대만을 남기고 나머지 GDS를 마스터 카탈로그와 직접 액세스 볼륨에서 삭제한 뒤 그 결과를 출력하는 예이다.

\  JOB  GDGM00
\  EX    GDGM
\  FD    LIST=DA,VOL=WORK,TRK=(1,1,RLSE),SOUT=T
\  FD    COIN=*
/  GDGM  DA
/  FILE GDG1(3)
/  FILE  GDG2(-2)
/  FIN
\  JEND

7.4. 유의사항

GDGM은 FILE 문 이외의 제어문에서 오류가 발생할 경우 해당 JCL 라인 번호를 출력하고 Job 수행을 중지하며, FILE 문에서 오류가 발생했을 경우 해당 FILE 문의 라인 번호와 오퍼랜드를 에러 메시지와 함께 출력하고 다음 제어문을 수행한다.

GDGM 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.

  • 정상적으로 실행을 완료한 경우

    유틸리티의 정상 종료 코드 10을 반환한다.

  • 에러가 발생한 경우

    해당 에러 메시지를 출력하고 각 에러에 해당하는 코드를 반환한다.

    GDGM 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.

    코드 설명

    20

    진행이 가능한 에러가 발생했음을 의미한다.

    50

    더 이상 진행이 불가능한 에러가 발생했음을 의미한다.

8. ISFG

ISFG유틸리티는 Indexed Sequential File Generator의 약자로 일반 Non-VSAM 파일을 가지고 직접 액세스 볼륨에 존재하는 인덱스 파일을 생성하는 유틸리티이다.

ISFG 유틸리티는 다음과 같이 인덱스 파일 생성 기능을 수행한다.

  • ISFG의 U01, U05문에 볼륨 일련번호가 지정되어 있으면 카탈로그되어 있지 않은 파일로 처리한다.

  • ISFG의 U01, U05문에 볼륨 일련번호가 지정되지 않으면 카탈로그되어 있는 파일로 간주한다.

  • ISFG의 U05문에 지정된 인덱스 파일로 데이터 셋을 생성하며, 생성된 인덱스 파일은 내부적으로 KSDS 파일이다.

8.1. FD 설정

FD 설정 항목은 다음과 같다.

항목 설명

COIN

제어문 입력 파일이다.

LIST

출력 리스트 파일이다.

U01

원본 Non-Vsam 파일이다. (입력 파일)

U05

생성할 인덱스 파일이다. (출력 파일)

8.2. 명령어 설정

COIN으로 입력된 각 명령들은 작업을 수행하기 위한 명령어와 이를 위한 각종 옵션 또는 오퍼랜드들로 구성되며 ISFG는 실행할 명령들을 COIN으로부터 읽어 들여 동작한다.

ISFG

입력 및 출력 파일(인덱스 파일)의 속성을 지정하는 명령문이다.

ISFG 명령어 구문은 다음과 같다.

/[label]   ISFG    IN=[{U01|Input_Access}], OUT=[{U05|Output_Access}]
                   [,SPFL]
                   [,DISP={YES | NO}]
항목 설명

IN

입력 파일의 액세스명을 지정한다. (주로 U01)

OUT

출력 파일의 액세스명을 지정한다. (주로 U05)

SPFL

현재는 지원하지 않는다.

DISP

현재는 지원하지 않는다.

AREA

출력 파일(인덱스 파일)의 할당 공간 속성을 지정하는 명령문이다.

AREA 명령어 구문은 다음과 같다.

/[label]   AREA    PRIM=prime_no
                   [,COVF=track_no][,INDX=index_no]
항목 설명

PRIM

출력 인덱스 파일에 할당할 저장소의 실린더 용량을 지정한다.

현재는 파싱만 지원한다.

COVF

출력 인덱스 파일에 할당할 저장소의 실린더 트랙 용량을 지정한다.

현재는 파싱만 지원한다.

INDX

인덱스 생성 조건을 지정한다. 현재는 파싱만 지원한다.

BTYP

출력 파일(인덱스 파일)의 속성을 지정하는 명령문이다.

BTYP 명령어 구문은 다음과 같다.

/[label]   BTYP    RKYP=key_pos,KEYS=key_length
                   [,RCDS=record_length][,BLKS=block_length]
                   [,RFOM={F | V}][,BLKD=block_density]
항목 설명

RKYP

출력 인덱스 파일에서 한 레코드 상에서 키가 되는 부분의 위치를 지정한다.

KEYS

출력 인덱스 파일에서 한 레코드 상에서 키가 되는 부분의 키의 길이를 지정한다.

RCDS

출력 인덱스 파일에서 데이터 당 레코드의 길이를 지정한다. 생략하는 경우에 기본값은 입력 파일의 레코드 길이를 사용한다.

BLKS

출력 인덱스 파일에서 블록 길이를 지정한다. 생략하는 경우에 기본값은 입력 파일의 블록 길이를 사용한다.

RFOM

출력 인덱스 파일의 레코드 형식을 지정한다.

  • F : 고정 길이 레코드 형식

  • V : 가변 길이 레코드 형식

BLKD

출력 인덱스 파일에서 레코드 수용밀도를 지정한다. 현재는 파싱만 지원한다.

FIN

ISFG 유틸리티 제어문의 마지막을 나타내는 구문이며 생략 가능하다.

FIN 명령어 형식은 다음과 같다.

/[Label]    FIN    [Comments]

8.3. 사용예제

다음은 U01의 Non-Vsam 데이터 셋을 U05에 지정한 인덱스 파일로 생성하는 예이다.

\ JOB  ISFG01
\ EX    ISFG
\ FD    U01=DA,FILE=SAMPLE.DATA01,VOL=DEFVOL,DISP=DLT
\ FD    U05=DA,FILE=SAMPLE.VS.DATA01,VOL=DEFVOL,FCYL=(30,OLD),
         FCB=(LRECL=500,BLKSIZE=5000,RECFM=FB)
\ FD    LIST=DA,VOL=WORK,TRK=5,SOUT=A
\ FD    COIN=*
/ ISFG  IN=U01,OUT=U05
/ AREA  PRIM=30
/ BTYP  RCDS=500,BLKS=5000,RKYP=4,KEYS=6
/ FIN
\ JEND

8.4. 유의사항

ISFG 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.

  • 정상적으로 실행한 경우

    유틸리티의 정상 종료 코드 10을 반환한다.

  • 에러가 발생한 경우

    해당 에러 메시지를 LIST FD에 출력하고 각 에러에 해당하는 코드를 반환한다.

    ISFG 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.

    코드 설명

    20

    입력파일을 가지고 출력파일을 생성할때 중복된 데이터가 있음을 의미한다. 중복 레코드의 건수와 중복 레코드의 내용이 LIST 파일에 출력된다. 또한, LIST 파일에 표시되는 출력 레코드의 총 건수는 앞서 말한 중복 레코드건수와 새로이 출력 파일에 성공적으로 추가된 레코드 건수를 합한 값이다.

    40

    코드 20 이외의 진행이 가능한 에러가 발생함을 의미한다.

    50

    진행이 불가능한 에러가 발생함을 의미한다.

9. JYQDDUTY

JYQDDUTY 유틸리티는 데이터베이스의 작성, 삭제 등의 데이터 셋의 내용을 데이터베이스로 LOAD, UNLOAD하는 기능을 수행한다.

JYQDDUTY 유틸리티 프로그램은 다음과 같은 기능을 제공한다.

  • 메타 데이터베이스 정의 및 삭제

    • 메타 데이터베이스 정의문(CREATE DBSPACE FOR MD)

    • 메타 데이터베이스 삭제문(DROP DBSPACE FOR MD)

  • 퍼블릭 데이터베이스 스페이스 정의 및 삭제

    • 퍼블릭 데이터베이스 스페이스 정의문(CREATE DBSPACE FOR PUBLIC)

    • 퍼블릭 데이터베이스 스페이스 삭제문(DROP DBSPACE FOR PUBLIC)

  • 스키마 정의 및 삭제

    • 스키마 정의문(CREATE SCHEMA)

    • 스키마 삭제문(DROP SCHEMA)

  • 테이블 정의 및 삭제

    • 테이블 정의문(CREATE TABLE)

    • 테이블 삭제문(DROP TABLE)

  • 뷰 정의 및 삭제

    • 뷰 정의문(CREATE VIEW)

    • 뷰 삭제문(DROP VIEW)

  • 인덱스 정의 및 삭제

    • 인덱스 정의문(CREATE INDEX)

    • 인덱스 삭제문(DROP INDEX)

  • 파일 정의 및 삭제

    • 파일 정의문(CREATE FILE)

    • 파일 삭제문(DROP FILE)

  • 기타 기능

    • LOAD 문(LOAD)

    • UNLOAD 문(UNLOAD)

9.1. FD 설정

FD 설정 항목은 다음과 같다.

항목 설명

EX 문

PGM 오퍼랜드에 유틸리티 이름 "JYQDDUTY"를 지정한다.

SYSIN 문

제어문 데이터 셋을 지정한다.

SYSPRINT 문

메세지 데이터 셋을 지정한다.

AIMPED 문

AIMPED 를 지정한다.

SYSDBDCT 문

메타 데이터베이스를 위한 데이터 셋을 지정한다.

SYSULIST 문

JYQDDUTY 유틸리티의 처리 결과를 출력하는 데이터 셋을 지정한다.

INDATA 문

JYQDDUTY 유틸리티의 LOAD 를 수행할 때 입력하는 데이터 셋을 지정한다.

OUTDATA 문

JYQDDUTY 유틸리티의 UNLOAD 를 수행할 때 출력하는 데이터 셋을 지정한다.

9.2. CREATE/DROP 명령어 설정

본 절에서는 JYQDDUTY에서 수행 가능한 명령어에 대해 설명한다. 명령어의 사용법에 대한 설명은 각 절의 설명을 참고한다.

CREATE DBSPACE(메타 데이터베이스 스페이스)

메타 데이터베이스 스페이스를 생성한다. 퍼블릭 데이터베이스를 관리하는 데이터베이스이다.

CREATE DBSPACE(메타 데이터베이스 스페이스) 명령어 구문은 다음과 같다.

CREATE DBSPACE  데이터베이스스페이스명  FOR MD
                ENVIRONMENT SIS SIS 이름  
                            DID AIM 디렉터리 ID 
                            RECOVERY(down,cancel,forward)
                ALLOCATE    DATASET  데이터 셋 이름 
                            VOLUME   볼륨 일련번호     UNIT  유닛 타입 
                ATTRIBUTE   SPACE(XXX, XXX, CYLINDER | TRACK)
                PROTECT | NOPROTECT
항목 설명

DBSPACE

생성할 메타 데이터베이스 스페이스를 지정한다.

SIS

해당 데이터베이스 및 퍼블릭 데이터베이스가 사용하는 AIM 환경으로서 SIS 이름을 지정한다. 현재 기능은 없고 메타 정보로만 저장한다.

DID

해당 데이터베이스 및 퍼블릭 데이터베이스가 사용하는 AIM 환경으로서 AIM 디렉터리 ID를 지정한다. 현재 기능은 없고 메타 정보로만 저장한다.

RECOVERY

해당 메타 데이터베이스 및 퍼블릭 데이터베이스에 대한 리커버리 방법을 지정한다.

DATASET

생성할 데이터셋 이름을 지정한다.

VOLUME

생성할 데이터 셋의 VOLUME 이름을 지정한다.

UNIT

데이터 셋을 할당하기 위한 직접 액세스 장치의 장치 타입 또는 장치 그룹명을 지정한다. 현재 기능은 없고 메타 정보로만 저장한다.

SPACE

데이터 셋을 직접 엑세스 장치에 할 당할 때의 할당 스페이스량 및 할당 방법(초기량, 증분량, 할당방법)을 지정한다. 현재 기능은 없고 메타 정보로만 저장한다.

PROTECT|NOPROTECT

SQL 문에 의한 기밀 보호기능을 사용하는지 안하는 지를 지정한다. 현재 기능은 없고 메타 정보로만 저장한다.

  • 제약 사항

    • 메타 데이터베이스 스페이스명은 8자 이내로 작성한다.

    • 메타 데이터베이스 스페이스명은 유일해야 한다.

DROP DBSPACE(메타 데이터베이스 스페이스)

메타 데이터베이스 스페이스를 삭제한다.

DROP DBSPACE(메타 데이터베이스 스페이스) 명령어 구문은 다음과 같다.

DROP DBSPACE 메타 데이터베이스 스페이스 이름 FOR MD
  • 제약 사항

    • 메타 데이터베이스 스페이스 이름은 8자 이내로 작성한다.

    • 명령문을 수행할 때 해당 메타 데이터베이스 스페이스와 관련한 데이터베이스 스페이스와 테이블 또는 인덱스가 남아있다면 삭제할 수 없다.

CREATE DBSPACE(퍼블릭 데이터베이스 스페이스)

퍼블릭 데이터베이스 스페이스를 생성한다. 테이블, 뷰, 인덱스를 관리한다.

CREATE DBSPACE(퍼블릭 데이터베이스 스페이스) 명령어 구문은 다음과 같다.

CREATE DBSPACE 퍼블릭 데이터베이스 스페이스 이름 FOR PUBLIC
  • 제약 사항

    • 퍼블릭 데이터베이스 스페이스 이름은 18자 이내로 작성한다.

DROP DBSPACE(퍼블릭 데이터베이스 스페이스)

퍼블릭 데이터베이스 스페이스를 삭제한다.

DROP DBSPACE(퍼블릭 데이터베이스 스페이스) 명령어 구문은 다음과 같다.

DROP DBSPACE 퍼블릭 데이터베이스 스페이스 이름 FOR PUBLIC
  • 제약 사항

    • 퍼블릭 데이터베이스 스페이스 이름은 18자 이내로 작성한다.

    • 명령문을 수행할 때 해당 퍼블릭 데이터베이스 스페이스와 관련한 테이블 또는 인덱스가 남아있다면 삭제할 수 없다.

CREATE SCHEMA

스키마를 생성한다. 스키마는 데이터베이스의 단위이며 Tibero에서는 스키마의 개념을 사용하지 않는다.

CREATE SCHEMA 명령어 구문은 다음과 같다.

CREATE SCHEMA 스키마 이름
  • 제약 사항

    • 스키마 이름은 18자 이내로 작성한다.

    • 동일한 이름의 스키마 이름을 지정할 수 없다.

DROP SCHEMA

스키마의 정의를 삭제하는 경우에는 DROP SCHEMA 문을 사용한다.

DROP SCHEMA 명령어 구문은 다음과 같다.

DROP SCHEMA 스키마 이름 [CASCADE]
  • 제약 사항

    • 스키마 이름은 18자 이내로 작성한다.

    • CASCADE를 지정할 때 해당 스키마와 관련된 테이블, 뷰, 인덱스, 파일이 모두 삭제되므로 주의하여 지정한다.

    • CASCADE를 지정하지 않았을 경우 해당 스키마와 관련된 테이블, 뷰, 인덱스, 파일이 남아 있다면 삭제할 수 없다.

CREATE TABLE

테이블을 생성한다. 데이터 조작의 대상이 되는 테이블 이름을 지정하고 테이블을 구성하는 열을 정의한다.

CREATE TABLE 명령어 구문은 다음과 같다.

CREATE TABLE 스키마 이름.테이블 이름
            (컬럼명 컬럼타입(길이) 제약조건1(NOT NULL| PRIMARY KEY | UNIQUE), ...
               컬럼명 컬럼타입(길이) 제약조건1(NOT NULL| PRIMARY KEY | UNIQUE)
             제약조건2(PRIMARY KEY | UNIQUE)(컬럼명, 컬럼명 ... ))
             [NCOMMENT N'코멘트'| COMMENT '코멘트']
             ON 테이블 데이터베이스 스페이스 이름
항목 설명

스키마 이름.테이블 이름

스키마 이름과 테이블 이름을 점(.)으로 구분하여 기술한다.

컬럼명

컬럼명을 기술한다.

  • CHAR : character

  • NUMERIC : signed zoned decimal

  • UNUMERIC : unsigned zoned decimal

  • DECIMAL : signed packed decimal

  • UDECIMAL : unsigned packed decimal

컬럼 타입(길이)

컬럼 타입과 해당 컬럼의 길이를 기술한다.

제약조건1

제약조건을 기술한다.

  • NOT NULL

  • PRIMARY KEY

  • UNIQUE

제약조건2

해당 기능은 수행하지 않는다. 위에 기술된 컬럼들을 괄호로 묶어서 제약조건을 설정한다.

코멘트

코멘트를 기술한다.

  • N : National Character로 기술

테이블 데이터베이스 스페이스 이름

테이블 데이터베이스 스페이스 이름을 기술한다.

  • 제약 사항

    • 테이블 이름은 36자 이내로 작성한다.

    • 테이블 이름은 스키마 이름.테이블 이름으로 작성한다.

    • 최대 지정할 수 있는 컬럼의 수는 1024개이다.

    • 같은 이름의 컬럼명은 지정할 수 없다.

DROP TABLE

테이블의 정의 정보 및 테이블을 삭제하는 경우에는 DROP TABLE 문을 사용한다. 해당 테이블과 관련된 뷰, 파일을 삭제하기 위해서 CASCADE를 지정할 수 있다.

DROP TABLE 명령어 구문은 다음과 같다.

DROP TABLE 스키마 이름.테이블 이름[CASCADE]
  • 제약 사항

    • 테이블 이름은 36자 이내로 작성한다.

    • 테이블 이름은 "스키마 이름.테이블 이름"으로 지정한다.

    • CASCADE 를 지정시 해당 테이블과 관련된 뷰, 인덱스, 파일이 모두 삭제되므로 주의하여 지정한다.

    • CASCADE 를 지정하지 않았을 경우 해당 테이블과 관련된 뷰, 파일이 남아 있을 경우 삭제할 수 없다.

CREATE VIEW

뷰를 생성한다. 응용프로그램에서의 데이터 조작을 간이화하기 위해서 뷰를 사용한다. JOIN 속성을 이용하여 여러 테이블을 결합해 1개의 테이블로 처리하기 위해 뷰를 이용한다.

CREATE VIEW 명령어 구문은 다음과 같다.

CREATE VIEW 스키마 이름.뷰 이름
           (컬럼명  , ...
             컬럼명)
            [NCOMMENT N'코멘트'| COMMENT '코멘트']
            AS SELECT   컬럼명  , ...
                        컬럼명 
                        FROM 스키마 이름.테이블 이름 
항목 설명

스키마 이름.뷰 이름

스키마 이름과 뷰 이름을 점(.)으로 구분하여 기술한다.

컬럼명

컬럼명을 기술한다.

코멘트

코멘트를 기술한다.

  • N : National Character로 기술

스키마 이름. 테이블 이름

스키마 이름과 테이블 이름을 점(.)으로 구분하여 기술한다.

  • 제약 사항

    • 뷰 이름은 36자 이내로 작성한다.

    • 뷰 이름은 "스키마 이름.뷰 이름"으로 작성한다.

    • 뷰의 컬럼 수와 테이블에서 AS SELECT 절에서 지정한 컬럼의 수는 동일해야 한다.

    • 뷰에 사용되는 테이블은 모두 동일한 스키마에 존재해야 한다.

DROP VIEW

뷰를 삭제하는 경우에는 DROP VIEW 문을 사용한다.

DROP VIEW 명령어 구문은 다음과 같다.

DROP VIEW 스키마 이름.뷰 이름[CASCADE]
  • 제약 사항

    • 뷰 이름은 36자 이내로 작성한다.

    • 뷰 이름은 "스키마 이름. 뷰 이름"으로 지정한다.

    • CASCADE를 지정할 때 해당 뷰와 관련된 파일이 모두 삭제되므로 주의하여 지정한다.

    • CASCADE를 지정하지 않았을 경우 해당 뷰와 관련된 파일이 남아있을 경우 삭제할 수 없다.

CREATE INDEX

인덱스를 생성한다. 데이터베이스의 데이터 조작에 있어서 데이터의 검색효율을 높이기 위함이다.

CREATE INDEX 명령어 구문은 다음과 같다.

CREATE INDEX 스키마 이름.테이블 이름.인덱스 이름
             KEY( 컬럼명 , 컬럼명 ...  )
             FREERATE 숫자 ON 인덱스 데이터베이스 스페이스 이름
항목 설명

INDEX

스키마 이름과 테이블 이름과 인덱스 이름을 점(.)으로 구분하여 기술한다.

KEY

인덱스로 설정할 컬럼명을 기술한다.

FREERATE

해당 기능은 지원하지 않는다.

인덱스 데이터베이스 스페이스

인덱스 데이터베이스 스페이스 이름을 기술한다.

  • 제약 사항

    • 인덱스 이름은 36자 이내로 작성한다.

    • 인덱스 이름은 "스키마 이름.테이블 이름.인덱스 이름"으로 지정한다.

    • 지정할 수 있는 컬럼의 수는 최대 1024개 이다.

DROP INDEX

인덱스에 대한 정의를 삭제하는 경우에는 DROP INDEX 문을 사용한다.

DROP INDEX 명령어 구문은 다음과 같다.

DROP INDEX 스키마 이름.테이블 이름.인덱스 이름
  • 제약 사항

    • 인덱스 이름은 36자 이내로 작성한다.

    • 인덱스 이름은 "스키마 이름.테이블 이름.인덱스 이름"으로 지정한다.

CREATE FILE

파일의 입출력문을 사용해 데이터베이스를 액세스하는 응용프로그램을 운용하는 경우 CREATE FILE 문을 사용하여 파일을 생성한다.

CREATE FILE 명령어 구문은 다음과 같다.

CREATE FILE 파일명  FOR PHYSICAL | LOGICAL
            ON 스키마 이름.테이블 이름
            RECORD(FREE)
            ACCESS  PATH
            (INTERNAL | EXTERNAL PATH FOR KEY
              WITH 스키마 이름.테이블 이름.인덱스 이름 ...)
항목 설명

FILE

파일명을 지정한다.

PHYSICAL | LOGICAL

physical 파일인지 logical 파일인지 지정한다.

스키마 이름.테이블 이름

스키마 이름과 테이블 이름을 점(.)으로 구분하여 기술한다.

RECORD

해당 기능은 사용하지 않는다.

ACCESS PATH

INTERNAL인지 EXTERNAL인지 지정한다.

스키마 이름.테이블 이름.인덱스명

"스키마 이름.테이블 이름.인덱스 이름"을 점(.)으로 구분하여 기술한다.

다음은 명령어 제약 사항에 대한 설명이다.

  • 파일 이름은 36자 이내로 작성한다.

  • ACCESS PATH를 기술할 때 지정하려는 인덱스가 미리 생성되어 있어야 한다.

DROP FILE

파일을 삭제하는 경우에는 DROP FILE 문을 사용한다.

DROP FILE 명령어 구문은 다음과 같다.

DROP FILE  파일 이름 FOR PHYSICAL | LOGICAL 
  • 제약 사항

    • 파일 이름은 36자 이내로 작성한다.

9.3. LOAD/UNLOAD 명령어 설정

LOAD

외부 데이터 셋을 입력받아 데이터베이스를 작성하는 명령문이다.

LOAD 문의 기능은 입력 데이터 셋의 데이터로부터 데이터베이스에 데이터 삽입과 추가를 할 수 있다. 삽입, 추가의 대상이 되는 테이블의 테이블 이름을 지정한다.

입력 데이터 셋의 데이터 type과 데이터베이스의 컬럼 type이 일치하도록 CREATE TABLE 명령어 수행 시 컬럼 type을 입력 데이터 셋의 데이터에 맞추어 지정해주어야 한다.

LOAD 명령어 구문은 다음과 같다.

LOAD TABLE 스키마 이름.테이블 이름 FROM DDNAME DD 이름.테이블
           TFREERATE(숫자) ERRORLIMIT(숫자)WITH [NULL | NONULL]
           MODE [NEW | IGNORE | ADD [REPLACE] | UPDATE] [KEYCHECK | ALLCHECK]
항목 설명

TABLE

스키마.테이블명을 지정한다.

FROM DDNAME

DD 이름을 지정한다.

TFREERATE

해당 기능은 지원하지 않는다.

ERRORLIMIT

해당 기능은 지원하지 않는다.

MODE

  • NEW : 정의 직후 상태의 데이터베이스에 데이터를 작성하는 경우에 지정한다.

  • IGNORE : MODE NEW에서 사용되는 옵션으로 작성이 끝난 데이터를 삭제한 후에 데이터를 작성하는 경우에 지정한다.

  • ADD : 작성이 끝난 데이터베이스에 데이터를 추가하는 경우에 지정한다. REPLACE를 지정할 경우 LOAD 중 Primary Key에 대한 중복이 발생할 경우 UPDATE를 수행한다.

  • UPDATE : 해당 기능은 지원하지 않는다.

KEYCHECK | ALLCHECK

해당 기능은 지원하지 않는다.

  • 제약 사항

    • 테이블 이름은 36자 이내로 작성한다.

    • 테이블 이름은 "스키마 이름.테이블 이름"으로 지정한다.

    • LOAD의 기능을 사용하기 위해서는 테이블이 미리 생성되어야 한다.

다음은 FGA.R.COMMON.sample이라는 외부 데이터 셋의 데이터를 FGA_R_COMMON_TBL이라는 데이터베이스 테이블에 입력하는 예제이다.

\    JOB       JYQLOAD
\    EX        JYQDDUTY
\    FD        INDATA=DA,VOL=100000,FILE=FG9.R.COMMON.sample
\    FD        LIST=DA,VOL=WORK,TRK=(30,10,RLSE),SOUT=A
\    FD        SYSIN=*
     LOAD TABLE SURDIIX.FGA_R_COMMON_TBL
                FROM DDNAME INDATA TFREERATE(10)
                WITH NONULL MODE NEW IGNORE KEYCHECK
\/
\   JEND
UNLOAD

데이터베이스 테이블의 데이터를 외부 데이터 셋으로 출력하는 명령문이다. UNLOAD 문의 기능은 데이터베이스에 작성된 데이터를 외부 데이터 셋에 출력할 수 있다.

데이터베이스 테이블의 데이터는 CREATE TABLE 명령어 수행 시의 컬럼 type을 이용하여 외부 데이터 셋의 record 형태로 serialize 된다.

UNLOAD 명령어 구문은 다음과 같다.

UNLOAD TO DDNAME DD 이름  
          WITH [FORMAT지정|NULL지정]
          AS SELECT [delimeter | column] FROM [nTABLE] [WHERE ~ ] [ORDER BY columns]
항목 설명

DDNAME

DD명을 지정한다.

FORMAT

해당 기능은 지원하지 않는다.

NULL|NONULL

해당 기능은 지원하지 않는다.

AS

SQL 문인 SELECT 문을 작성한다.

  • [delimeter | column] : SELECT를 통해 가져올 데이터를 명시한다. delimeter의 경우 따옴표(')사이에 둘러쌓인 영역의 값이면 모두 delimeter로 사용 가능하다.

  • [nTABLE] : 데이터를 가져올 테이블을 명시한다. 최대 2개의 테이블에서 데이터를 가져올 수 있다.

  • [WHERE ~] : 지정한 테이블에서 가져올 data의 범위를 지정한다.

  • [ORDER BY columns] : 가져온 데이터를 해당 columns 순서로 정렬한다.

  • 제약 사항

    • DD 이름은 JCL에서 output용 데이터 셋을 위해 지정한 DD 이름으로 작성한다.

    • AS SELECT 절에 테이블 이름은 36자 이내로 작성한다.

    • AS SELECT 절에 테이블 이름은 "스키마 이름.테이블 이름"으로 지정한다.

    • AS SELECT 절에 컬럼명을 기술할 때 지정한 테이블에 해당 컬럼이 존재해야 한다.

다음은 FGA_R_COMMON_TBL이라는 데이터베이스 테이블에 작성된 데이터를 FGA.R.COMMON.out이라는 데이터 셋에 출력하는 예제이다.

\    JOB       JYQUNLOD
\    EX        JYQDDUTY
\    FD        OUTDATA=DA,VOL=100000,FILE=FG9.R.COMMON.out
\    FD        LIST=DA,VOL=WORK,TRK=(30,10,RLSE),SOUT=A
\    FD        SYSIN=*
     UNLOAD TO DDNAME OUTDATA
            WITH NONULL AS SELECT
            * FROM SURDIIX.FGA_R_COMMON_TBL
\/
\   JEND

9.4. 관련 환경설정

JYQDDUTY 유틸리티의 설정은 OpenFrame 환경설정에서 ds 서브젝트의 RDBII_DATASET 섹션에 한다. 자세한 내용은 "OpenFrame 환경설정 안내서"를 참고한다.

10. KBKARCS

KBKARCS 유틸리티는 BACKUP과 RESTORE 명령을 통해 주로 천재지변에 의한 시스템 손상의 대비나 중요한 데이터의 보호 등의 목적을 위한 데이터 셋이나 볼륨의 백업 및 복원 기능을 지원한다.

BACKUP 명령은 JCL의 컨트롤 문장에서 기술한 데이터 셋이나 볼륨을 하나의 데이터 셋으로 묶어 지정된 볼륨 디렉터리에 저장하고, RESTORE 명령은 BACKUP 처리한 데이터 셋을 원래의 상태로 풀어서 지정한 볼륨 디렉터리에 복원시킨다. 이때 내부적으로는 UNIX에서 제공하는 tar 프로그램을 사용한다.

OpenFrame에서는 BACKUP 명령을 처리할 때 BACKUP 대상 데이터 셋의 카탈로그 정보를 별도의 메타정보 파일로 구성하여 BACKUP 대상 데이터 셋과 함께 묶어두며, RESTORE 명령을 처리할 때 이 메타정보 파일을 먼저 읽어 BACKUP 처리 당시의 카탈로그 정보로 복원시킨다.

10.1. FD 설정

BACKUP과 RESTORE의 FD 설정 항목은 다음과 같다.

  • BACKUP

    항목 설명

    SYSIN FD

    BACKUP 명령어와 그와 관련된 옵션들을 기술한다.

    FROM DD를 위한 FD

    SYSIN FD에 기술한 컨트롤 문장 중 FROM DD 문으로 지정한 FD 이름과 같으며 백업 상 데이터 셋들의 볼륨정보가 기술된 FD이다.

    TO DD를 위한 FD

    SYSIN FD에 기술한 컨트롤 문장 중 TO DD 문으로 지정한 FD 이름과 같으며 새로 생성할 백업 데이터 셋의 정보가 기술된 FD이다.

  • RESTORE

    항목 설명

    SYSIN DD

    RESTORE 명령어와 그와 관련된 옵션들을 기술한다.

    FROM DD를 위한 FD

    SYSIN FD에 기술한 컨트롤 문장 중 FROM DD 문으로 지정한 FD 이름과 같으며 복원 대상 백업 데이터 셋이 기술된 FD이다.

    TO DD를 위한 FD

    SYSIN FD에 기술한 컨트롤 문장 중 TO DD 문으로 지정한 FD 이름과 같으며 복원된 데이터 셋을 어느 볼륨에 저장할 것인지 지정한다.

10.2. 명령어 설정

BACKUP과 RESTORE의 명령어는 다음과 같이 설정한다.

BACKUP

하나 이상의 Non-VSAM 데이터 셋이나 볼륨을 하나의 데이터 셋으로 백업 처리하는 명령어이다.

BACKUP 명령어 구문은 다음과 같다.

BACKUP VOLUME | DATASET(dsname[,dsname,...]),
       [FROM(DD(fdname))],
       TO(DD(fdname)),
       [LIST],
       [EXCLUDE(dsname[,dsname,...])],
       [DELETE]
항목 설명

VOLUME

볼륨 백업을 실시한다. DATASET 문과 함께 기술할 수 없다.

DATASET

파일 백업을 실시한다.

데이터셋 이름은 하나 이상 기술할 수 있으며, 와일드 카드 문자를 이용하여 백업 대상 데이터 셋을 필터링할 수도 있다. 와일드 카드 문자에 대한 자세한 내용은 [와일드 카드 문자]의 필터링 예제를 참고한다.

FROM DD

백업 대상 볼륨의 FD 이름을 기술한다.

TO DD

백업 처리의 출력 볼륨의 FD 이름을 기술한다.

LIST

백업 처리가 완료된 데이터 셋의 정보를 SYSPRINT FD 문으로 지정된 파일에 출력한다.

EXCLUDE

백업 처리할 때 백업대상에서 제외할 데이터셋 이름 하나 이상을 기술한다.

DELETE

백업 처리가 완료된 데이터 셋에 대해 삭제 처리한다.

[와일드 카드 문자]

DATASET 문에서 백업 또는 복원 대상 데이터셋 이름에 대하여 와일드 카드 문자를 이용한 필터링이 가능하다.

필터키 설명

* (single asterisk)

기본적으로 1개의 Qualifier와 매치한다. 또한 1개의 Qualifier 내의 0개 이상의 문자와 매치할 수 있다.

** (double asterisk)

0개 이상의 Qualifier와 매치한다.

?

Qualifier 내의 1개의 문자와 매치한다.

% (percent)

0개 이상의 Qualifier와 매치한다. % 이후에 문자를 지정할 수 없다.

Qualifier는 period(.) 사이에 기술된 수식어로 데이터셋 이름을 구성하는 요소를 말한다. 예를 들어 데이터셋 이름이 SYS.LIB인 경우 SYS1과 LIB이라는 2개의 Qualifier를 소유한다고 말한다.

와일드 카드 문자를 이용한 필터링의 예는 다음과 같다.

Filtering Dataset Filtering 대상 Dataset Filtering 비대상 Dataset

SYS1.*.LIST

SYS1.TEST.LIST, SYS1.LIB.LIST

SYS1.TEST.LIST.TEMP, SYS1.LIST

SYS1.LIB.*.*

SYS1.LIB.LIST.TEMP, SYS1.LIB.A.B

SYS1.LIB.LIST, SYS1.LIB.A.B.C

SYS.*IB.LIST

SYS.LIB.LIST, SYS1.IB.LIST

SYS.LIBA.LIST, SYS.LIB.LIST.TEMP

**.LIST

SYS1.LIST, SYS1.LIB.LIST, SYS1.A.B.C.LIST

SYS1.LIST.TEMP, SYS1.LIB.LISTA

USER.LIB.**

USER.LIB.LIST.TEMP, USER.LIB

USER.LIBTEST.LIST, USER.LIBLIST

SYS1.**.LIST

SYS1.A.B.C.LIST, SYS1.LIST

SYS1.LIST.ERR, SYS1.TEST.LIST.ERR

**.*LIST

SYS1.TEST.LIST,

SYS1.TEST.A.B.OKLIST

SYS1.LIST.ERR,

SYS1.TEST.OKLIST.TEMP

*.*.L*B

SYS1.TEST.LIB,

USER.LIB.LISTB, A.B.LB

SYS1.TEST.LIBTEMP,

SYS1.USER.LIB.TEMP

USER?.*

USER1.LIST, USERA.LIST

USEROK.LIST,

USER1.OK.LIST, USER.LIST

*??*

AA, BB, TEST, USER

A, B, TEST.USER

A.A.%

A.A.B, A.A.LIST, A.A.USER.LIST

A.B, A.USER

A.%

A.A.B, A.A.LIST, A.A.USER.LIST, A.B

B.USER, TEST.USER

RESTORE

하나의 파일로 백업 처리된 데이터 셋을 원래의 Non-VSAM 형식의 데이터 셋으로 복원한다.

RESTORE 명령어 구문은 다음과 같다.

RESTORE DATASET(dsname[,dsname,...]),
        FROM(DD(ddname)),
        [TO(DD(ddname))],
        [RENAME((OLD DATASET NAME,NEW DATASET NAME),…)],
        [LIST],
        [EXCLUDE(dsname[,dsname,...])]
항목 설명

DATASET

백업 처리된 데이터 셋에서 복원할 데이터셋 이름 하나 이상을 기술한다.

와일드 카드 문자를 이용하여 복원 대상 데이터 셋을 필터링할 수 있다. 와일드 카드 문자에 대한 자세한 내용은 [와일드 카드 문자]의 필터링 예제를 참고한다.

FROM DD

복원 처리할 볼륨의 FD 이름을 기술한다.

TO DD

복원 처리할 때 저장될 볼륨의 FD 이름을 기술한다.

RENAME

DATASET 문에서 지정한 데이터셋 이름을 새로운 데이터셋 이름으로 변경하여 복원 처리한다.

LIST

복원 처리가 완료된 데이터 셋의 정보를 SYSPRINT FD 문으로 지정된 파일에 출력한다.

EXCLUDE

복원 처리할 때 복원대상에서 제외할 데이터셋 이름 하나 이상을 기술한다.

10.3. 사용예제

다음은 여러 개의 Non-VSAM 데이터 셋을 BACKUP 기능을 이용하여 테입 볼륨에 하나의 데이터 셋으로 묶어 백업 처리하는 예이다.

KBKARCS.TEST01, KBKARCS.TEST02, KBKARCS.TEST03 데이터 셋을 TO DD에서 기술한 테입 볼륨 100004의 데이터셋 KBKARCS.UACKUP.DS로 묶어 백업 처리한다.

\          JOB  KBK01
\STEP01    EX   KBKARCS
\          FD   SYSUT1=DA,VOL=100000,FILE=VOLUME
\          FD   SYSUT2=TAPEA,VOL=100004,FILE=KBKARCS.UACKUP.DS,FCYL=10
\          FD   SYSPRINT=DA,VOL=WORK,TRK=(1,1,RLSE),SOUT=A
\          FD   SYSIN=*
 BACKUP DATASET(KBKARCS.TEST01,KBKARCS.TEST02,KBKARCS.TEST03),
        FROM(DD(SYSUT1)),TO(DD(SYSUT2))
\          JEND

다음은 FROM DD 문에서 지정한 볼륨에 속해 있는 모든 Non-VSAM 데이터 셋을 백업하는 예이다.

FROM DD에서 지정한 볼륨 100000의 모든 데이터 셋을 TO DD에서 기술한 볼륨 100001의 데이터셋 SVWORK02로 묶어 백업 처리하고 백업에 성공한 데이터 셋들의 정보를 출력한다.

\          JOB  KBK02
\STEP01    EX   KBKARCS
\          FD   SYSUT1=DA,VOL=100000,FILE=VOLUME
\          FD   SYSUT2=DA,VOL=100001,FILE=SVWORK02,FCYL=10
\          FD   SYSPRINT=DA,VOL=WORK,TRK=(1,1,RLSE),SOUT=A
\          FD   SYSIN=*
 BACKUP VOLUME,FROM(DD(SYSUT1)),TO(DD(SYSUT2)),LIST
\          JEND

다음은 FROM DD 문에서 지정한 백업 데이터 셋에서 와일드 카드의 조건에 맞는 데이터 셋을 찾아 복원 처리하는 예이다.

FROM DD 문에서 지정한 볼륨 100001의 백업 데이터셋 KBKARCS.UACKUP.DS에서 첫 번째 Qualifier가 'KBKARCS’인 데이터 셋을 찾아 TO DD에서 지정한 볼륨 100000으로 복원한다.

\          JOB  KBK03
\STEP01    EX   KBKARCS
\          FD   SYSUT1=DA,VOL=100001,FILE=KBKARCS.UACKUP.DS
\          FD   SYSUT2=DA,VOL=100000,FILE=VOLUME,FCYL=10
\          FD   SYSPRINT=DA,VOL=WORK,TRK=(1,1,RLSE),SOUT=A
\          FD   SYSIN=*
 RESTORE DATASET(KBKARCS.*),FROM(DD(SYSUT1)),TO(DD(SYSUT2))
\          JEND

10.4. 유의사항

OpenFrame에서 KBKARCS 유틸리티 프로그램은 Non-VSAM 형식의 데이터 셋만 처리가 가능하며 VSAM 형식의 데이터 셋은 지원하지 않는다.

KBKARCS 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.

  • 정상적으로 실행한 경우

    유틸리티의 정상 종료 코드 10을 반환한다.

  • 에러가 발생한 경우

    해당 에러 메시지를 SYSPRINT DD에 출력하고, 각 에러에 해당하는 코드를 반환한다.

    KBKARCS 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.

    코드 설명

    20

    프로그램 수행 중 특정 데이터 셋에서 에러가 발생하였으나 다른 데이터 셋에 대한 처리는 정상적으로 수행한 경우이다.

    50

    Unrecoverable 유형의 에러로 에러가 발생하여 정상적으로 수행하지 않은 경우이다.

11. KQCAMS

KQCAMS는 OpenFrame의 VSAM과 Non-VSAM 데이터셋 및 카탈로그 정보를 관리하기 위한 유틸리티 프로그램이다.

SYSIN FD에 입력된 각 명령은 각각의 명령이 의미하는 작업을 수행하기 위한 명령어와 이를 위한 각종 옵션 또는 파라미터들로 구성된다. KQCAMS는 실행할 명령들을 SYSIN FD에서 읽어 들여 동작한다.

OpenFrame의 KQCAMS 프로그램은 기존 Mainframe의 KQCAMS 명령을 그대로 사용하여 OpenFrame의 VSAM 데이터 셋과 Non-VSAM 데이터셋 그리고 카탈로그를 대상으로 동작한다. 사용자 입장에서 Mainframe의 KQCAMS와 동일한 작업을 수행한다.

KQCAMS의 명령어
  • 기능 명령어

    실제로 사용자가 수행하려는 특정 작업을 나타내는 명령어이다.

    명령어 설명

    ALTER

    이미 정의되어 있는 데이터셋 또는 카탈로그 자체의 속성을 변경한다.

    DEFINE

    다음과 같은 데이터셋 오브젝트(또는 카탈로그 엔트리)를 정의하기 위해 사용한다.

    DELETE/VDELETE

    VSAM과 Non-VSAM 데이터셋 및 카탈로그를 제거한다.

    EXPORT

    카탈로그와 VSAM 데이터 셋을 이식 가능한 데이터 셋으로 반출하거나 백업 데이터 셋을 생성한다.

    IMPORT

    EXPORT 명령으로 생성된 이식 가능한 카탈로그와 VSAM 데이터 셋을 반입하거나 백업된 상태의 데이터 셋을 원래의 상태로 복원한다.

    LISTCAT/VLISTCAT

    카탈로그에 등록된 VSAM과 Non-VSAM 데이터 셋에 대한 정보를 보여준다.

    PRINT

    VSAM과 Non-VSAM 데이터 셋에 저장되어 있는 레코드를 출력하여 보여준다.

    REPRO

    VSAM과 Non-VSAM 데이터 셋의 내용을 복사한다.

    VERIFY

    VSAM 데이터 셋의 비정상 종료(close)로 인해 잘못된 데이터셋 정보로 카탈로그되어 있는지 확인하고 올바르게 수정한다. 또한 레코드 수 등의 정보도 정확하게 반영되어 있는지 확인한다.

    VSAM 데이터 셋을 종료할 때 해당 데이터 셋의 마지막 위치와 레코드 수 등의 통계정보가 카탈로그에 저장된다. 정상적으로 종료되지 않은 경우 카탈로그 정보와 실제 데이터 셋의 상태 정보가 일치하지 않을 수 있으므로, VERIFY 명령으로 이러한 불일치를 올바르게 변경할 수 있다.

  • 보조 명령어

    일련의 KQCAMS 명령어들의 실행을 제어하기 위한 보조 성격의 명령어이다.

    명령어 설명

    IF-THEN-ELSE

    실행된 명령의 컨디션 코드 값(LASTCC 또는 MAXCC)에 따라 다음에 실행할 명령을 분기하기 위해 사용한다.

    Null

    아무 동작도 발생시키지 않는 문법적 용도의 명령이다.

    IF-THEN-ELSE 명령의 THEN이나 ELSE 다음에 특별한 작업을 수행하지 않는다는 것을 명시적으로 나타내기 위해서 사용한다.

    SET

    MAXCC나 LASTCC의 값을 특정한 값으로 강제 설정하기 위해 사용한다.

    CANCEL

    프로그램 실행 중 CANCEL 명령어를 만나면 KQCAMS의 실행이 중지되고, CANCEL 명령 이후의 나머지 명령들은 처리되지 않는다.

    PARM

    KQCAMS가 실행되는 동안에 적용되는 옵션 및 파라미터 값을 지정한다.

    현재는 지원하지 않는다.

  • 비기능 명령어

    에러가 발생하지 않도록 처리하지만 실제 기능하지 않는 명령어이다.

    명령어 설명

    BLDINDEX

    특정 데이터 셋에 대한 보조 인덱스를 생성한다.

    EXAMINE

    특정 클러스터에 대한 인덱스 및 데이터 컴포넌트의 무결성을 검사한다.

코딩 규약

KQCAMS을 이용하여 코딩할 때 공통적으로 적용되는 규약은 다음과 같다.

  • 하이픈 (-)

    하나의 명령을 여러 라인에 걸쳐서 작성할 경우, 라인의 맨 뒤에 하이픈(-)을 입력하고 그 다음 라인에 계속 이어서 명령의 나머지 부분을 코딩한다. 하이픈(-)은 키워드나 파라미터 값의 중간에 코딩할 수 없으며 일반적으로 키워드나 파라미터 값의 경계가 되는 부분에 라인이 계속 이어진다는 의미로 사용한다.

    하이픈(-)을 사용하여 코딩하는 예는 다음과 같다.

    LISTCAT ENT( -
      TEST.CLUS1 -
      TEST.KSDS1 -
      TEST.RRDS1 -
      TEST.SDS1)

    여러 라인에 걸쳐서 작성된 명령어의 맨 마지막 라인에는 하이픈(-)을 코딩하지 않도록 주의한다.

  • 주석

    주석은 KQCAMS 명령 사이에 입력할 수 있다. 단, 키워드나 파라미터 값의 중간에는 주석이 올 수 없다.

    주석에 특별한 기능은 없지만 하나의 명령으로 간주되기 때문에 명령 중간에 주석을 추가하는 경우에는 해당 라인의 맨 뒤에 하이픈(-)을 입력해야 한다. 주석은 공백이나 콤마(,)와 같이 KQCAMS 문법에서 필드를 구분하는 역할도 하므로 ‘/*’와 ‘*/’ 사이에 입력한다.

    다음은 주석을 기술한 올바른 예이다.

    /* This is KQCAMS Comment */
    /* This is multi line Comment comment continued from above line */
    LISTCAT ENT( /* Comment 1 */ -
    TEST.KSDS1 /* Comment 3 */ -
    TEST.SDS1 /* Comment 4 */ ) /* Comment 5 */

    IF-THEN-ELSE 문의 중간에 주석을 사용하는 경우에는 주석에 의해서 IF-THEN-ELSE 구조가 의도하지 않은 위치에서 끝나지 않도록 주의해야 한다.

11.1. FD 설정

KQCAMS는 JCL을 통해 Batch 작업으로 실행하는 방식과 UNIX 시스템의 명령어 라인에서 직접 실행하는 인터랙티브 방식을 모두 지원한다.

JCL을 통한 JOB 실행(using JCL as JOB)

JCL을 통해서 JOB의 한 STEP으로서 KQCAMS를 실행하는 경우 KQCAMS는 다음과 같은 FD 문을 사용한다.

항목 설명

SYSIN FD

KQCAMS가 실행할 명령을 기술한다.

데이터 셋의 레코드 길이는 72 칼럼을 넘을 수 없으며, 명령이 길어질 경우 하이픈(-)을 사용한다.

SYSPRINT FD 또는

SYSOUT FD

KQCAMS 실행 결과와 실행 중 발생한 주의를 필요로 하는 정보성 메시지, 경고 메시지 그리고 에러 메시지 등을 저장할 데이터 셋을 기술한다.

SYSPRINT FD를 기술하지 않거나 지정 데이터 셋의 할당, 열기에 실패한 경우 KQCAMS는 아무런 명령도 수행하지 않고 종료되며 컨디션 코드 50을 반환한다.

추가적인 FD

KQCAMS 명령 중에서 일부는 JCL에 기술된 FD를 통해 명령의 대상이 되는 fdname이나 entryname을 간접적으로 지정할 수 있다. 이 경우 KQCAMS는 데이터 셋을 동적으로 할당하지 않고 JOB의 실행을 제어하는 tjclrun에 의해 JOB 레벨에서 미리 할당된 데이터 셋을 승계 받아 사용한다.

일반적으로 명령어의 대상이 되는 데이터 셋을 지정하는 파라미터는 JCL에 기술된 fdname을 이용하여 FILE(fdname) 형태의 파라미터 이름을 갖는다.

KQCAMS에서 동적 할당을 이용하여 데이터 셋을 지정하는 파라미터는 DATASET(entryname) 형태의 파라미터 이름을 갖는다.

다음은 앞에서 설명한 추가적인 FD에 대한 예로, REPRO BLDINDEX PRINT의 파라미터를 이용하여 JCL에서 할당된 데이터 셋을 승계 받아서 동작하도록 한다.

INFILE(fdname), OUTFILE(fdname)

다음은 REPRO BLDINDEX PRINT의 파라미터로, KQCAMS에서 동적으로 데이터 셋을 할당하여 동작하는 예이다.

INDATASET(entryname), OUTDATASET(entryname)

JCL을 통해서 JOB의 한 STEP으로 KQCAMS를 실행시키기 위해서는 KQCAMS를 호출하는 JOB STEP에 앞에서 설명한 FD를 기술하고 EXEC PGM에 KQCAMS를 지정한 후 해당 JCL을 전송(submit)한다.

\ JOB OBM
\ EX KQCAMS
\ FD INFD=DA,FILE=VSAM.KSDS1
\ FD OUTFD=DA,FILE=VSAM.KSDS2
\ FD SYSPRINT=DA,SOUT=A
\ FD SYSIN=*
    REPRO  INFILE(INFD) -
           OUTFILE(OUTFD) -
           SKIP(50000) COUNT(10000)
\/
\ JEND
명령어 라인에서 실행(using from Command line)

UNIX 시스템의 명령어 라인에서 KQCAMS를 직접 실행한다. 이 경우 SYSIN FD 및 SYSPRINT FD 대신에 표준 입출력 스트림 (stdin/stdout/stderr)을 사용하여 작동한다. 즉, stdin으로부터 KQCAMS 명령어를 읽어 들여 명령어 단위로 실행하고, stdout/stderr로는 작업의 결과 및 에러 메시지를 출력하는 인터랙티브한 인터프리터 방식이다.

UNIX 시스템의 명령어 라인에 다음과 같은 명령을 실행하면 KQCAMS는 DEFINE.TEST.CLUS1.CMD라는 VSAM 데이터 셋을 제거하고 다시 정의하는 동작을 한다.

$ KQCAMS < DEFINE.TEST.CLUS1.CMD

TEST.CLUS1.CMD는 일반적인 UNIX 텍스트 파일로 아래와 같은 내용을 담고 있다.

DEFINE.TEST.CLUS1.CMD 파일은 KQCAMS UNIX 명령어 라인에서 stdin 리다이렉션을 보여준다.

DELETE  TEST.CLUS1 CLUSTER
DEFINE  CLUSTER                          -
        (NAME(TEST.CLUS1)                -
        VOLUMES(100000)                  -
        INDEXED                          -
        KEYS(07 0)                       -
        CYL (70 10)                      -
        RECORDSIZE(200 200)              -
        SHR(2 3))                        -
        DATA  (NAME(TEST.CLUS1.DATA)     -
        CONTROLINTERVALSIZE(4096)  )     -
        INDEX (NAME(TEST.CLUS1.INDEX)    -
        CONTROLINTERVALSIZE(4096)  )
제약 사항 (Limitation)

FD (fdname)를 통해 할당된 데이터 셋을 승계하여 사용하기 위해서는 OpenFrame Batch 환경, 특히 tjclrun을 필요로 한다. 따라서 JCL을 통해 JOB STEP으로 KQCAMS를 실행하는 경우에 가능했던 fdname을 사용한 데이터 셋의 지정이 UNIX 시스템의 명령어 라인에서는 불가능하다.

UNIX 명령어를 실행하는 경우 KQCAMS 명령의 대상이 되는 데이터 셋을 지정하기 위해서는 항상 DATASET(entryname) 형태로 지정하여 사용해야 한다.

11.2. 기능 명령어

본 절에서는 KQCAMS 기능 명령어의 사용법에 대해서 설명한다.

ALTER

DEFINE 문으로 카탈로그에 이미 등록되어 있는 데이터 셋과 카탈로그 엔트리의 정보 일부를 변경할 수 있다.

ALTER 명령어 구문은 다음과 같다.

ALTER entryname
      [EMPTY|NOEMPTY]
      [FILE(fdname)]
      [LIMIT(limit)]
      [NULLIFY([OWNER][RETENTION])]
      [OWNER(ownerid)]
      [ROLLIN]
      [SCRATCH|NOSCRATCH]
      [SHAREOPTIONS(crossregion[ crosssystem])]
      [STORAGECLASS(class)]
      [STRNO(number)]
      [TO(date)|FOR(days)]
      [CATALOG(catname)]
항목 설명

entryname

속성을 변경할 기존 데이터 셋이나 카탈로그 엔트리의 entryname을 지정한다.

ROLLIN

GDG 베이스와의 연관(association)이 아직 이루어지지 않은 상태(deferred rolled-in state)이거나, 끊어진 상태(rolled off state)에 있는 GDS에 대해서 GDG 베이스와 연관된 상태(rolled-in state)로 변경할 때 지정한다.

CATALOG

entryname으로 지정된 카탈로그 엔트리를 찾을 때 사용할 카탈로그를 명시적으로 지정한다. 지정하지 않는 경우에는 카탈로그 검색 순서에 따라서 결정된다.

카탈로그 엔트리 타입과 카탈로그 엔트리에 해당하는 사용자 데이터 셋에 데이터가 적재되어 있는지 여부에 따라서 변경 가능한 속성과 변경 불가능한 속성이 있다.

다음은 OpenFrame KQCAMS의 ALTER 명령이 지원하는 각 카탈로그 엔트리 타입에 따른 변경 가능한 속성을 요약한 표이다. ‘O’로 표시되어 있는 곳이 변경 가능한 속성이다.

엔트리 타입 변경가능 속성

AIX

AIX DATA

AIX INDEX

CLUSTER

CLUSTER DATA

CLUSTER INDEX

PATH

UCAT DATA

UCAT INDEX

NON-VSAM

GDG

NEWNAME

-

-

-

-

-

-

O

-

-

O

-

EMPTY

-

-

-

-

-

-

-

-

-

-

O

NOEMPTY

-

-

-

-

-

-

-

-

-

-

O

LIMIT

-

-

-

-

-

-

-

-

-

-

O

NULLIFY

-

-

-

-

-

-

O

-

-

O

O

OWNER

-

-

-

-

-

-

O

-

-

O

O

ROLLIN

-

-

-

-

-

-

-

-

-

O

-

RETENTION

-

-

-

-

-

-

O

-

-

O

O

SCRATCH

-

-

-

-

-

-

-

-

-

-

O

NOSCRATCH

-

-

-

-

-

-

-

-

-

-

O

TO

-

-

-

-

-

-

O

-

-

O

O

FOR

-

-

-

-

-

-

O

-

-

O

O

변경할 카탈로그 엔트리에 새로운 속성값을 지정하기 위해서는 각 파라미터 외에도 변경할 대상이 되는 카탈로그 엔트리를 지정하기 위한 파라미터가 필요하다.

다음은 TESTCAT이라는 카탈로그에 등록된 TEST.GDG1란 이름의 GDG의 최대 세대 수를 255로, 만료일자를 2006년의 300번째 날짜로 속성을 변경하는 예이다.

\ JOB OBM
\ EX KQCAMS
\ FD SYSPRINT=DA,SOUT=A
\ FD SYSIN=*
    ALTER  TEST.GDG1 -
            LIMIT(255) -
            TO(2006300) -
            CATALOG(TESTCAT)
\/
\ JEND
DEFINE

DEFINE 명령에서 공통적으로 사용 가능한 파라미터는 다음과 같다.

DEFINE 명령별로 지정 가능한 실제 파라미터의 종류는 각각의 DEFINE 명령 절에서 설명한다. 본 절에서는 공통적으로 사용하는 파라미터에 관해 설명한다.

DEFINE 명령어 구문은 다음과 같다.

DEFINE Commands  NAME(entryname) {CYLINDERS(primary[ secondary])|
                                 KILOBYTES(primary[ secondary])|
                                 MEGABYTES(primary[ secondary])|
                                 RECORDS(primary[ secondary])|
                                 TRACKS(primary[ secondary])}
                                 VOLUMES(volser[ volser...])
                                 [CONTROLINTERVALSIZE(size)]
                                 [DATACLASS(class)]
                                 [MANAGEMENTCLASS(class)]
                                 [OWNER(ownerid)]
                                 [RECATALOG|NORECATALOG]
                                 [RECORDSIZE(average maximum)]
                                 [STORAGECLASS(class)]
                                 [TO(date)|FOR(days)])
                                 [DATA (...)]
                                 [INDEX (...)]
                                 [CATALOG(catname)]
                                 [NOOCCURSBULK]
항목 설명

NAME

DEFINE 명령으로 생성 또는 정의하려는 카탈로그 객체의 이름을 지정한다.

CYLINDERS|

KILOBYTES|

MEGABYTES|

RECORDS|

TRACKS

VSAM 클러스터(CLUSTER, ALTERNATEINDEX, USERCATALOG)를 생성할 때 해당 데이터 셋에 할당할 저장소의 용량을 지정한다.

  • CYLINDERS, TRACKS는 저장 매체의 종류에 종속적인 단위로 할당을 할 때 사용된다.

  • 나머지는 저장 매체의 종류에 비종속적인 단위로 할당할 때 사용된다.

기본(primary) 할당과 추가(secondary) 할당으로 지정한다. 기본 할당은 데이터 셋을 생성할 때 처음 할당되는 것을 의미하고 추가 할당은 이후 데이터 셋에 데이터가 계속 저장되어 저장소를 추가적으로 할당하는 경우를 의미한다.

VOLUMES

데이터 셋을 생성하는 경우 데이터 셋을 저장할 볼륨의 볼륨 일련번호를 지정한다.

CONTROLINTERVALSIZE

VSAM 클러스터(CLUSTER, ALTERNATEINDEX, USERCATALOG)의 컨트롤 인터벌 크기를 지정한다.

컨트롤 인터벌은 Non-VSAM의 BLKSIZE에 해당하는 개념으로 VSAM은 실제로 디스크에 I/O하는 경우 컨트롤 인터벌 단위로 동작한다.

CONTROLINTERVALSIZE는 512Byte에서 8KByte 사이에서 512Byte의 배수 단위로 지정해야 하고, 8KByte에서 32KByte 사이의 값인 경우는 2KByte의 배수 단위로 지정해야 한다.

그렇지 않은 경우 내부적으로 해당 범위에 따라서 지정된 값보다 작지 않은 가장 가까운 512Byte나 2KByte의 배수 단위의 값으로 결정된다.

CONTROLINTERVALSIZE를 지정하지 않으면 VSAM이 임의의 적당한 값으로 결정한다.

DATACLASS

데이터 클래스 값(1-8글자)을 지정한다.

데이터 클래스는 SMS(Storage Management Subsystem)에서 정의하며 새로운 데이터 셋을 생성할 때 사용할 여러 가지 속성들을 가지고 있다.

데이터 클래스를 지정하는 경우 데이터 클래스에 정의된 DEFINE 속성들은 지정하지 않아도 된다. 지정한 데이터 클래스에 정의된 속성과 DEFINE 명령에 명시적으로 지정된 속성이 다른 경우는 DEFINE 명령에 지정된 속성이 우선한다.

MANAGEMENTCLASS

관리 클래스 값(1-8글자)을 지정한다.

관리 클래스는 SMS에서 정의하며 생성되는 데이터 셋의 관리작업에 영향을 주는 TO나 FOR와 같은 여러가지 속성을 가지고 있다.

DEFINE 명령에 TO나 FOR가 명시적으로 지정되어 있고 관리 클래스에서도 동일한 속성이 있는 경우는 데이터 클래스와는 달리 관리 클래스에 정의된 값이 우선한다.

OWNER

데이터 셋의 소유자를 지정한다.

RECATALOG|

NORECATALOG

클러스터나 보조 인덱스의 데이터 및 인덱스 컴포넌트 그리고 Non-VSAM 데이터 셋에 해당하는 카탈로그 엔트리를 기존의 VVDS에 저장되어 있는 정보를 기반으로 다시 생성한다.

클러스터나 보조 인덱스의 경우 VVDS에 존재하는 VVR(VSAM VOLUME RECORD)의 내용이 카탈로그 엔트리 재생성에 사용된다. 이때 일부 VVR에 포함되지 않는 정보는 DEFINE 명령을 통해 직접 기술해 주어야 한다.

이러한 파라미터로는 INDEXED, NONINDEXED, NUMBERED 등의 VSAM 레코드 구성을 지정하는 파라미터와 해당 데이터 셋이 원래 생성되었던 VOLUMES 파라미터, VRDS의 경우 RECORDSIZE 파라미터, ALTERNATEINDEX의 경우 NAME, RELATE, VOLUME 파라미터가 있다.

생성하는 카탈로그 엔트리가 Non-VSAM 데이터 셋인 경우는 VOLUMES 및 DEVICETYPES 파라미터를 DEFINE 명령을 통해 직접 지정해야 한다. PATH의 경우에는 VVDS에 저장되는 정보가 없으므로 DEFINE 명령에 NAME과 PATHENTRY 파라미터만 지정하면 RECATALOG가 가능하다.

RECORDSIZE

CLUSTER, ALTERNATEINDEX, USERCATALOG를 생성할 때 해당 데이터 셋에 저장될 레코드의 크기를 average와 maximum으로 지정한다. 두 값을 동일하게 지정하면 고정 길이 레코드 (Fixed Length Record)를 의미한다.

  • USERCATALOG에 지정된 이 파라미터는 무시된다. USERCATALOG는 VSAM이 처리하는 데이터 셋이기 때문에 VSAM은 USERCATALOG의 RECORDSIZE 파라미터로 항상 (4096 32600)을 사용한다.

  • CLUSTER에 대해서는 이 파라미터가 생략된 경우 SPANNED 파라미터가 지정되어 있으면 (4096 32600)이 기본값으로 사용되고 그렇지 않은 경우 (4089 4089)가 기본값으로 사용된다.

  • ALTERNATEINDEX에 대해서 이 파라미터가 생략된 경우는 항상 (4089 32600)이 기본값으로 사용된다. ALTERNATEINDEX는 일반적으로 많은 수의 NONUNIQUE KEY가 존재하는 점을 고려해서 VSAM 내부적으로 SPANNED가 지정된 KSDS처럼 처리된다. 즉, ALTERNATEINDEX에는 SPANNED 파라미터는 무시된다.

STORAGECLASS

스토리지 클래스 값(1-8)을 지정한다.

스토리지 클래스는 SMS에서 정의하며 생성되는 데이터 셋에 할당되는 저장소 용량과 관련된 속성을 가지고 있다. 스토리지 클래스를 지정하는 경우 필수 파라미터인 CYLINDERS와 같은 스토리지 할당 크기를 지정하는 파라미터를 지정하지 않아도 된다.

DEFINE 명령에 직접 스토리지 할당량이 지정되고 스토리지 클래스에 정의된 값과 다른 경우 스토리지 클래스에 정의된 값이 우선한다.

TO|FOR

데이터셋 및 카탈로그 엔트리를 생성할 때 해당 객체의 만료일자를 지정한다.

  • TO : 만료일자를 지정한다.

  • FOR : 유효일수를 지정한다. 생성일로부터 유효일수를 더한 날짜가 만료일자가 된다.

DATA, INDEX

CLUSTER, ALTERNATEINDEX, USERCATALOG와 같이 데이터 컴포넌트와 인덱스 컴포넌트를 가질 수 있는 VSAM 클러스터를 생성하는 경우 데이터 컴포넌트와 인덱스 컴포넌트 각각에 대해서 별도로 위에서 설명한 파라미터(일부 해당하는 파라미터)를 따로 지정할 수 있다.

예를 들어 저장소 할당 크기를 나타내는 CYLINDERS 파라미터는 DEFINE CLUSTER할 때 CLUSTER의 서브 파라미터로서 지정해도 되고 DATA나 INDEX 컴포넌트의 서브 파라미터로서 지정해도 된다. 이렇게 별도로 지정한 경우 컴포넌트 별로 따로 적용하는 것이 가능하다면 컴포넌트 별로 다른 값이 적용된다.

CATALOG

DEFINE 명령으로 정의하는 카탈로그 엔트리가 등록될 카탈로그 이름을 지정한다. 생략하면 해당 JOB의 STEPCAT이나 JOBCAT에 지정된 카탈로그 또는 카탈로그 엔트리 이름의 일부를 ALIAS로 사용하는 USERCATALOG가 있는 경우 해당 USERCATALOG에 등록된다. 마지막까지 등록할 카탈로그가 결정되지 않으면 마스터 카탈로그에 등록한다.

자세한 사항은 OpenFrame Base "데이터셋 안내서"의 "통합 카탈로그"에서 카탈로그 검색 순서를 참고한다.

NOOCCURSBULK

DEFINE 명령으로 정의하는 VSAM 데이터셋의 OCCURS 필드를 각각의 컬럼으로 지정한다. 생략하면 OCCURS필드를 하나의 컬럼으로 지정한다.

DEFINE ALIAS

Non-VSAM 데이터 셋이나 사용자 카탈로그의 별칭으로 사용할 ALIAS를 카탈로그에 생성한다.

ALIAS에 해당하는 카탈로그 엔트리 역시 원래의 데이터셋 이름과 별칭만을 포함하고 있다. 별도의 사용자 데이터를 저장하기 위한 데이터 셋은 존재하지 않는다.

사용자 카탈로그를 제외한 VSAM 데이터 셋에 대한 ALIAS는 생성할 수 없다.

DEFINE ALIAS 명령어 구문은 다음과 같다.

DEFINE ALIAS (NAME(aliasname)
       RELATE(entryname)
       SYMBOLICRELATE(entryname))
       [CATALOG(catname)]
항목 설명

NAME

생성할 ALIAS 이름을 지정한다.

RELATE

ALIAS가 가리키는 실제 엔트리의 entryname을 지정한다.

CATALOG

생성할 ALIAS를 등록할 카탈로그 지정한다.

다음은 TEST.NVSAM1의 ALIAS로 TEST.ALIAS1을 생성하고 TESTCAT 카탈로그에 등록하는 예이다.

\ JOB OBM
\ EX KQCAMS
\ FD SYSPRINT=DA,SOUT=A
\ FD SYSIN=*
DEFINE ALIAS(NAME(TEST.ALIAS1) -
       RELATE(TEST.NVSAM1)) -
       CATALOG(TESTCAT)
\/
\ JEND
DEFINE ALTERNATEINDEX

DEFINE ALTERNATEINDEX (이하 AIX) 명령을 이용하여 특정 데이터셋(BASE CLUSTER)에 대한 별도의 인덱스 방법을 제공하는 AIX 데이터 셋을 정의한다.

VSAM은 베이스 클러스터에 레코드가 추가되거나 삭제 또는 변경되는 경우, 이와 연관된 AIX들에 대해서 자동적으로 변경을 수행하여 AIX가 지속적으로 올바르게 베이스 클러스터에 대한 별도의 인덱스를 수행할 수 있도록 한다. 내부구조상 AIX 데이터 셋도 하나의 KSDS 클러스터 구조를 갖는 데이터 셋이므로 DEFINE AIX에 사용되는 대부분의 파라미터는 DEFINE CLUSTER의 파라미터와 동일하다.

DEFINE AIX 명령어 구문과 지정할 수 있는 주요 파라미터는 다음과 같다.

DEFINE AIX (NAME(entryname)
       RELATE(entryname) {CYLINDERS(primary[secondary])|
                         KILOBYTES(primary[secondary])|
                         MEGABYTES(primary[secondary])|
                         RECORDS(primary[secondary])|
                         TRACKS(primary[secondary])}
       VOLUMES(volser[volser...])
       [CONTROLINTERVALSIZE(size)]
       [DATACLASS(class)]
       [FILE(fdname)]
       [KEYS(length offset|64 0)]
       [OWNER(ownerid)]
       [RECATALOG|NORECATALOG]
       [RECORDSIZE(average maximum | 4086 32600)]
       [TO(date)|FOR(days)]
       [UNIQUEKEY|NONUNIQUEKEY]
       [UPGRADE|NOUPGRADE])
       [DATA ({CYLINDERS(primary[secondary])|
              KILOBYTES(primary[secondary])|
              MEGABYTES(primary[secondary])|
              RECORDS(primary[secondary])|
              TRACKS(primary[secondary])}
              [VOLUMES(volser[volser...])]
       [CONTROLINTERVALSIZE(size)]
       [FILE(fdname)]
       [KEYS(length offset)]
       [NAME(entryname)]
       [OWNER(ownerid)]
       [RECORDSIZE(average maximum)]
       [UNIQUEKEY|NONUNIQUEKEY])]
       [INDEX ({CYLINDERS(primary[secondary])|
                KILOBYTES(primary[secondary])|
                MEGABYTES(primary[secondary])|
                RECORDS(primary[secondary])|
                TRACKS(primary[secondary])}
       [VOLUMES(volser[volser...])]
       [CONTROLINTERVALSIZE(size)]
       [FILE(fdname)]
       [NAME(entryname)]
       [OWNER(ownerid)])]
       [CATALOG(catname)]
항목 설명

RELATE

현재 정의하는 AIX와 연관된 베이스 클러스터 데이터셋 이름을 지정한다. 베이스 클러스터로 사용할 데이터 셋은 VSAM 데이터셋 중에서 KSDS와 ESDS 구조의 데이터 셋만 가능하다.

AIX를 정의하기 위해서는 미리 베이스 클러스터로 사용할 데이터 셋을 DEFINE CLUSTER 명령을 이용해서 만들어야 한다.

RECORDSIZE

AIX 데이터셋 클러스터 자체의 레코드 크기를 지정한다.

SPANNED 파라미터를 지정한 경우 최대 32760의 값까지 지정할 수 있다.

UNIQUEKEY|

NONUNIQUEKEY

정의하려는 AIX의 키 값이 데이터셋 전체에서 유일한지 여부를 지정한다.

베이스 클러스터인 KSDS 데이터 셋은 항상 UNIQUEKEY만 지정할 수 있지만 AIX를 만드는 경우는 NONUNIQUEKEY도 지정할 수 있다.

NONUNIQUEKEY가 지정되면 하나의 보조키와 여러 개의 기본키로 이루어진 레코드가 AIX 데이터셋 클러스터 자체의 레코드로 저장된다.

UPGRADE

정의하려는 AIX 클러스터의 베이스 클러스터가 변경된 경우 AIX 클러스터의 내용을 동시에 변경하여 항상 AIX 클러스터의 내용이 베이스 클러스터에 대해 올바른 보조 인덱스를 유지한다.

다음은 VSAM.KSDS1에 대해 보조 인덱스 VSAM.AIX1을 생성하는 예이다.

보조 인덱스 VSAM.AIX1 레코드의 오프셋 44에서 시작되는 7Byte 부분을 보조키로 한다. 보조키는 유일하지 않으며 베이스 클러스터가 변경될 때 자동적으로 업그레이드된다.

\ JOB OBM
\ EX KQCAMS
\ FD SYSPRINT=DA,SOUT=A
\ FD SYSIN=*
DEFINE AIX    (NAME(VSAM.AIX1) -
                RELATE(VSAM.KSDS1) -
                UPGRADE -
                NUNQK -
                KEYS(7 44) -
                VOL(VOL100) -
                SHR(2 3))
\/
\ JEND
DEFINE CLUSTER

DEFINE CLUSTER 명령을 사용해서 VSAM 데이터 셋을 정의하며, 필수적인 속성과 부가적인 속성들을 함께 지정할 수 있다.

DEFINE CLUSTER 명령어 구문과 지정할 수 있는 주요 파라미터는 다음과 같다.

DEFINE CLUSTER (NAME(entryname)
               {CYLINDERS(primary[secondary])|
                KILOBYTES(primary[secondary])|
                MEGABYTES(primary[secondary])|
                RECORDS(primary[secondary])|
                TRACKS(primary[secondary])}
       VOLUMES(vvolser[volser...])
       [CONTROLINTERVALSIZE(size)]
       [DATACLASS(class)]
       [FILE(fdname)]
       [INDEXED|LINEAR|NONINDEXED|NUMBERED]
       [KEYS(length offset| 64 0]
       [MANAGEMENTCLASS(class)]
       [OWNER(ownerid)]
       [RECATALOG|NORECATALOG]
       [RECORDSIZE(average maximum)]
       [SPANNED|NONSPANNED]
       [STORAGECLASS(class)]
       [TO(date)|FOR(days)])
       [DATA({CYLINDERS(primary[secondary])|
              KILOBYTES(primary[secondary])|
              MEGABYTES(primary[secondary])|
              RECORDS(primary[secondary])|
              TRACKS(primary[secondary])}
       [VOLUMES(vvolser[volser...])]
       [CONTROLINTERVALSIZE(size)]
       [FILE(fdname)]
       [KEYS(length offset)]
       [NAME(entryname)]
       [OWNER(ownerid)]
       [RECORDSIZE(average maximum)]
       [SPANNED|NONSPANNED])]
       [INDEX({CYLINDERS(primary[secondary])|
               KILOBYTES(primary[secondary])|
               MEGABYTES(primary[secondary])|
               RECORDS(primary[secondary])|
               TRACKS(primary[secondary])}
       [VOLUMES(volser[volser...])]
       [CONTROLINTERVALSIZE(size)]
       [FILE(fdname)]
       [NAME(entryname)]
       [OWNER(ownerid)])]
       [CATALOG(catname)]
항목 설명

VOLUMES

데이터 셋이 위치할 볼륨을 지정한다.

INDEXED|

NONINDEXED|

NUMBERED

KSDS, ESDS, RRDS 등 데이터 셋의 구조를 지정한다.

VRDS의 경우는 NUMBERED를 지정하고 RECORDSIZE를 가변길이로 지정한다.

KEYS

INDEXED 구조에서 데이터 셋의 한 레코드 상에서 키가 되는 부분의 위치와 키의 길이를 지정한다.

RECORDSIZE

데이터 당 레코드의 평균 길이와 최대 길이를 지정한다.

평균 길이와 최대 길이 값을 다른 값으로 지정하면 가변길이 레코드임을 의미한다.

SPANNED

이 파라미터가 정의된 데이터 셋은 CONTROLINTERVALSIZE 보다 더 긴 레코드를 저장할 수 있다.

NUMBERED 구조의 데이터 셋인 RRDS와 VRDS에 대해서는 이 파라미터를 사용할 수 없다.

다음은 VSAM.KSDS1이라는 INDEXED 구조의 데이터 셋을 생성하는 예이다.

\ JOB OBM
\ EX KQCAMS
\ FD SYSPRINT=DA,SOUT=A
\ FD SYSIN=*
DEFINE  CLUSTER (NAME(VSAM.KSDS1) -
                   INDEXED -
                   KEYS(10  0) -
                   VOL(VOL100) -
                   SPEED -
                   ORDERED -
                   SHR(2 3)) -
        INDEX   (NAME (VSAM.KSDS1.I)) -
        DATA    (NAME(VSAM.KSDS1.D) -
                   CISZ(4096) -
                   RECSZ(350 350))
\/
\ JEND

VSAM.KSDS1에 저장되는 레코드는 350Byte의 고정길이를 갖고 키 필드는 레코드 상에서 맨 앞의 10Byte에 위치하며, VSAM.KSDS1 데이터 셋을 구성하는 인덱스와 데이터 컴포넌트의 이름을 각각 명시적으로 지정하고 있다.

DEFINE GDG(Generation Data Group)

GDG에 해당하는 카탈로그 엔트리를 카탈로그에 생성한다.

GDG의 한 세대(Generation)에 해당하는 Non-VSAM 데이터셋 GDS와 달리 GDG에 해당하는 실제 데이터 셋은 존재하지 않는다. GDG 카탈로그 엔트리는 추후 해당 GDG 그룹에 속하게 될 여러 GDS를 관리하기 위한 정보만을 갖는 카탈로그 엔트리이다.

DEFINE GDG를 수행한 결과로는 아무런 데이터 셋도 생성되지 않고, 단순히 해당 GDG 그룹을 관리하기 위한 카탈로그 엔트리가 카탈로그에 추가된다.

DEFINE GDG 명령어 구문은 다음과 같다.

DEFINE GENERATIONDATAGROUP (NAME(entryname)
                            LIMIT(limit)
                            [EMPTY|NOEMPTY]
                            [OWNER(ownerid)]
                            [SCRATCH|NOSCRATCH]
                            [TO(date)|FOR(days)])
                            [CATALOG(catname)]
항목 설명

NAME

생성할 GDG 베이스의 이름을 지정한다.

LIMIT

생성하는 GDG에 포함할 수 있는 GDS 멤버의 최댓값을 지정한다.

예를 들어 100이라고 지정하면 100개를 초과하는 GDS를 생성할 수 없다. GDG 멤버는 1부터 255까지 생성할 수 있다.

EMPTY|

NOEMPTY

GDG 베이스가 GDS 멤버를 포함할 수 있는 최댓값에 도달했을 경우 전체 GDS와 GDG 베이스 간의 연관(association)을 끊으려면(rolled off status) EMPTY를 지정한다.

NOEMPTY를 지정하면 가장 오래된 GDS만 연관이 끊기고 새로운 GDS를 베이스에 포함시킨다. GDG 베이스와 연관이 끊어진 GDS는 단순한 Non-VSAM 데이터 셋으로 간주된다.

OWNER

생성할 GDG 베이스의 소유자를 명시적으로 지정한다.

SCRATCH|

NOSCRATCH

GDG 베이스에 포함될 수 있는 GDS 멤버 한계에 도달한 경우 EMPTY와 NOEMPTY 속성에 따라서 전체 혹은 가장 오래된 GDS 데이터 셋과 GDG 베이스간의 연관이 끊어질 때 (rolled off) 해당 GDS가 사용하는 데이터를 지울지(SCRATCH) 아니면 그냥 둘지(NOSCRATCH)를 지정한다.

TO|FOR

GDG 그룹의 유효일을 설정한다.

  • TO : 유효일의 마지막 날짜를 율리우스 날짜 형태로 지정한다. (2006년 1월 1일은 2006001로 지정)

  • FOR : 날짜수를 지정한다. (30을 지정할 경우 오늘부터 30일 간을 의미)

CATALOG

생성할 GDG 베이스가 등록될 카탈로그의 이름을 지정한다. 만약 시스템 카탈로그를 사용하고 있다면 지정된 카탈로그를 무시하고 ds.conf 에 설정된 시스템 카탈로그에 카탈로깅 된다.

다음은 GDS 멤버를 100개까지 포함할 수 있는 TEST.GDG1이라는 이름의 GDG 베이스를 생성하고 2006년 12월 31일까지를 GDG 베이스의 유효기간으로 설정하여 TESTCAT이라는 카탈로그에 등록하는 예이다.

\ JOB OBM
\ EX KQCAMS
\ FD SYSPRINT=DA,SOUT=A
\ FD SYSIN=*
  DEFINE GDG (NAME(TEST.GDG1) -
                LIMIT(100) -
                TO(2006365)) -
                CATALOG(TESTCAT)
\/
\ JEND
DEFINE NONVSAM

일반적인 PS(Physical Sequential) 타입의 Non-VSAM 데이터 셋을 생성하고 만들어진 데이터 셋을 카탈로그에 등록한다.

GDG에 속하는 하나의 GDS는 Non-VSAM 데이터 셋이기 때문에 DEFINE NONVSAM 명령을 사용해서 GDS를 생성할 수 있다.

DEFINE NONVSAM 명령어 구문은 다음과 같다.

DEFINE NONVSAM (NAME(entryname)
                DEVICETYPES(devtype [devtype ...])
                VOLUMES(volser [volser ...])
                [OWNER(ownerid)]
                [RECATALOG|NORECATALOG]
                [TO(date)|FOR(days)])
                [CATALOG(catname)]
항목 설명

NAME

만들어질 Non-VSAM 데이터 셋의 이름을 지정한다.

GDG에 속하는 GDS를 생성하기 위해서는 GDGname.GxxxxVyy의 형태로 entryname을 지정해야 한다. 예를 들면 TEST.GDG1.G0001V00에서 Gxxxx는 세대번호이고, Vyy는 버전번호이다.

이름 규칙에 대한 자세한 내용은 OpenFrame Base “데이터셋 안내서”를 참고한다.

DEVICETYPES

Non-VSAM 데이터 셋이 저장될 볼륨의 디바이스 타입을 지정한다. 3380, 3390, 3480과 같은 디바이스 타입을 지정해야 한다. SYSDA와 같은 에소테릭 디바이스 그룹(esoteric device group)은 사용할 수 없다.

VOLUMES

Non-VSAM 데이터 셋을 저장할 볼륨의 볼륨 일련번호를 지정한다.

CATALOG

Non-VSAM 데이터 셋의 카탈로그 엔트리 정보가 등록될 카탈로그를 지정한다. 만약 시스템 카탈로그를 사용하고 있다면 지정된 카탈로그를 무시하고 ds.conf 에 설정된 시스템 카탈로그에 카탈로깅 된다.

OWNER

Non-VSAM 데이터 셋의 소유자를 명시적으로 지정한다.

RECATALOG|

NORECATALOG

Non-VSAM 데이터 셋에 해당하는 VVDS와 이미 존재하는 데이터 셋을 카탈로그에만 새로 등록하는 경우에는 RECATALOG를 지정한다. 기본값은 NORECATALOG으로 새로 데이터 셋을 생성한다.

TO|FOR

Non-VSAM 데이터 셋의 유효일을 설정한다.

  • TO : 유효일의 마지막 날짜를 율리우스 날짜 형태로 지정한다. (2006년 1월 1일은 2006001로 지정)

  • FOR : 날짜수를 지정한다. (30을 지정할 경우 오늘부터 30일간을 의미)

다음은 Non-VSAM 데이터 셋인 TEST.NVSAM1을 생성하고 TESTCAT 카탈로그에 등록하는 예이다.

\ JOB OBM
\ EX KQCAMS
\ FD SYSPRINT=DA,SOUT=A
\ FD SYSIN=*
  DEFINE NONVSAM (NAME(TEST.NVSAM1) -
         VOLUMES(100000)) -
         CATALOG(TESTCAT)
\/
\ JEND
DEFINE PATH

DEFINE PATH 명령을 통해서 베이스 클러스터에 대한 직접적인 접근 경로를 정의하거나 보조 인덱스를 경유하여 베이스 클러스터에 접근하는 간접적인 접근 경로를 정의한다.

DEFINE PATH 명령어 구문은 다음과 같다.

DEFINE PATH (NAME(entryname)
             [PATHENTRY(entryname)]
             [OWNER(ownerid)]
             [RECATALOG|NORECATALOG]
             [TO(date)|FOR(days)]
             [UPDATE|NOUPDATE])
             [CATALOG(catname)]
항목 설명

NAME

DEFINE PATH 문으로 현재 정의하는 PATH의 이름을 지정한다.

PATHENTRY

PATH가 AIX와 베이스 클러스터의 쌍으로 이루어지는 경우에는 AIX 데이터 셋의 이름을 지정한다.

베이스 클러스터 자체에 대한 PATH를 정의하는 경우라면 베이스 클러스터 데이터 셋의 이름을 지정하며 베이스 클러스터 데이터셋 본래의 인덱스 방법을 지칭하는 단순한 별칭으로 생각할 수 있다. 하지만 하나의 베이스 클러스터에 여러 개의 PATH를 정의할 수 있기 때문에 실제로 액세스할 때 적용되는 속성을 달리 지정하는 용도로 사용할 수 있다.

OWNER

접근 경로의 소유자를 명시적으로 지정한다.

RECATALOG|

NORECATALOG

RECATALOG를 지정할 때 이름이 동일한 접근 경로가 이미 존재하더라도 해당 접근 경로를 지우고 다시 접근 경로를 만든다.

NORECATALOG를 지정하면 새로운 접근 경로인 경우만 생성될 수 있다.

TO|FOR

접근 경로의 유효일을 설정한다.

  • TO : 유효일의 마지막 날짜를 율리우스 날짜 형태로 지정한다. (2006년 1월 1일은 2006001로 지정)

  • FOR : 날짜수를 지정한다. (30을 지정할 경우 오늘부터 30일간을 의미)

UPDATE|

NOUPDATE

  • NOUPDATE : 지정하면 해당 PATH를 통해서 베이스 클러스터 데이터 셋을 변경한 경우 변경된 베이스 클러스터의 업그레이드 셋에 대한 자동적인 변경 작업이 수행되지 않는다.

  • UPDATE : NOUPDATE와 반대의 의미이다. (기본값)

다음은 보조 인덱스 VSAM.AIX1을 경유하여 VSAM.AIX1의 베이스 클러스터에 접근하는 접근경로(PATH)인 VSAM.PATH1을 생성하는 예이다.

\ JOB OBM
\ EX KQCAMS
\ FD SYSPRINT=DA,SOUT=A
\ FD SYSIN=*
  DEFINE PATH    (NAME(VSAM.PATH1) -
                  PATHENTRY(VSAM.AIX1) -
                  UPDATE)
\/
\ JEND

UPDATE 파라미터가 지정되어 있으므로 이 접근경로를 사용하여 베이스 클러스터의 내용을 변경하는 경우 VSAM.AIX1 이외의 다른 보조 인덱스에 대해서도 업그레이드 처리가 일어난다.

다음은 보조 인덱스를 경유하지 않고 직접 베이스 클러스터에 접근하는 접근경로 VSAM.PATH2를 정의하는 예이다.

\ JOB OBM
\ EX KQCAMS
\ FD SYSPRINT=DA,SOUT=A
\ FD SYSIN=*
  DEFINE PATH    (NAME(VSAM.PATH2) -
                  PATHENTRY(VSAM.KSDS1) -
                  UPDATE)
\/
\ JEND

UPDATE 파라미터가 지정되어 있으므로 VSAM.KSDS1을 베이스 클러스터로 하는 보조 인덱스가 존재하는 경우 VSAM.PATH2를 이용하여 베이스 클러스터의 내용이 변경되는 경우 업그레이드 처리가 일어난다.

DEFINE PATH에 관한 자세한 내용은 OpenFrame Base "데이터셋 안내서"를 참고한다.

DEFINE USERCATALOG/MASTERCATALOG

시스템에서 제공하는 하나의 마스터 카탈로그 외에 여러 개의 사용자 카탈로그를 별도로 사용할 수 있다.

DEFINE USERCATALOG 명령으로 시스템 마스터 카탈로그와 비슷한 용도로 사용할 수 있는 사용자 카탈로그를 생성할 수 있다. 이는 마스터 카탈로그의 서브 카탈로그로 생각할 수 있다.

생성된 사용자 카탈로그에 대한 정보는 다시 마스터 카탈로그에 저장된다. 사용자 카탈로그의 서브 카탈로그로 또 다른 사용자 카탈로그를 생성하는 것은 불가능하다. 사용자 카탈로그는 한 레벨로만 생성할 수 있으며, 모든 사용자 카탈로그는 마스터 카탈로그에만 등록되고, 다른 사용자 카탈로그에는 등록될 수 없다. 일반적으로 사용자 카탈로그는 사용자 별로 생성하거나 관련 부서 또는 업무별로 생성한다.

OpenFrame에서는 마스터 카탈로그를 생성하기 위해서 KQCAMS의 DEFINE MASTERCATALOG 명령을 사용하지 않고, OpenFrame에서 제공되는 mascat 툴을 사용한다. 반면 사용자 카탈로그를 추가로 생성하는 경우에는 KQCAMS의 DEFINE USERCATALOG 명령을 사용한다.

DEFINE USERCATALOG 명령어 구문과 주요 파라미터는 다음과 같다.

DEFINE USERCATALOG (NAME(entryname)
                   {CYLINDERS(primary[secondary])|
                    KILOBYTES(primary[secondary])|
                    MEGABYTES(primary[secondary])|
                    RECORDS(primary[secondary])|
                    TRACKS(primary[secondary])}
       VOLUME(volser)
       [CONTROLINTERVALSIZE(size)]
       [DATACLASS(class)]
       [FILE(fdname)]
       [MANAGEMENTCLASS(class)]
       [OWNER(ownerid)]
       [RECORDSIZE(average maximum|4086 32400)]
       [STORAGECLASS(class)]
       [TO(date)|FOR(days)])
       [DATA ({CYLINDERS(primary[secondary])|
               KILOBYTES(primary[secondary])|
               MEGABYTES(primary[secondary])|
               RECORDS(primary[secondary])|
               TRACKS(primary[secondary])}
       [CONTROLINTERVALSIZE(size)]
       [RECORDIZE(average maximum|4086 32400)])]
       [INDEX ({CYLINDERS(primary[secondary])|
                KILOBYTES(primary[secondary])|
                MEGABYTES(primary[secondary])|
                RECORDS(primary[secondary])|
                TRACKS(primary[secondary])}
       [CONTROLINTERVALSIZE(size)])]
       [CATALOG(mastercatname)]
항목 설명

NAME

생성할 사용자 카탈로그의 이름을 지정한다.

VOLUME

사용자 카탈로그가 저장될 볼륨을 지정한다.

RECORDSIZE

사용자가 지정한 RECORDSIZE 파라미터는 무시되고, 기본 카탈로그 구조를 갖는(Basic Catalog Structure) 데이터 셋의 기본적인 레코드 크기 (4086 32400)가 사용된다.

CATALOG

생성된 사용자 카탈로그가 등록될 마스터 카탈로그의 이름을 지정한다. 생략해도 시스템의 마스터 카탈로그에 자동으로 등록된다.

DELETE/VDELETE

VSAM 데이터 셋과 Non-VSAM 데이터셋 그리고 이외에 카탈로그된 데이터셋 항목을 제거하기 위해 DELETE 명령을 사용한다. DELETE 명령은 이미 존재하는 항목을 지우는 역할을 하기 때문에 많은 파라미터를 요구하지 않는다. 제거하려는 항목의 이름과 해당 항목의 카탈로그 엔트리 타입만을 필요로 한다.

DELETE 명령어 구문은 다음과 같다.

{DELETE|VDELETE|VDEL}
       (entryname [entryname ...])
       [ALIAS|
        ALTERNATEINDEX|
        CLUSTER|
        GENERATIONDATAGROUP|
        NONVSAM|
        PATH|
        TRUENAME|
        USERCATALOG]
       [FILE(fdname)]
       [PURGE|OPURGE]
       [FORCE|NOFORCE]
       [CATALOG(catname)]
항목 설명

entryname

제거할 데이터 셋이나 카탈로그 엔트리의 이름을 지정한다.

괄호 안에 여러 개의 이름을 지정하면 한번의 명령으로 다수의 엔트리를 제거할 수 있다.

entryname으로 지정된 데이터 셋은 배타적으로(DISP=LOCK) 할당된다.

ALIAS|

ALTERNATEINDEX|

CLUSTER|

GENERATIONDATAGROUP|

NONVSAM|PATH

TRUENAME|

USERCATALOG

ALIAS는 ALIAS 엔트리 타입이다.

제거할 카탈로그 엔트리의 엔트리 타입을 지정한다. 엔트리 타입 지정은 필수적이지 않지만, 엔트리 타입을 지정하면 실수로 이름이 동일한 의도하지 않은 항목을 제거하는 실수를 방지할 수 있다.

AIX, CLUSTER, PATH, TRUENAME은 VSAM 데이터 셋의 엔트리 타입이고 나머지는 Non-VSAM 데이터 셋의 엔트리 타입이다.

FILE

제거할 데이터 셋을 지정한다.

FILE(fdname)으로 데이터 셋을 지정하는 경우 fdname은 KQCAMS를 호출한 JCL의 FD 문을 통해 할당된 fdname을 지정해야 한다.

FORCE|NOFORCE

삭제할 GDG가 GDS 멤버를 보유하고 있더라도 강제로 삭제할 지 여부를 결정한다. 현재는 GDG에 대해서만 유효한 옵션이다.

  • FORCE : GDG의 GDS 멤버 보유 여부에 무관하게 삭제한다.

  • NOFORCE : 삭제할 GDG가 GDS 멤버를 가지고 있다면 삭제하지 않고 에러를 발생한다. (기본값)

PURGE|NOPURGE

데이터 셋을 정의할 때 지정한 사용기간에 관계없이 데이터셋 엔트리를 제거할지 여부를 지정한다.

PURGE를 지정한 경우 사용기간에 관계없이 데이터셋 엔트리를 제거한다.

NOPURGE를 지정한 경우는 유지기간이 만료된 엔트리만을 대상으로 제거를 수행하며, 만료되지 않은 엔트리에 대해서는 제거하지 않는다. 생략된 경우 NOPURGE가 지정된 것으로 처리된다.

데이터 셋의 사용기간(retention period)은 DEFINE 명령의 TO 및 FOR 파라미터로 지정된다.

CATALOG

삭제할 카탈로그 엔트리 정보가 등록되어 있는 카탈로그를 지정한다.

다음은 VSAM 데이터셋 엔트리 타입의 VSAM.KSDS1과 VSAM.KSDS2를 지정한 사용기간에 관계없이 삭제하는 예이다.

\ JOB OBM
\ EX KQCAMS
\ FD SYSPRINT=DA,SOUT=A
\ FD SYSIN=*
  DELETE (VSAM.KSDS1 VSAM.KSDS2) -
          CLUSTER -
          ERASE -
          PURGE
\/
\ JEND
EXPORT

EXPORT 명령을 이용하여 VSAM CLUSTER나 ALTERNATE INDEX를 외부로 이식 가능한 데이터 셋으로 반출할 수 있다. 카탈로그 데이터셋 자체를 백업하기 위해서 사용된다.

EXPORT 명령어 구문은 다음과 같다.

EXPORT entryname {OUTFILE(fdname)|OUTDATASET(entryname)}
                 [INFILE(fdname)]
항목 설명

entryname

EXPORT할 카탈로그 엔트리의 entryname을 지정한다.

entryname으로 지정된 반출 대상 데이터 셋은 배타적으로(DISP=LOCK) 할당된다.

OUTFILE|

OUTDATASET

EXPORT 결과로 생성될 데이터 셋을 지정한다.

EXPORT 결과로 생성된 데이터 셋을 카탈로그 상에 새로 만들기를 원하거나 이미 카탈로그 되어있는 경우는 entryname을 사용하고, 실행환경에서 KQCAMS 호출 전에 미리 할당되어있는 데이터 셋에 생성되기를 원하는 경우는 fdname을 사용한다.

OUTDATASET 파라미터를 이용해서 지정한 데이터 셋은 배타적으로(DISP=LOCK) 할당된다.

INFILE

EXPORT할 데이터 셋을 지정한다.

INFILE(fdname)으로 데이터 셋을 지정하는 경우 fdname은 KQCAMS를 호출한 JCL의 FD 문을 통해 할당된 fdname을 지정해야 한다.

다음은 카탈로그 TESTCAT을 TESTCAT.BACKUP으로 EXPORT하는 예이다. 카탈로그의 내용을 반출하여 백업한다.

\ JOB OBM
\ EX KQCAMS
\ FD SYSPRINT=DA,SOUT=A
\ FD BACK=DA,FILE=TESTCAT.BACKUP
\ FD SYSIN=*
  EXPORT TESTCAT -
         OUTFILE(BACK)
\/
\ JEND
IMPORT

IMPORT 명령을 이용하면 EXPORT 명령을 사용해서 생성한 백업이나 외부의 이식 가능한 데이터 셋으로부터 다시 데이터 셋을 복원하거나 새로 생성할 수 있다.

IMPORT 명령어 구문은 다음과 같다.

IMPORT {INFILE(fdname)|INDATASET(entryname)}
       {OUTFILE(fdname)|OUTDATASET(entryname)}
       [INTOEMPTY]
       [OBJECTS((entryname
                 [MANAGEMENTCLASS(class)]
                 [NEWNAME(newname)]
                 [STORAGECLASS(class)]
                 [VOLUMES(volser[ volser...])])
                 [(entryname...)...])]
       [CATALOG(catname)]
항목 설명

INFILE|INDATASET

IMPORT할 소스 데이터 셋을 지정한다.

KQCAMS 호출 전에 실행환경에서 미리 할당된 데이터 셋을 사용하려는 경우에는 fdname을 지정하고 KQCAMS 내부적으로 할당하려는 경우에는 entryname을 사용한다.

INDATASET 파라미터를 이용하여 지정된 소스 데이터 셋은 배타적으로(DISP=LOCK) 할당된다.

OUTFILE|

OUTDATASET

KQCAMS 호출 전에 실행환경에서 미리 할당된 데이터 셋을 사용하려는 경우에는 fdname을 지정하고 KQCAMS 내부적으로 할당하려는 경우에는 entryname을 사용한다.

OUTDATASET 파라미터를 이용하여 지정된 데이터 셋은 배타적으로(DISP=LOCK) 할당된다.

INTOEMPTY

IMPORT 결과로 데이터를 받아들이는 데이터 셋이 카탈로그에 등록되어 있거나 데이터 셋에는 존재하지만 저장 공간이 할당되지 않은 상태인 경우 (empty dataset) IMPORT 명령은 기본적으로 실패하게 된다. 이것을 무시하고 IMPORT 명령 수행 중에 필요한 저장 공간을 확보하여 명령을 성공시키기를 원하는 경우는 INTOEMPTY를 지정한다.

OBJECTS

IMPORT 작업을 수행하는 과정에서 부수적으로 IMPORT 원본 데이터 셋에 기록된 정보 중에서 일부를 변경하는 작업을 수행할 수 있다. 이때 변경하려는 entryname과 적용할 새로운 속성을 지정한다.

여러 개의 entryname에 대해서 반복적으로 지정할 수 있다.

CATALOG

IMPORT 과정 중에 카탈로깅이 필요한 경우 사용할 카탈로그를 지정한다.

다음은 TESTCAT.BACKUP이라는 백업 데이터 셋의 내용을 카탈로그 TESTCAT으로 IMPORT하는 예이다. TESTCAT.BACKUP에 저장된 내용을 이용하여 카탈로그 TESTCAT을 복원한다.

\ JOB OBM
\ EX KQCAMS
\ FD SYSPRINT=DA,SOUT=A
\ FD BACK=DA,FILE=TESTCAT.BACKUP
\ FD SYSIN=*
    IMPORT INFILE(BACK) -
           OUTDATASET(TESTCAT)
\/
\ JEND
LISTCAT/VLISTCAT

LISTCAT 명령을 사용해서 카탈로그에 정의된 데이터 셋에 관한 다양한 정보를 출력할 수 있다.

다음과 같은 그룹으로 관련 정보를 정리해서 보여준다.

  • 엔트리 객체의 속성

  • 생성, 변경, 만료 시간 정보

  • 보호(protection) 관련 정보

  • 데이터셋 액세스 통계 정보

  • 저장공간 할당 정보

  • 데이터 셋의 구조에 관한 정보

LISTCAT 명령어 구문은 다음과 같다.

{LISTCAT|VLISTCAT|VLIST}
        [ALIAS]
        [ALTERNATEINDEX]
        [CLUSTER]
        [DATA]
        [GENERATIONDATAGROUP]
        [INDEX]
        [NONVSAM]
        [PATH]
        [USERCATALOG]
        [ENTRIES(entryname[ entryname...])|LEVEL(level)]
        [NAME|HISTORY|VOLUME|ALLOCATION|ALL]
        [CATALOG(catname)]
항목 설명

ALIAS

ALTERNATEINDEX,

CLUSTER, DATA,

GENERATIONDATAGROUP, INDEX,

NONVSAM, PATH,

USERCATALOG

지정된 종류의 카탈로그 엔트리에 대해서만 LISTCAT 정보를 출력하도록 하기 위한 파라미터이다.

예를 들어 LISTCAT CLUSTER라고 지정하는 경우 카탈로그 엔트리 타입이 CLUSTER인 엔트리에 대한 정보만 출력한다.

두 개 이상의 엔트리 타입을 지정하는 것도 가능하다. LISTCAT DATA INDEX라고 지정하면 카탈로그 엔트리 타입이 DATA이거나 INDEX인 엔트리에 대한 정보만 출력된다.

파라미터를 지정하지 않는 경우 카탈로그 엔트리 타입에 대한 필터링을 하지 않고 모든 타입의 엔트리 정보를 모두 출력한다.

이와는 별도로 ENTRIES 파라미터를 지정하는 경우 엔트리 타입이 일치하더라도 엔트리 이름이 ENTRIES 파라미터에 지정된 이름을 만족하지 않는 엔트리들에 대한 정보는 출력되지 않는다.

ENTRIES|LEVEL

LISTCAT 명령의 대상이 되는 카탈로그 엔트리명을 지정한다.

  • ENTRIES : 카탈로그에 존재하는 엔트리 이름 중에서 지정된 entryname과 이름이 일치하고 세그먼트 개수도 일치하는 이름만 명령의 대상으로 지정된다.

  • LEVEL : 카탈로그에 존재하는 엔트리 이름 중에서 지정된 entryname과 이름의 앞부분이 일치하는 이름이 명령의 대상으로 지정된다. 사용자가 지정한 entryname의 세그먼트 개수보다 많은 세그먼트 개수를 갖는 이름들도 명령의 대상으로 지정된다.

ENTRIES와 LEVEL의 사용 예는 다음과 같다.

  • 카탈로그가 다음의 엔트리 이름들을 가지고 있는 경우

    1. A.A.B

    2. A.B.B

    3. A.B.B.C

    4. A.B.B.C.C

    5. A.C.C

    6. A.D

    7. A.E

    8. A

  • ENTRIES(A.*)를 지정한 경우, 6, 7이 명령의 대상으로 선택된다.

  • ENTRIES(A.*.B)를 지정한 경우, 1, 2가 명령의 대상으로 선택된다.

  • LEVEL(A.*.B)를 지정한 경우, 1, 2, 3, 4가 명령의 대상으로 선택된다.

  • LEVEL(A)를 지정한 경우, 1,2,3,4,5,6,7 이 모두 명령의 대상으로 선택된다.

(*는 해당 세그먼트의 모든 이름과 일치한다.)

NAME|HISTORY|

VOLUME|

ALLOCATION|ALL

위의 엔트리 타입 필터 및 ENTRIES 파라미터로 지정되는 엔트리 이름 조건을 만족하는 카탈로그 엔트리에 대한 정보를 출력하는데 있어서 얼마나 자세한 레벨의 정보까지 출력할지를 지정한다.

순서대로 NAME을 지정하면 가장 기본적인 정보만이 출력되고 ALL을 지정하면 모든 해당 엔트리에 대한 정보가 출력된다.

CATALOG

LISTCAT 명령의 대상이 카탈로그의 이름을 지정한다. 위의 ENTRIES나 LEVEL로 지정하는 entryname은 여기에서 지정하는 카탈로그에서 검색된다.

다음은 VSAM.KSDS1의 모든 엔트리에 대한 정보를 출력하는 예이다.

\ JOB OBM
\ EX KQCAMS
\ FD SYSPRINT=DA,SOUT=A
\ FD SYSIN=*
  LISTCAT ENTRIES(VSAM.KSDS1) ALL
\/
\ JEND

다음은 앞의 LISTCAT 명령을 실행한 결과로 출력되는 내용(SYSPRINT)이다.

CLUSTER ------------- VSAM.KSDS1
   HISTORY
     CREATION -------------- (NULL)   DATASET-OWNER ----------- (EMPTY)
     RELEASE ------------------- 1   VSAM QUIESCED --------------- (NO)
   PROTECTION-PSWD---------- (NULL)
   ASSOCIATIONS
     DATA ------------ VSAM.KSDS1.D
     INDEX ----------- VSAM.KSDS1.I
DATA ---------------- VSAM.KSDS1.D
   HISTORY
     CREATION --------------- (NULL)   DATASET-OWNER ---------- (EMPTY)
     RELEASE -------------------- 1
   PROTECTION-PSWD ---------- (NULL)
   ASSOCIATION
     CLUSTER ----------- VSAM.KSDS1
   ATTRIBUTES
     AVGLRECL ----------------- 350   MAXLRECL ------------------- 350
     KEYLEN -------------------- 10   RKP -------------------------- 0
     CISIZE ------------------ 4096   INDEXED
     NON-SPANNED
   STATISTICS
     REC-DELETED ---------------- 0   REC-INSERTED ------------- 10445
     REC-RETRIEVED -------------- 0   REC-TOTAL ---------------- 10445
     REC-UPDATED ---------------- 0   TIMESTAMP ---------------- (NULL)
   ALLOCATION
     HI-A-RBA ------------------- 0   HI-U-RBA --------------------- 0
   VOLUMES
     VOLSER ----------------- (TSAM)
INDEX --------------- VSAM.KSDS1.I
   HISTORY
     CREATION --------------- (NULL)   DATASET-OWNER ---------- (EMPTY)
     RELEASE -------------------- 1
   PROTECTION-PSWD ---------- (NULL)
   ASSOCIATION
     CLUSTER ----------- VSAM.KSDS1
   ATTRIBUTES
     AVGLRECL ----------------- 350   MAXLRECL ------------------- 350
     KEYLEN -------------------- 10   RKP -------------------------- 0
     CISIZE ------------------ 4096
   STATISTICS
     INDEX:
       ENTRIES/SECT ------------ 254     HI-LEVEL-RBA ----------- 12288
       LEVELS -------------------- 2     SEQ-SET-RBA ------------- 4096
     REC-DELETED ----------------- 0   REC-INSERTED ------------ 10445
     REC-RETRIEVED --------------- 0   REC-TOTAL --------------- 10445
     REC-UPDATED ----------------- 0   TIMESTAMP --------------- (NULL)
   ALLOCATION
     HI-A-RBA -------------------- 0   HI-U-RBA ------------------- 0
   VOLUMES
     VOLSER ---------------------- (TSAM)
PRINT

VSAM 및 Non-VSAM 데이터 셋에 저장되어있는 레코드들을 출력하여 보여준다.

PRINT 명령어 구문은 다음과 같다.

PRINT {INFILE(fdname)|INDATASET(entryname)}
      [CHARACTER|DUMP|HEX]
      [FROMKEY(key)|FROMADDRESS(address)|FROMNUMBER(number)|SKIP(number)]
      [OUTFILE(fdname)]
      [TOKEY(key)|TOADDRESS(address)|TONUMBER(number)|COUNT(number)]
항목 설명

INFILE|INDATASET

PRINT 명령을 이용하여 내용을 출력할 데이터 셋을 지정한다.

  • INFILE : JCL을 통해 미리 할당된 fdname을 지정해야 한다.

  • INDATASET : KQCAMS에서 직접 데이터 셋을 할당하며 배타적(DISP=LOCK) 할당을 한다.

CHARACTER|DUMP|

HEX

PRINT 출력내용의 포맷을 지정한다.

  • CHARACTER : 스트링 형태로 레코드의 내용을 출력한다.

  • DUMP : 오른쪽에는 16진수로 왼쪽에는 스트링 형태를 나란히 출력한다. (기본값)

  • HEX : 16진수 형태로 출력한다.

FROMKEY|

FROMADDRESS|

FROMNUMBER|SKIP

PRINT문은 REPRO문과 비슷한 파라미터를 통해서 사용자가 출력할 레코드의 범위를 지정할 수 있다. 각 파라미터의 의미는 바로 뒤에 설명되는 REPRO 명령 파라미터와 동일하다.

OUTFILE

SYSPRINT가 아닌 다른 FD에 PRINT 결과를 출력할 경우에 사용한다.

PRINT 명령을 통해서 출력한 데이터 셋의 내용을 저장할 별도의 데이터 셋을 지정하고 JCL을 통해 미리 할당된 fdname을 지정해야 한다.

이 파라미터를 생략하면 기본적으로 PRINT 명령은 SYSPRINT로 출력한다.

TOKEY|TOADDRESS |

TONUMBER|COUNT

PRINT는 REPRO와 비슷한 파라미터를 통해서 출력할 레코드의 범위를 사용자가 지정할 수 있다. 각 파라미터의 의미는 REPRO 명령의 해당 파라미터와 동일하다.

다음은 TEST.KSDS1에 저장된 레코드를 TEST.OUT에 DUMP 포맷으로 출력하는 예이다. 출력되는 레코드의 범위는 키 값이 0000000099인 첫 레코드부터 10개이다.

\ JOB OBM
\ EX KQCAMS
\ FD OUTFD=DA,FILE=TEST.OUT
\ FD SYSPRINT=DA,SOUT=A
\ FD SYSIN=*
    PRINT INDATASET(TEST.KSDS1) DUMP -
          FROMKEY(0000000099) OUTFILE(OUTFD) COUNT(10)
\/
\ JEND

다음은 위의 JCL을 실행한 결과, TEST.OUT에 출력된 내용이다.

KEY OF RECORD = 30303030303030303939
0000: 3030 3030 3030 3030 3939 7265 636F 7264 *0000000099record*
0010: 3030 3030 3030 3030 3939                *0000000099      *
KEY OF RECORD = 30303030303030313030
0000: 3030 3030 3030 3031 3030 7265 636F 7264 *0000000100record*
0010: 3030 3030 3030 3031 3030                *0000000100      *
KEY OF RECORD = 30303030303030313031
0000: 3030 3030 3030 3031 3031 7265 636F 7264 *0000000101record*
0010: 3030 3030 3030 3031 3031                *0000000101      *
KEY OF RECORD = 30303030303030313032
0000: 3030 3030 3030 3031 3032 7265 636F 7264 *0000000102record*
0010: 3030 3030 3030 3031 3032                *0000000102      *
KEY OF RECORD = 30303030303030313033
0000: 3030 3030 3030 3031 3033 7265 636F 7264 *0000000103record*
0010: 3030 3030 3030 3031 3033                *0000000103      *
KEY OF RECORD = 30303030303030313034
0000: 3030 3030 3030 3031 3034 7265 636F 7264 *0000000104record*
0010: 3030 3030 3030 3031 3034                *0000000104      *
KEY OF RECORD = 30303030303030313035
0000: 3030 3030 3030 3031 3035 7265 636F 7264 *0000000105record*
0010: 3030 3030 3030 3031 3035                *0000000105      *
KEY OF RECORD = 30303030303030313036
0000: 3030 3030 3030 3031 3036 7265 636F 7264 *0000000106record*
0010: 3030 3030 3030 3031 3036                *0000000106      *
KEY OF RECORD = 30303030303030313037
0000: 3030 3030 3030 3031 3037 7265 636F 7264 *0000000107record*
0010: 3030 3030 3030 3031 3037                *0000000107      *
KEY OF RECORD = 30303030303030313038
0000: 3030 3030 3030 3031 3038 7265 636F 7264 *0000000108record*
0010: 3030 3030 3030 3031 3038                *0000000108      *
PRINT 10 record(s)
KQCAMS: PRINT OK
REPRO

DEFINE 명령을 통해서 데이터 셋이 이미 정의되어 있다면 REPRO 명령을 이용해서 VSAM과 Non-VSAM 데이터 셋의 내용을 다른 데이터 셋에 저장할 수 있다. 이 명령에 사용되는 VSAM 데이터 셋은 카탈로그에 등록되어 있어야 하지만 Non-VSAM 데이터 셋의 경우는 카탈로그에 등록되어 있지 않아도 된다.

Mainframe의 카탈로그는 일반적으로 하나의 KSDS 클러스터에 저장되어 있기 때문에 REPRO 명령은 카탈로그 내용 자체를 복사하는 용도로 사용될 수 있다.

REPRO 명령을 이용하지 않고 일반적인 애플리케이션을 이용해서 레코드를 데이터 셋에 저장하는 경우도 매우 일반적이나 REPRO 명령은 레코드의 내용에 상관하지 않고 주로 관리목적으로 데이터 셋을 복사하는 용도로 사용된다.

REPRO 명령어 구문은 다음과 같다.

REPRO {INFILE(fdname)|INDATASET(entryname)}
      {OUTFILE(fdname)|OUTDATASET(entryname)}
      [ENTRIES(entryname [entryname...])|LEVEL(level)]
      [FROMKEY(key)|FROMADDRESS(address)|FROMNUMBER(number)|SKIP(number)]
      [MERGECAT|NOMERGECAT]
      [REPLACE|NOREPLACE]
      [REUSE|NOREUSE]
      [TOKEY(key)|TOADDRESS(address)|TONUMBER(number)|COUNT(number)]
항목 설명

INFILE|INDATASET

복사할 원본 데이터 셋을 지정한다.

  • INFILE : JCL을 통해서 명시된 fdname을 값으로 지정해야 하는 반면 INDATASET 파라미터를 사용하는 경우에는 데이터 셋의 카탈로그에 등록된 엔트리 이름을 지정해야 한다.

  • INDATASET : INDATASET 파라미터를 이용해서 지정한 원본 데이터 셋은 배타적으로(DISP=LOCK) 할당된다.

OUTFILE|OUTDATASET

원본 데이터 셋을 복사한 후 저장할 대상 데이터 셋을 지정한다.

  • OUTFILE : 파라미터의 값으로 fdname을 지정해야 하며, OUTDATASET 파라미터의 값으로는 카탈로그된 엔트리 이름을 지정해야 한다.

  • OUTDATASET : OUTDATASET 파라미터를 이용해서 지정한 대상 데이터 셋은 배타적으로(DISP=LOCK) 할당된다.

ENTRIES|LEVEL

REPRO 명령을 이용하여 카탈로그를 복사하는 경우에 복사 대상이 되는 카탈로그 엔트리명을 지정한다. 이 경우 2개의 카탈로그 사이에 카탈로그 엔트리 이름들만 복사된다. 실제 카탈로그 엔트리가 가리키는 데이터 셋에 대한 복사를 의미하지는 않는다.

  • ENTRIES : 카탈로그에 존재하는 엔트리 이름 중에서 지정된 entryname과 이름이 일치하고 세그먼트 개수도 일치하는 이름만이 명령의 대상으로 지정된다.

  • LEVEL : 카탈로그에 존재하는 엔트리 이름 중에서, 지정된 entryname과 이름의 앞부분이 일치하는 이름이 명령의 대상으로 지정된다. 즉, 사용자가 지정한 entryname의 세그먼트 개수보다 많은 세그먼트 개수를 갖는 이름들도 명령의 대상으로 지정된다.

ENTRIES와 LEVEL의 사용 예는 다음과 같다.

  • 카탈로그가 다음의 엔트리 이름들을 가지고 있는 경우

    1. A.A.B

    2. A.B.B

    3. A.B.B.C

    4. A.B.B.C.C

    5. A.C.C

    6. A.D

    7. A.E

    8. A

  • ENTRIES(A.*)를 지정한 경우, 6, 7이 명령의 대상으로 선택된다.

  • ENTRIES(A.*.B)를 지정한 경우, 1, 2가 명령의 대상으로 선택된다.

  • LEVEL(A.*.B)를 지정한 경우, 1, 2, 3, 4가 명령의 대상으로 선택된다.

  • LEVEL(A)를 지정한 경우, 1,2,3,4,5,6,7 이 모두 명령의 대상으로 선택된다.

(*는 해당 세그먼트의 모든 이름과 일치한다)

FROMKEY|

FROMADDRESS|

FROMNUMBER|SKIP

데이터셋 전체를 모두 복사하지 않고 해당 데이터 셋의 일부 레코드만을 복사하기 위해 복사할 대상을 한정한다.

각각 특정 키와 주소 그리고 레코드 번호 이후의 레코드를 대상으로 복사하고, SKIP 파라미터는 첫 레코드부터 number개의 레코드는 복사하지 않고 number개 다음 레코드부터 복사작업의 대상으로 한다. 즉, 복사작업의 시작이 되는 레코드를 지정한다.

MERGECAT|

NOMERGECAT

REPRO 명령으로 일반 데이터셋 이외에도 카탈로그를 담고 있는 특수한 데이터 셋을 대상으로 복사작업을 수행할 수 있다.

  • MERGECAT : 소스 카탈로그의 레코드를 타깃 카탈로그로 복사한 후에 소스 카탈로그 상에서 레코드를 제거한다.

  • NOMERGECAT : 단순히 복사만 진행되고 원본 카탈로그에서 카탈로그 레코드는 삭제되지 않는다. NOMERGECAT을 지정하는 경우 타깃 카탈로그는 비어 있어야 한다. (기본값)

REPLACE|NOREPLACE

소스 데이터 셋을 타깃 데이터 셋으로 복사하는 과정에서 타깃 데이터 셋에 이미 동일한 레코드가 있는 경우의 처리방법을 지정한다.

  • REPLACE : 기존의 레코드를 새로운 레코드로 대체한다.

  • NOREPLACE : 중복 레코드가 발견되었다는 에러 메시지만 나타나고 타깃 데이터 셋의 중복 레코드에 복사하지 않는다. (기본값)

REUSE|NOREUSE

카탈로그가 아닌 VSAM 데이터 셋이 타깃 데이터 셋인 경우에 사용한다. 기존 레코드를 REUSE한다기보다 데이터셋 레코드를 저장하는데 사용되는 공간을 REUSE한다.

  • REUSE : 해당 타깃 데이터 셋에 이미 레코드가 들어있더라도 맨 처음부터 레코드를 추가한다(HURBA를 0인 상태로 열고 쓰기동작을 한다).

  • NOREUSE : 타깃 데이터 셋의 마지막 레코드 이후부터 레코드를 추가하여 기존에 있던 데이터 셋의 레코드를 놔둔 상태로 타깃 데이터 셋에 레코드를 복사한다.

TOKEY|TOADDRESS|

TONUMBER|COUNT

복사작업의 대상이 되는 레코드를 제한한다. 복사작업의 대상이 되는 마지막 레코드를 지정한다.

다음은 VSAM.KSDS1 데이터 셋의 50001번 레코드부터 10000개의 레코드를 VSAM.KSDS2 데이터 셋으로 복사하는 예이다.

\ JOB OBM
\ EX KQCAMS
\ FD INFD=DA,FILE=VSAM.KSDS1
\ FD OUTFD=DA,FILE=VSAM.KSDS2
\ FD SYSPRINT=DA,SOUT=A
\ FD SYSIN=*
REPRO  INFILE(INFD) -
OUTFILE(OUTFD) -
SKIP(50000) COUNT(10000)
\/
\ JEND
VERIFY

애플리케이션에서 VSAM 데이터 셋을 개방하고 사용하는 과정에서 비정상적인 종료에 의해서 종료처리가 정확하게 되지 않은 경우 해당 VSAM 데이터 셋이 카탈로그에 레코드를 저장하기 위해 사용하는 저장공간에 대한 정보를 부정확한 값으로 기록할 수 있다.

이러한 이유로 카탈로그에 문제가 발생한 경우 VERIFY 명령은 문제가 되는 VSAM 데이터 셋에 대해서 올바른 저장공간 및 상태정보를 나타내고 있는지 확인하고, 지정된 데이터 셋에 대한 카탈로그 정보가 잘못된 경우 올바른 값으로 갱신한다. 비정상적인 종료가 발생한 경우 카탈로그의 STATISTICS/REC-TOTAL 정보가 실제 VSAM 데이터 셋의 레코드 수와 일치하지 않을 수 있으나, VERIFY 명령을 수행하면 STATISTICS/REC-TOTAL 정보를 올바른 값으로 갱신할 수 있다.

VERIFY 명령은 VSAM 데이터 셋에 대해서만 동작한다.

VERIFY 명령어 구문은 다음과 같다.

VERIFY FILE(fdname)|DATASET(entryname)
항목 설명

FILE|DATASET

VERIFY 명령의 대상이 되는 데이터 셋을 지정한다.

  • FILE : JCL을 통해 할당된 데이터 셋의 fdname을 지정해야 한다.

  • DATASET : KQCAMS에서 지정된 데이터 셋을 직접 할당하며 공유(DISP=CONT) 할당한다.

다음은 TEST.CLUS1 데이터 셋의 카탈로그 정보를 확인하는 예이다.

\ JOB OBM
\ EX KQCAMS
\ FD SYSPRINT=DA,SOUT=A
\ FD TESTFD=DA,FILE=TEST.CLUS1
\ FD SYSIN=*
    VERIFY FILE(TESTFD)
\/
\ JEND

11.3. 보조 명령어

한 번의 KQCAMS 실행으로 여러 개의 KQCAMS 명령을 수행할 수 있다.

보조 명령어(Modal command)는 여러 개의 KQCAMS 명령을 수행하기 위해서 필요한 기능을 제공하는 명령어로 실제로 카탈로그 엔트리나 오브젝트에 대해 처리하는 기능 명령어와 구분된다.

현재 KQCAMS의 보조 명령어 중 PARM은 지원하지 않는다.

IF-THEN-ELSE

실행된 명령의 결과 코드 값(LASTCC 혹은 MAXCC)에 따라서 다음에 실행할 명령을 분기하기 위해서 사용된다. IF와 THEN 사이에는 조건분기할 때 평가되는 조건을 지정해야 한다. 조건은 컨디션 코드(Condition Code)와 특정 상수의 비교를 통해서 기술한다. 예를 들어 LASTCC > 30라고 지정하면 컨디션 코드 변수 중의 하나인 LASTCC 값이 30보다 큰 경우를 의미한다.

THEN 문에는 IF 문이 참인 경우 실행할 KQCAMS 명령을 기술하고, ELSE 문에는 IF 문이 거짓인 경우 실행할 명령을 기술한다. 만약 IF 문이 거짓일 경우 실행할 명령이 없다면 ELSE 문을 생략할 수 있다.

IF-THEN-ELSE 구문은 조건에 따라서 다른 명령을 수행하는 하나의 KQCAMS 명령으로 간주된다. 따라서 IF-THEN-ELSE 구문을 여러 라인에 걸쳐서 기술하는 경우는 하이픈(-)을 적절히 사용해야 한다.

IF-THEN-ELSE 명령어 구문은 다음과 같다.

IF {Condition Code} {operator} {number}
THEN[ command| DO command set END]
[ELSE[ command| DO command set END]]
  • Condition Code

    Condition Code에 지정 가능한 값과 의미는 다음과 같다.

    설명

    LASTCC

    가장 최근에 실행된 명령의 실행 결과값을 저장하는 KQCAMS에서 사용하는 변수이다. 성공적인 경우의 LASTCC는 10의 값을 갖고, 무시할 수 있는 경고가 발생한 경우의 값은 10이다. 심각한 문제가 발생한 경우 50의 값을 갖게 된다.

    MAXCC

    현재 실행 중인 명령보다 앞서서 실행된 명령의 실행 결과 값 중에서 가장 큰 값을 저장하는데 사용하는 변수이다.

    Operator

    컨디션 코드의 값을 평가하기 위한 연산자이다.

    지정 가능한 값과 의미는 하단의 "참고"에 있는 비교연산자 표를 참고한다.

다음은 LASTCC의 값이 30과 동일한 경우 MAXCC에 10을 설정하는 프로그램의 일부분을 예로 보여준다. 실제 IF-THEN 문이 동작하는 것을 보여주기 위해서 LASTCC를 30으로 설정했으며 IF-THEN 문이 실행될 때는 LASTCC 값이 30이므로 THEN 뒤의 SET MAXCC=10이 실행된다. 이 상태에서 KQCAMS를 종료하면 최종적인 MAXCC 값을 보고하고 종료하므로 실행된 결과를 확인할 수 있다.

SET LASTCC=30
IF LASTCC=30 THEN SET MAXCC=10

다음은 LASTCC의 값이 20보다 큰 경우 TEST.SDS1의 엔트리 정보를 가져오고, LASTCC가 20보다 크지 않은 경우 TEST.SDS2의 엔트리 정보를 가져오는 예이다. 일반적으로 SET LASTCC의 위치에 다른 KQCAMS 명령어를 실행하여 그 결과에 의해서 LASTCC가 설정되고, 그 결과에 따라서 조건적으로 명령을 실행한다. 본 예제에서는 IF-THEN-ELSE 문의 동작을 테스트하기 위해 강제로 IF 문 전에 LASTCC의 값을 10으로 설정하였다. IF 문의 결과에 따라 TEST.SDS2가 LISTCAT된다.

SET LASTCC=10
IF LASTCC > 20 -
THEN -
    LISTCAT ENT(TEST.SDS1)
ELSE -
    LISTCAT ENT(TEST.SDS2)
Null

Null은 아무 동작도 발생하지 않는 문법적인 용도의 명령으로 다음과 같은 2가지 목적으로 사용된다.

  • IF-THEN-ELSE 구문의 문법에 어긋나지 않고 THEN이나 ELSE에 아무런 명령도 지정하지 않을 경우에 사용한다.

  • Null이 IF-THEN-ELSE 구문 외에서 사용된 경우는 빈 라인으로 처리된다.

THEN이나 ELSE 뒤에서 라인을 변경하는 경우 라인이 계속 이어지는 것을 의미하는 하이픈(-)을 지정하지 않는다. 하이픈(-)을 지정하면 KQCAMS는 THEN이나 ELSE 문 다음에 명령이 있는 것으로 가정하고 처리하기 때문에 의도한대로 명령의 분기가 되지 않는다.

다음은 LASTCC가 20보다 큰 경우에 수행하는 명령은 없으며, LASTCC가 20보다 작은 경우에는 TEST.SDS2의 엔트리 정보를 가져오는 예이다.

SET LASTCC=10
IF LASTCC > 20 -
THEN
ELSE LISTCAT ENT(TEST.SDS2)
SET

MAXCC나 LASTCC의 값을 강제로 특정한 값으로 설정하는데 사용한다.주로 특정 경고 수준의 컨디션 코드를 무시하고 JCL에서 KQCAMS 이후의 STEP을 계속 실행하기 위한 용도로 사용된다.

다음은 LASTCC의 값이 30과 동일한 경우 MAXCC의 값을 10으로 강제 설정하는 예이다.

DEL STEP에서 TEST.SDS1이 없는 경우 DEL STEP은 반환코드 30을 반환하고 종료하므로 DEF STEP은 수행되지 않는다. TJES의 설정이나 JOB에 기술된 COND에 따라 달라질 수 있지만, 반환코드가 30인 경우 DEF STEP을 처리하지 않고 JOB이 ABEND 처리되는 경우를 방지하려면 MAXCC를 10으로 강제 설정함으로써 뒤따르는 DEF STEP이 실행되게 할 수 있다.

\ JOB OBM
\ EX KQCAMS
\ FD SYSPRINT=DA,SOUT=A
\ FD SYSIN=*
  DELETE TEST.SDS1
  IF LASTCC=30 THEN SET MAXCC=10
\/
\ EX KQCAMS
\ FD SYSPRINT=DA,SOUT=A
\ FD SYSIN=*
  DEFINE NONVSAM (NAME(TEST.SDS1) VOLUMES(100000))
\/
\ JEND
CANCEL

CANCEL 명령어를 만나면 KQCAMS의 실행이 종료되어 CANCEL 명령 이후의 나머지 명령은 처리되지 않는다.

다음 예제는 LASTCC가 20인 경우 다음 THEN 명령을 수행하는 중 CANCEL이 실행되어 KQCAMS의 실행을 종료하는 프로그램의 일부이다.

LISTCAT ENTRIES(MUST.EXIST.SDS)
IF LASTCC=20 THEN CANCEL
...

LISCAT으로 지정한 카탈로그 엔트리가 존재하지 않는 경우 컨디션 코드는 20이다. 컨디션 코드가 20인 경우는 메시지 레벨 조건 코드이므로 다음 KQCAMS 명령을 계속 실행하게 된다.

앞의 예제는 MUST.EXIST.SDS 이라는 데이터 셋이 없는 경우 더 이상 다음 명령을 실행하지 않고 곧 바로 IF 조건이 만족하는 경우 CANCEL 명령을 실행하여 KQCAMS의 실행을 종료한다.

11.4. 비기능 명령어

본 절에서는 KQCAMS 비기능 명령어의 사용법에 대해서 설명한다.

BLDINDEX

BLDINDEX 명령을 사용하여 기존에 존재하는 데이터 셋에 대한 보조 인덱스를 구성한다. BLDINDEX 명령은 내부적으로 보조 인덱스 클러스터에 하나의 보조키와 다수개의 기본키로 구성되는 레코드를 적재하는 역할을 담당한다.

BLDINDEX 명령어 구문은 다음과 같다.

BLDINDEX {INFILE(fdname)|INDATASET(entryname)}
         {OUTFILE(fdname)|OUTDATASET(entryname)}
         [CATALOG(catname)]
항목 설명

INFILE|INDATASET

보조 인덱스를 구성하는데 사용할 베이스 클러스터를 지정한다.

  • INFILE : KQCAMS 호출 전에 실행환경에 의해서 미리 할당된 데이터 셋을 사용하는 경우에는 fdname을 사용한다.

  • INDATASET : KQCAMS 자체적으로 데이터 셋을 할당하는 경우에는 entryname을 사용한다. INDATASET 파라미터를 이용해서 지정한 베이스 클러스터는 배타적으로 (DISP=LOCK) 할당된다.

OUTFILE|OUTDATASET

BLDINDEX 결과로 구성되는 보조 인덱스 클러스터를 지정한다.

BLDINDEX 전에 보조 인덱스는 미리 DEFINE되어야 한다.

  • OUTFILE : KQCAMS 호출 전에 실행환경에 의해서 미리 할당된 데이터 셋을 사용하는 경우에는 fdname을 사용한다.

  • OUTDATASET : KQCAMS 자체적으로 데이터 셋을 할당하는 경우에는 entryname을 사용한다. OUTDATASET 파라미터를 이용해서 지정한 보조 인덱스 클러스터는 배타적으로(DISP=LOCK) 할당된다.

CATALOG

entryname으로 지정된 카탈로그 엔트리를 찾을 때 사용할 카탈로그를 명시적으로 지정한다. 지정하지 않는 경우에는 카탈로그 검색 순서에 따라 결정된다.

다음은 VSAM.KSDS1의 보조 인덱스인 VSAM.AIX1을 구성하는 예이다.

\ JOB OBM
\ EX KQCAMS
\ FD SYSPRINT=DA,SOUT=A
\ FD BASE=DA,FILE=VSAM.KSDS1,DISP=LOCK
\ FD AIX=DA,FILE=VSAM.AIX1,DISP=LOCK
\ FD SYSIN=*
    BLDINDEX INFILE(BASE) -
             OUTFILE(AIX)
\/
\ JEND
EXAMINE

EXAMINE 명령은 KSDS의 인덱스와 데이터 영역의 무결성을 분석하고 그 결과를 출력하는 명령이다.

OpenFrame에서 이 명령은 실제로 아무 동작도 수행하지 않는다.

EXAMINE 명령어 구문에서 지정할 수 있는 파라미터는 다음과 같다.

EXAMINE {NAME(clustername)}
       [{INDEXTEST|NOINDEXTEST}]
       [{DATATEST|NODATATEST}]
       [ERRORLIMIT(value)]
항목 설명

NAME

무결성 검사를 수행할 KSDS 또는 사용자 카탈로그 명칭을 지정한다.

INDEXTEST|

NOINDEXTEST

지정된 클러스터의 인덱스 컴포넌트에 대해 무결성 검사 수행 여부를 결정한다.

  • INDEXTEST : 인덱스 컴포넌트의 무결성 검사를 수행한다. (기본값)

  • NOINDEXTEST : 인덱스 컴포넌트의 무결성 검사를 수행하지 않는다.

DATATEST|

NODATATEST

지정된 클러스터의 데이터 컴포넌트에 대해 무결성 검사 수행 여부를 검사한다.

  • DATATEST : 데이터 컴포넌트의 무결성 검사를 수행한다.

  • NODATATEST : 데이터 컴포넌트의 무결성 검사를 수행하지 않는다. (기본값)

ERRORLIMIT

명령 수행 결과로 출력될 오류 제한 개수를 value로 지정한다.

다음은 VSAM.KSDS1에 대해 EXAMINE 명령을 수행하는 예이다.

\ JOB OBM
\ EX KQCAMS
\ FD SYSPRINT=DA,SOUT=A
\ FD SYSIN=*
   EXAMINE -
       NAME(VSAM.KSDS1) -
       INDEXTEST -
       DATATEST -
       ERRORLIMIT(350)
\/
\ JEND

11.5. 관련 환경설정

KQCAMS 관련 환경설정은 OpenFrame 환경설정의 idcams 서브젝트에서 한다. 설정 내용을 변경하여 KQCAMS의 몇 가지 동작을 사용자의 요구에 맞게 조정할 수 있다.

환경설정 항목에 대한 자세한 내용은 OpenFrame Batch "환경설정 안내서"를 참고한다.

[참고]

다음은 KQCAMS의 명령 중에서 실제 기능은 하지 않으나 에러가 발생하지 않도록 처리되는 파라미터에 대한 표이다.

명령어 파라미터

ALTER

[ACCOUNT(account–info)]

[ADDVOLUMES(volser[ volser…​])]

[BUFFERSPACE(size)]

[BUFND(number)]

[BUFNI(number)]

[BWO(TYPECICS|TYPEIMS|NO)]

[CCSID(value)]

[CODE(code)]

[ECSHARING|NOECSHARING]

[ERASE|NOERASE]

[EXCEPTIONEXIT(entrypoint)]

[FILEDATA(TEXT|BINARY)]

[FREESPACE(CI-percent[ CA-percent])]

[FRLOG(NONE[ REDO])]

[INHIBIT|UNINHIBIT]

[KEYS(length offset)]

[LOCK|UNLOCK]

[LOG(NONE|UNDO|ALL)]

[LOGSTREAMID(logstream)]

[MANAGEMENTCLASS(class)] [NULLIFY( [AUTHORIZATION(MODULE|STRING)] [BWO] [CODE] [EXCEPTIONEXIT] [LOG] [LOGSTREAMID]

[RECORDSIZE(average maximum)]

[REMOVEVOLUMES(volser[ volser…​])]

[REUSE|NOREUSE]

[ROLLIN]

[SHAREOPTIONS(crossregion[ crosssystem])]

[STORAGECLASS(class)]

[STRNO(number)]

[TYPE(LINEAR)]

[UNIQUEKEY|NONUNIQUEKEY]

[UPDATE|NOUPDATE]

[UPGRADE|NOUPGRADE]

[WRITECHECK|NOWRITECHECK]

BLDINDEX

[{EXTERNALSORT|INTERNALSORT}]

[{SORTCALL|NOSORTCALL}]

[SORTDEVICETYPE(device type)]

[SORTFILENUMBER(number)]

[SORTMESSAGEDD(fdname)]

[SORTMESSAGELEVEL({ALL|CRITICAL|NONE})]

[WORKFILES(fdname[ fdname…​])

DEFINE command

[ACCOUNT(account–info)]

[BUFFERSPACE(size)]

[BWO(TYPECICS|TYPEIMS|NO)]

[ERASE|NOERASE]

[EXCEPTIONEXIT(entrypoint)]

[FILE(fdname)]

[FREESPACE(CI-percent[ CA-percent])]

[FRLOG(NONE[| REDO])]

[LOG(NONE|UNDO|ALL)]

[LOGSTREAMID(logstream)]

[MODEL(entryname[ catname])]

[REUSE|NOREUSE]

[SHAREOPTIONS(crossregion[ crosssystem])]

[SPEED|RECOVERY]

[WRITECHECK|NOWRITECHECK])

[CYLINDERS(primary[secodnary])]

[KILOBYTES(primary[secodnary])]

[MEGABYTES(primary[secodnary])]

[RECORDS(primary[secodnary])]

[TRACKS(primary[secodnary])]

[CONTROLINTERVALSIZE(size)]

DELETE

[LIBRARYENTRY|NVR|PAGESPACE|VOLUMEENTRY|VVR]

[ERASE|NOERASE]

[FORCE|NOFORCE]

[PURGE|NOPURGE]

[RECOVERY|NORECOVERY]

[SCRATCH|NOSCRATCH]

EXPORT

[CIMODE|RECORDMODE]

[ERASE|NOERASE]

[INHIBITSOURCE|NOINHIBITSOURCE]

[INHIBITTARGET|NOINHIBITTARGET]

[PURGE|NOPURGE]

[TEMPORARY|PERMANENT]

IMPORT

[ALIAS|NOALIAS]

[ERASE|NOERASE]

[LOCK|UNLOCK]

[OBJECTS ([FILE(fdname)])]

[PURGE|NOPURGE]

[SAVRAC|NOSAVRAC]

LISTCAT

[LIBRARYENTRIES(libent)]

[PAGESPACE]

[VOLUMEENTRIES(volent)]

[EXPIRATION(days)]

[FILE(fdname)]

[LIBRARY(libname)]

[OUTFILE(fdname)]

PRINT

[DBCS]

[INSERTSHIFT((offset1 offset2)[(offset1 offset2 )…​])|INSERTALL]

[SKIPDBCSCHECK((offset1 offset2) [(offset1 offset2)…​])|NODBCSCHECK]

REPRO

[DBCS]

[ERRORLIMIT(value)]

[FILE(fdname)]

[INSERTSHIFT((offset1 offset2)[(offset1 offset2 )…​])| INSERTALL]

[SKIPDBCSCHECK((offset1 offset2)[(offset1 offset2 )…​])|NODBCSCHECK]

[VOLUMEENTRIES(entryname)]
[ENCIPHER({EXTERNALKEYNAME(keyname)\
INTERNALKEYNAME(keyname)|PRIVATEKEY}
[CIPHERUNIT(number|1)]
[DATAKEYFILE(fdname)|DATAKEYVALUE(value)]
[SHIPKEYNAMES(keyname[ keyname…​])]
[STOREDATAKEY|NOSTOREDATAKEY]
[STOREKEYNAME(keyname)]
[USERDATA(value)])]

[DECIPHER({DATAKEYFILE(fdname) |
DATAKEYVALUE(value)|SYSTEMKEY} [SYSTEMDATAKEY(value)]
[SYSTEMKEYNAME(keyname)])]

 

DEFINE 서브 명령어의 경우 다음과 같다.

서브 명령어 파라미터

ALIAS

(SYMBOLICRELATE(entryname))

ALTERNATEINDEX

(BUFFERSPACE(size)]

[ERASE|NOERASE]

[EXCEPTIONEXIT(entrypoint)]

[FREESPACE(CI-percent[ CA-percent]| 0 0)]

[{KEYRANGES|KEYRANGE|KEYRNG|KRNG}((lowkey highkey)[__(lowkey highkey)…​])]

[MODEL(entryname[ catname])]

[REUSE|NOREUSE]

[SHAREOPTIONS(crossregion[ crosssystem]| 1 3)]

[SPEED|RECOVERY]

[WRITECHECK|NOWRITECHECK])

[DATA ([ATTEMPTS(number)]
[AUTHORIZATION(entrypoint[ string])]
[BUFFERSPACE(size)]
[CODE(code)]
[ERASE|NOERASE]
[EXCEPTIONEXIT(entrypoint)]
[FREESPACE(CI-percent[ CA-percent])]
[{KEYRANGES|KEYRANGE|KEYRNG|KRNG}((lowkey highkey) [(lowkey highkey)…​ ])]
[MODEL(entryname [ catname ])]
[REUSE|NOREUSE]
[SHAREOPTIONS(crossregion[ crosssystem])]
[SPEED|RECOVERY]
[WRITECHECK|NOWRITECHECK])]

[INDEX ([ATTEMPTS(number)]
[AUTHORIZATION(entrypoint[ string])]
[CODE(code)]
[EXCEPTIONEXIT(entrypoint)]
[MODEL(entryname[ catname ])]
[REUSE|NOREUSE]
[SHAREOPTIONS(crossregion[ crosssystem])]
[WRITECHECK|NOWRITECHECK])]

CLUSTER

([ACCOUNT(account–info)]

[BUFFERSPACE(size)]

[BWO(TYPECICS|TYPEIMS|NO)]

[ERASE|NOERASE]

[EXCEPTIONEXIT(entrypoint)]

[FREESPACE(CI-percent[ CA-percent]|0 0)]

[FRLOG(NONE[| REDO])]

[LOG(NONE|UNDO|ALL)]

[LOGSTREAMID(logstream)]

[{KEYRANGES|KEYRANGE|KEYRNG|KRNG}((lowkey highkey)[(lowkey highkey)…​])]

[MODEL(entryname[ catname])]

[REUSE|NOREUSE]

[SHAREOPTIONS(crossregion[ crosssystem]|1 3)]

[SPEED|RECOVERY]

[WRITECHECK|NOWRITECHECK])

[DATA ([BUFFERSPACE(size)]
[ERASE|NOERASE]
[EXCEPTIONEXIT(entrypoint)]
[FREESPACE(CI-percent[ CA-percent])]
[{KEYRANGES|KEYRANGE|KEYRNG|KRNG}((lowkey highkey) [(lowkey highkey)…​ ])]
[MODEL(entryname [ catname ])]
[REUSE|NOREUSE]
[SHAREOPTIONS(crossregion[ crosssystem])]
[SPEED|RECOVERY]
[WRITECHECK|NOWRITECHECK])]

[INDEX ([EXCEPTIONEXIT(entrypoint)]
[MODEL(entryname[ catname ])]
[REUSE|NOREUSE]
[SHAREOPTIONS(crossregion[ crosssystem])]
[WRITECHECK|NOWRITECHECK])]

GENERATIONDATAGROUP

([SCRATCH|NOSCRATCH])

NONVSAM

([COLLECTION]

[FILESEQUENCENUMBERS(number[ number…​])])

PATH

([MODEL(entryname[ catname])])

USERCATALOG

([BUFFERSPACE(size|3072)]

[BUFND(number)]

[BUFNI(number)]

[ECSHARING|NOECSHARING]

[FREESPACE(CI-percent[ CA-percent]|0 0)]

[ICFCATALOG|VOLCATALOG]

[LOCK|UNLOCK]

[MODEL(entryname[ catname])]

[SHAREOPTIONS(crossregion[crosssystem]| 3 4)]

[STRNO(number|2)]

[WRITECHECK|NOWRITECHECK])

[DATA ([BUFFERSPACE(size)] [BUFND(number)] [FREESPACE(CI-percent[ CA-percent])] [WRITECHECK|NOWRITECHECK])]

[INDEX ([BUFNI(number)] [WRITECHECK|NOWRITECHECK])]

[비교연산자]

다음은 IF-THEN-ELSE 명령어의 operator 항목에서 쓰이는 비교연산자에 대한 표이다.

연산자 부호 의미

EQ

=

같다.

LE

<=

작거나 같다.

LT

<

작다.

GT

>

크다.

GE

>=

크거나 같다.

NE

!=

같지 않다.

11.6. 유의사항

컨디션 코드 (Condition Code)는 KQCAMS가 각각의 명령을 실행한 결과가 정상인지 아니면 명령실행 중에 에러가 발생했는지를 나타내는 일종의 에러코드이다. 발생 가능한 컨디션 코드는 10, 20, 30, 40, 50이고 큰 값일 수록 명령 실행에 중대한 문제가 있었음을 나타낸다.

각 컨디션 코드 값에 대한 설명은 다음과 같다.

코드 의미

10

명령을 정상적으로 처리한 경우 반환되는 코드이며 일부 정보성 메시지가 출력될 수 있다.

20

명령이 완벽하게 처리되지 않았지만 이를 무시하고 추가적인 명령을 수행해도 영구적으로 에러를 발생시키지 않을 것이라고 판단되는 상태로, 추가적인 명령의 수행이 가능하며 경고성 메시지가 함께 출력된다.

예를 들어 LISCAT 명령이 실행될 때 사용자가 지정한 카탈로그 엔트리가 존재하지 않는 경우 컨디션 코드는 20으로 설정되고 다음 메시지가 출력된다.

KQCAMS: No specified catalog entry found: NOT.EXIST.SDS

30

명령이 의미하는 동작의 일부를 수행하지 않았지만 결과적으로 사용자가 원하는 상태와 동일한 결과로 귀결되는 경우에 해당하는 상태로 추가적인 명령의 수행이 가능하다.

예를 들어 DELETE 명령에 지정한 데이터 셋이 존재하지 않는 경우 실제로 DELETE 명령의 완전한 실행은 수행되지 않았지만 결과적으로 지정한 데이터 셋이 없다는 상태는 동일하게 된다. 이 경우 추가적인 명령의 실행에 문제는 없으므로 컨디션 코드는 30으로 설정되고 경고성 메시지가 출력된다.

KQCAMS(WARNING): No such catalog entry - 'NOT.EXIST.SDS'

40

명령의 수행 과정 중 에러가 있어서 꼭 수행되어야 하는 동작이나 기능을 완료할 수 없는 경우에 발생한다. 이러한 에러(logical error)는 동시에 지정할 수 없는 논리적으로 불일치하는 파라미터를 지정하는 경우이거나 꼭 지정되어야 하는 필수 파라미터가 생략된 경우 혹은 데이터 셋의 키 길이, 레코드 크기 등으로 지정한 값이 올바르지 않을 때 발생한다.

이러한 상황이 발생한 경우 컨디션 코드는 40으로 설정되고 에러 메시지가 출력된다.

KQCAMS(ERROR): {error description or logical error code}

50

현재 명령을 수행하는 과정에서 심각한 에러가 발생하여 사용자가 지정한 나머지 명령을 실행할 수 없는 경우에 반환되는 컨디션 코드 값이다.

다음과 같은 경우에 해당 코드가 발생한다.

  • KQCAMS의 실행 로그를 사용할 수 없는 경우

    출력 메시지가 저장될 출력 데이터 셋을 사용할 수 없는 경우 컨디션 코드 50이 발생한다. 예를 들어 SYSPRINT FD를 열지 못한 경우 KQCAMS는 더 이상의 실행하지 않고 바로 종료한다.

  • KQCAMS 명령을 잘못 코딩한 경우

    IF-THEN-ELSE 문을 잘못 코딩하거나 여러 라인에 걸쳐서 명령을 코딩할 때 하이픈(-)을 적절히 사용하지 않은 경우에 발생한다.

  • 시스템 데이터 셋이 망가진 경우

    BCS나 VVDS의 내용에 오류가 존재해서 명령을 수행할 수 없는 경우이며, SYSPRINT FD를 사용할 수 있는 경우라면 다음과 같은 에러 메시지가 출력된다.

    KQCAMS(ERROR): {error description or logical error code} 또는 KQCAMS(FATAL): {error description}
조건 코드 변수명 (LASTCC와 MAXCC)

KQCAMS는 LASTCC 및 MAXCC라는 변수에 컨디션 코드 값을 저장한다.

LASTCC에는 최근 실행한 명령의 컨디션 코드가 저장되고, MAXCC에는 기존에 발생한 컨디션 코드 중에서 가장 큰 값이 저장된다. LASTCC 및 MAXCC는 SET 명령을 이용해서 사용자가 직접 설정할 수 있다.

다음은 NOT.EXIST.SDS 데이터 셋을 삭제한 후 LASTCC의 값이 30이면 강제적으로 MAXCC를 10으로 설정하는 예이다.

DELETE NOT.EXIST.SDS
IF LASTCC = 30 THEN SET MAXCC=10
DEFINE ...