데이터 셋 유틸리티
본 장에서는 데이터 셋 유틸리티에 대해 기술한다.
1. 개요
다음은 데이터 셋 유틸리티 목록이다. 각 유틸리티에 대한 설명은 해당 절에서 자세하게 기술한다.
프로그램명 | 설명 |
---|---|
IBM Mainframe MVS 환경에서 제공하는 DFSMSdss의 기능들을 JCL에서 호출하려는 경우 사용하는 유틸리티 프로그램이다. |
|
SMF 데이터 셋에 존재하는 CICS 로그 데이터를 조회 및 처리하는 유틸리티 프로그램이다. |
|
VSAM과 Non-VSAM 데이터 셋 및 카탈로그 정보를 생성하고 관리하는 유틸리티 프로그램이다. |
|
2개의 SDS나 PDS를 비교조건을 통해 비교 후 그 결과를 출력하는 유틸리티 프로그램이다. |
|
1개 이상의 PDS에 대해서 멤버들을 전체 또는 일부만 복사하거나 병합하는 유틸리티 프로그램이다. |
|
테스트 데이터 셋을 생성하는 유틸리티 프로그램이다. |
|
JOB 스트림 데이터 셋을 작성하거나 편집하는 유틸리티 프로그램이다. |
|
순차 데이터 셋 또는 PDS의 멤버를 복사하는 유틸리티 프로그램이다. |
|
순차 데이터 셋이나 PDS의 전체 또는 일부를 실제 출력할 형식으로 데이터를 생성하는 유틸리티 프로그램이다. |
|
리소스(애플리케이션 소스, JCL 소스 등)를 신규 생성, 갱신, 복사하는 유틸리티 프로그램이다. |
|
PDS의 데이터 셋 정보와 멤버 리스트 또는 볼륨 정보와 볼륨에 포함된 데이터 셋 리스트를 제공하는 유틸리티 프로그램이다. |
|
2개의 SDS나 PDS를 비교조건을 통해 비교 후 그 결과를 출력하는 유틸리티 프로그램이다. |
|
SMF 데이터 셋을 일반 데이터 셋으로 DUMP하거나 내용을 초기화하는 유틸리티 프로그램이다. |
2. ADRDSSU
ADRDSSU 유틸리티는 IBM Mainframe MVS 환경에서 제공하는 DFSMSdss의 기능들을 JCL에서 호출하려는 경우 사용하는 유틸리티 프로그램이다.
ADRDSSU 유틸리티는 COPY, DUMP, RESTORE, CONVERT, DEFRAG 등의 다양한 명령어를 제공하는데 OpenFrame에서는 이 중 가장 빈번하게 사용되는 DUMP와 RESTORE, COPY 명령어만 지원하고 있다. DUMP와 RESTORE 명령은 주로 천재지변에 의한 시스템 손상의 대비나 중요한 데이터의 보호 등의 목적을 위해 데이터셋이나 볼륨의 백업 및 복원 목적으로 사용되며, COPY는 다른 이름으로 데이터셋을 복사하고자 할 때 사용한다.
DUMP 명령은 JCL의 컨트롤 문장에서 기술한 데이터셋이나 볼륨을 하나의 데이터셋으로 묶어 지정된 볼륨 디렉터리에 저장하고, RESTORE 명령은 DUMP 처리한 데이터셋을 원래의 상태로 풀어서 지정한 볼륨 디렉터리에 복원시킨다. 이때 내부적으로는 UNIX에서 제공하는 tar 프로그램을 사용한다.
OpenFrame에서는 DUMP 명령을 처리할 때 DUMP 대상 데이터셋의 카탈로그 정보를 별도의 메타정보 파일로 구성하여 DUMP 대상 데이터셋과 함께 묶어두며, RESTORE 명령을 처리할 때 이 메타정보 파일을 먼저 읽어 DUMP 처리 당시의 카탈로그 정보로 복원시킨다.
COPY 명령은 대상이 되는 데이터셋을 지정된 다른 데이터셋 이름으로 변경하여 복사하는데 사용한다. OpenFrame의 ADRDSSU는 현재 VSAM에 대해서만 지원한다.
|
다음은 일반적인 DUMP 처리 과정을 나타낸 순서도이다.
다음은 일반적인 RESTORE 처리 과정을 나타낸 순서도이다.
2.1. DD 설정
COPY, DUMP와 RESTORE의 DD 설정 항목은 다음과 같다.
-
COPY
항목 설명 SYSIN DD
COPY 명령어와 그와 관련된 옵션들을 기술한다.
-
DUMP
항목 설명 SYSIN DD
DUMP 명령어와 그와 관련된 옵션들을 기술한다.
INDD를 위한 DD
SYSIN DD에 기술한 컨트롤 문장 중 INDD 문으로 지정한 DD 이름과 같으며 DUMP 대상 데이터셋들의 볼륨정보가 기술된 DD이다. DUMP 대상 데이터셋이 카탈로그에 등록되어 있고 컨트롤 문장에서 INDD 문을 기술하지 않은 경우에는 생략이 가능하다.
OUTDD를 위한 DD
SYSIN DD에 기술한 컨트롤 문장 중 OUTDD 문으로 지정한 DD 이름과 같으며 새로 생성할 DUMP 데이터셋의 정보가 기술된 DD이다. 해당 DD에 DUMMY 문장을 기술한 경우는 DUMP 처리가 생략된다. OUTDD의 RECFM은 일반적으로 ‘U’로 설정한다.
다음은 데이터셋 레코드 포맷(RECFM)에 대한 설명이다.
-
F(Fixed) : 레코드 길이가 고정된 포맷이다.
-
FB(Fixed Blocked) : 레코드 길이가 고정된 포맷이면서 블록을 이룬 형식이다.
-
V(Variable) : 레코드 길이가 가변적인 포맷이다. 4Byte의 가변길이 정보를 포함한다.
-
VB(Variable Blocked) : 레코드 길이가 고정되지 않으면서 블록을 이룬 형식이다.
-
U(Undefined) : 레코드 형태를 정의할 수 없는 형식이다.
-
-
RESTORE
항목 설명 SYSIN DD
RESTORE 명령어와 그와 관련된 옵션들을 기술한다.
INDD를 위한 DD
SYSIN DD에 기술한 컨트롤 문장 중 INDD 문으로 지정한 DD 이름과 같으며 복원 대상 DUMP 데이터셋이 기술된 DD이다.
OUTDD를 위한 DD
SYSIN DD에 기술한 컨트롤 문장 중 OUTDD 문으로 지정한 DD 이름과 같으며 복원된 데이터셋을 어느 볼륨에 저장할 것인지 지정한다.
OUTDD를 위한 DD는 하나 이상 기술할 수 있으며 해당 DD에서는 DSN(Data Set Name)을 기술하지 않는다.
2.2. 명령어 설정
본 절에서는 ADRDSSU에서 설정 가능한 명령어에 대해 설명한다.
다음은 ADRDSSU에서 지원하는 명령어에 대한 옵션 약어 목록이다.
명령어 | 옵션(축약명) |
---|---|
COPY |
DATASET (DS) |
RENAMEU (RENUNC) |
|
SHARE (SHA, SHR) |
|
TOLERATE (TOL) |
|
DUMP |
ALLDATA (ALLD) |
ALLEXCP (ALLE) |
|
ALLMULTI (ALLM) |
|
DATASET (DS) |
|
DELETE (DEL) |
|
ENQFAILURE (ENQ) |
|
INCLUDE (INC) |
|
INDDNAME (INDD, IDD) |
|
INDYNAM (INDY, IDY) |
|
LOGINDDNAME (LOGINDD, LIDD) |
|
LOGINDYNAM (LOGINDY, LIDY) |
|
OUTDDNAME (OUTDD, ODD) |
|
PURGE (PUR, PRG) |
|
SHARE (SHA, SHR) |
|
TOLERATE (TOL) |
|
COMPRESS (COM) |
|
OPTIMIZE (OPT) |
|
RESTORE |
DATASET (DS) |
ENQFAILURE (ENQ) |
|
INDDNAME (INDD, IDD) |
|
OUTDDNAME (OUTDD, ODD) |
|
RENAME (REN) |
|
RENAMEU (RENUNC) |
|
REPLACE (REP) |
|
SHARE (SHA, SHR) |
|
TOLERATE (TOL) |
COPY
지정한 데이터셋을 다른 이름의 데이터셋으로 복사한다. COPY 명령어는 현재 VSAM 데이터셋에 대해서만 사용할 수 있다.
COPY 명령어 구문은 다음과 같다.
COPY DATASET(INCLUDE(DSNAME,…) [RENAMEU((OLD DATASET NAME,NEW DATASET NAME),…)] [SHARE] [SPHERE] [TOL(ENQF)] [WAIT(간격시간, 시도횟수)]
항목 | 설명 |
---|---|
DATASET |
COPY 대상 데이터셋을 지정하려는 경우 기술한다. |
INCLUDE |
DUMP 처리된 데이터셋에서 COPY할 데이터셋 이름을 하나 이상 기술한다. 와일드 카드 문자를 이용하여 COPY 대상 데이터셋을 필터링한다. 자세한 내용은 [와일드카드 문자]의 와일드 카드 문자 필터링 예제를 참고한다. |
RENAMEU |
INCLUDE 문에서 지정한 데이터셋 이름을 새로운 데이터셋 이름으로 변경하여 복원 처리한다. 이때 변경 전 이름을 가진 데이터셋이 이미 존재하는 경우에만 새로운 이름으로 변경하여 복원 처리하고 변경 전 이름의 데이터셋이 존재하지 않을 경우 변경 전 이름 그대로 복원 처리한다. VSAM 데이터셋에 대해서는 동작하지 않는다. |
SHARE |
COPY 대상 데이터셋에 접근할 때 Shared Lock을 실행시킨다. 지정하지 않을 경우 기본값인 Exclusive Lock이 실행된다. |
SPHERE |
대상이 되는 데이터셋과 카탈로그 상 Association 관계에 있는 데이터셋에 대해서도 COPY를 수행한다. |
TOL |
REPLACE 문을 지정한 경우 이미 존재하는 COPY 대상 데이터셋에 대한 Shared나 Exclusive Lock이 실패한 경우라도 처리를 계속 진행한다. 데이터 정합성 유지를 위해서는 권장하지 않는 옵션이다. |
WAIT |
COPY 문을 지정한 경우 이미 존재하는 COPY 대상 데이터셋에 Lock을 실행시키기 위한 간격시간(초) 및 시도횟수를 지정한다. WAIT(2,99)라고 지정하면 2초 간격으로 최대 99번까지 Locking을 시도한다. 지정하지 않을 경우 기본값인 WAIT(2,2)으로 처리되며 WAIT(0,0)으로 기술한 경우 기다리지 않고 즉시 처리한다. |
DUMP
하나 이상의 데이터셋이나 볼륨을 하나의 데이터셋으로 DUMP 처리하는 명령어이다.
DUMP 명령어 구문은 다음과 같다.
DUMP (DATASET(INCLUDE(DSNAME,…) [EXCLUDE(DSNAME,…)] | [FULL]) [BY(CREDT|EXPDT|REFDT,연산자,*,[-]일수)]) OUTDD(OUTDD NAME) [INDD(INDD NAME,…)] [INDY((VOLSER,UNIT),…)] [LIDD(LIDD NAME,…)] [LOGINDY((VOLSER,UNIT),…)] [ALLE] [ALLD(*)] [ALLM] [DELETE] [PURGE] [SHARE] [TOL(ENQF)] [WAIT(간격시간, 시도횟수)] [COMPRESS] [CAN]
항목 | 설명 |
---|---|
DATASET|FULL |
DUMP 대상 데이터셋을 지정하려는 경우 기술한다.
|
INCLUDE |
DUMP 대상 데이터셋 이름을 하나 이상 기술한다. 대상 데이터셋이 여러 개인 경우에 각각의 데이터셋의 구분은 콤마(,), 공백, 개행문자로 한다. 와일드 카드 문자를 사용하여 DUMP 대상 데이터셋 이름을 가지고 필터링을 할 수 있다. 자세한 내용은 [와일드카드 문자]의 와일드 카드 문자 필터링 예제를 참고한다. |
EXCLUDE |
DUMP 대상에서 제외할 데이터셋 이름을 하나 이상 기술한다. 와일드 카드 문자를 사용하여 DUMP 대상에서 제외할 데이터셋 이름을 가지고 필터링을 할 수 있다. 자세한 내용은 [와일드카드 문자]의 와일드 카드 문자 필터링 예제를 참고한다. 제외할 데이터셋이 여러 개인 경우에 각각의 데이터셋의 구분은 콤마(,), 공백, 개행문자로 한다. |
BY |
INCLUDE 문에서 지정한 데이터셋 중에서 BY 문으로 기술한 조건과 일치하는 데이터셋만 필터링하여 처리한다.
다음은 현재일로부터 최소 3일 이전에 생성된 데이터셋을 필터링하는 예이다. (CREDT,LE,*,-3) 또는 (REFDT,LE,*,-3) |
OUTDD |
새로 생성할 DUMP 데이터셋의 DD 이름을 기술한다. |
INDD |
DUMP 대상 볼륨의 DD 이름을 기술한다. 하나 이상의 DD 이름을 기술할 수 있으며 DUMP 대상 데이터셋의 지정없이 INDD만 기술한 경우 대상 볼륨에 속해 있는 모든 Non-VSAM 데이터셋을 DUMP 처리한다. |
INDY |
DUMP 대상 볼륨을 동적으로 지정한다. DUMP 대상 볼륨의 VOLSER과 UNIT 이름을 하나 이상 기술할 수 있다. |
LIDD |
Mainframe에서는 논리 DUMP 처리의 경우 LIDD 문으로 DUMP 대상 DD 이름을 기술하나 OpenFrame에서는 필요없는 개념이므로 INDD 문과 동일하게 처리한다. |
LOGINDY |
Mainframe에서는 논리 DUMP 처리의 경우 LOGINDY 문으로 처리 대상 볼륨의 VOLSER과 UNIT의 이름을 기술하나 OpenFrame에서는 필요없는 개념이므로 INDY 문과 동일하게 처리한다. |
ALLE |
OpenFrame에서는 필요없는 옵션으로 기술하더라도 무시된다. |
ALLD |
OpenFrame에서는 필요없는 옵션으로 기술하더라도 무시된다. |
ALLM |
OpenFrame에서는 필요없는 옵션으로 기술하더라도 무시된다. |
DELETE |
DUMP 처리가 성공적으로 끝난 데이터셋에 대해 삭제 처리한다. |
PURGE |
DELETE 문 기술 후 지정하는 옵션으로 OpenFrame에서는 무시된다. |
SHARE |
DUMP 대상 데이터셋에 접근할 때 Shared Lock을 실행시킨다. 지정하지 않을 경우 기본값인 Exclusive Lock이 설정된다. |
TOL |
DUMP 대상 데이터셋에 대한 Shared나 Exclusive Lock이 실패한 경우라도 처리를 계속 진행한다. 데이터 정합성 유지를 위해서는 권장하지 않는 옵션이다. |
WAIT |
DUMP 대상 데이터셋에 Lock을 실행시키기 위한 간격시간(초) 및 시도횟수를 지정한다. WAIT(2,99)로 지정하면 2초 간격으로 최대 99번까지 Locking을 시도한다. 지정하지 않을 경우 기본값인 WAIT(2,2)로 처리되며 WAIT(0,0)으로 기술한 경우 기다리지 않고 즉시 처리한다. |
COMPRESS |
OpenFrame에서는 필요없는 옵션으로 기술하더라도 무시된다. |
CAN |
OpenFrame에서는 기술하더라도 무시된다. |
[비교연산자]
다음은 DUMP 명령어의 BY 항목에서 쓰이는 비교연산자에 대한 표이다.
연산자 | 부호 | 의미 |
---|---|---|
EQ |
= |
같다. |
LE |
<= |
작거나 같다. |
LT |
< |
작다. |
GT |
> |
크다. |
GE |
>= |
크거나 같다. |
NE |
!= |
같지 않다. |
[와일드카드 문자]
INCLUDE 문에서 DUMP 또는 RESTORE 대상 데이터셋 이름에 대하여 와일드카드 문자를 이용한 필터링이 가능하다.
필터키 | 설명 |
---|---|
* (single asterisk) |
기본적으로 1개의 Qualifier와 매치한다. 또한 1개의 Qualifier 내의 0개 이상의 문자와 매치할 수 있다. |
** (double asterisk) |
0개 이상의 Qualifier와 매치한다. |
% (percent) |
Qualifier 내의 1개의 문자와 매치한다. |
Qualifier는 period(.) 사이에 기술된 수식어로 데이터셋 이름을 구성하는 요소를 말한다. 예를 들어 데이터셋 이름이 SYS.LIB인 경우 SYS1과 LIB이라는 2개의 Qualifier를 소유한다고 말한다.
와일드카드 문자를 이용한 필터링의 예는 다음과 같다.
필터링 데이터셋 | 필터링 대상 데이터셋 | 필터링 비대상 데이터셋 |
---|---|---|
SYS1.*.LIST |
SYS1.TEST.LIST, SYS1.LIB.LIST |
SYS.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 |
%.LIST |
A.LIST, B.LIST |
AA.LIST, BB.LIST, LIST |
USER%.* |
USER1.LIST, USERA.LIST |
USEROK.LIST, USER1.OK.LIST, USER.LIST |
*%%* |
AA, BB, TEST, USER |
A, B, TEST.USER |
|
[GDG 와일드카드 문자 필터링]
INCLUDE 문에서 DUMP 대상 데이터셋이 GDS인 경우 대하여 와일드카드 문자 필터링이 가능하다.
필터키 | 설명 |
---|---|
GDGdsn(0) |
현재 상대 세대 번호의 세대 데이터셋(GDS: Generation Data Set)과 매치된다. |
GDGdsn(*) |
세대 데이터 그룹(GDG: Generation Data Group)에서 관리하고 있는 모든 세대 데이터셋(GDS: Generation Data Set)와 매치된다. |
RESTORE
하나의 파일로 DUMP 처리된 데이터셋을 원래의 데이터셋으로 복원한다.
RESTORE 명령어 구문은 다음과 같다.
RESTORE DATASET(INCLUDE(DSNAME,…) [EXCLUDE(DSNAME,…)]) INDD(INDD NAME) OUTDD(OUTDD NAME,…) [RENAME((OLD DATASET NAME,NEW DATASET NAME),…)] [RENUNC((OLD DATASET NAME,NEW DATASET NAME),…)] [CATALOG] [REPLACE] [SHARE] [TOL(ENQF)] [WAIT(간격시간, 시도횟수)]
항목 | 설명 |
---|---|
DATASET |
RESTORE 대상 데이터셋을 지정하려는 경우 기술한다. |
INCLUDE |
DUMP 처리된 데이터셋에서 RESTORE할 데이터셋 이름을 하나 이상 기술한다. 와일드 카드 문자를 이용하여 RESTORE 대상 데이터셋을 필터링한다. 자세한 내용은 [와일드카드 문자]의 와일드 카드 문자 필터링 예제를 참고한다. |
EXCLUDE |
DUMP 처리된 데이터셋에서 RESTORE하지 않을 데이터셋 이름을 하나 이상 기술한다. 와일드 카드 문자를 이용하여 RESTORE 대상에서 제외할 데이터셋을 필터링한다. 자세한 내용은 [와일드카드 문자]의 와일드 카드 문자 필터링 예제를 참고한다. |
INDD |
DUMP 데이터셋을 지정한 DD 이름을 기술한다. |
OUTDD |
RESTORE 처리한 데이터셋을 저장할 출력 볼륨의 DD 이름을 기술한다. |
RENAME |
INCLUDE 문에서 지정한 데이터셋 이름을 새로운 데이터셋 이름으로 변경하여 복원 처리한다. 이때 변경 전 이름을 가진 데이터셋이 이미 존재하는 경우에만 새로운 이름으로 변경하여 복원 처리하고 변경 전 이름의 데이터셋이 존재하지 않을 경우 변경 전 이름 그대로 복원 처리한다. |
RENUNC |
INCLUDE 문에서 지정한 데이터셋 이름을 새로운 데이터셋 이름으로 변경하여 복원 처리한다. 변경 전 이름을 가진 데이터셋의 존재유무와 상관없이 무조건 새로운 이름으로 복원 처리한다는 점에서 RENAME 문과 다르다. |
CATALOG |
Mainframe에서는 논리 RESTORE 처리의 경우 지정하나 OpenFrame에서는 DUMP 처리 당시의 카탈로그정보로 등록하므로 무시한다. |
REPLACE |
RESTORE 대상 데이터셋이 이미 존재하는 경우 해당 데이터셋을 대체 처리한다. REPLACE 문을 지정할 때 이미 존재하는 데이터셋에 대한 검색 순서는 다음과 같다.
|
SHARE |
REPLACE 문을 지정한 경우 이미 존재하는 RESTORE 대상 데이터셋에 접근할 때 Shared Lock을 실행시킨다. 지정하지 않을 경우 기본값인 Exclusive Lock이 실행된다. |
TOL |
REPLACE 문을 지정한 경우 이미 존재하는 RESTORE 대상 데이터셋에 대한 Shared나 Exclusive Lock이 실패한 경우라도 처리를 계속 진행한다. 데이터 정합성 유지를 위해서는 권장하지 않는 옵션이다. |
WAIT |
REPLACE 문을 지정한 경우 이미 존재하는 RESTORE 대상 데이터셋에 Lock을 실행시키기 위한 간격시간(초) 및 시도횟수를 지정한다. WAIT(2,99)라고 지정하면 2초 간격으로 최대 99번까지 Locking을 시도한다. 지정하지 않을 경우 기본값인 WAIT(2,2)으로 처리되며 WAIT(0,0)으로 기술한 경우 기다리지 않고 즉시 처리한다. |
IF-THEN-ELSE
ADRDSSU 유틸리티의 명령어를 처리하고 IF-THEN-ELSE 문을 통해 명령어 처리 후 반환된 코드를 비교하여 논리적인 후속처리가 가능하다. 중첩된 IF 문도 기술 가능하며 조건 분기 후 명령어는 현재 WTO 명령어만 지원하고 있다.
IF-THEN-ELSE 명령어 구문은 다음과 같다.
IF {Condition Code} {operator} {number} THEN [command|DO command set END] [ELSE [command|DO command set END]]
IF 조건에서는 다음 변수명의 값과 비교 가능하다.
변수명 | 설명 |
---|---|
LASTCC |
명령어 처리 중 반환된 최종 반환코드를 의미한다. |
MAXCC |
명령어 처리 중 발생한 가장 값이 큰 반환코드를 의미한다. |
조건 비교에서 사용하는 Operator에 대한 자세한 내용은 비교연산자의 표를 참고한다.
다음은 IF-THEN-ELSE 명령어를 기술한 컨트롤 문장의 사용 예이다.
DUMP INDD(IN) OUTDD(OUT) DELETE – DATASET(INCLUDE(TEST.DATASET.**) BY (CREDT,LT,*,1) ) – IF MAXCC > 4 – THEN DO – WTO ‘* DATA SETS DELETE FAILURE *’- END
위 예제의 경우 MAXCC가 4보다 큰 경우 WTO 명령을 통해 시스템 콘솔로 메시지를 보낸다.
WTO
WTO는 시스템 운영자의 시스템 콘솔로 메시지를 보내기 위한 명령어이다. 송신한 메시지를 확인하기 위해서는 ADRDSSU 유틸리티를 실행하기 전에 tconmgr를 기동해야 한다. tconmgr는 OpenFrame Batch "Batch 안내서"를 참고한다.
WTO 명령어 구문은 다음과 같다.
WTO ‘message’
항목 | 설명 |
---|---|
message |
시스템 콘솔로 전송할 메시지를 지정한다. |
2.3. 사용예제
다음은 여러 개의 데이터셋을 DUMP 기능을 이용하여 하나의 데이터셋으로 묶어 DUMP 처리하는 예이다. ADRDSSU.TEST01, ADRDSSU.TEST02, ADRDSSU.TEST03 데이터셋을 OUTDD에서 기술한 데이터셋 ADRDSSU.DUMPED.DS로 묶어 DUMP 처리한다.
//********************************************************************* //*** ADRDSSU LOGICAL DUMP *** //********************************************************************* //ADRDUM01 JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JS010 EXEC PGM=ADRDSSU //OUTDD DD DSN=ADRDSSU.DUMPED.DS,UNIT=3380,DISP=(NEW,CATLG,DELETE) //SYSIN DD * DUMP DATASET(INCLUDE(ADRDSSU.TEST01, - ADRDSSU.TEST02, - ADRDSSU.TEST03)) - OUTDD(OUTDD) /* //SYSPRINT DD SYSOUT=* *
다음은 여러 개의 Non-VSAM 데이터셋을 DUMP 기능을 이용하여 하나의 데이터셋으로 묶어 DUMP 처리한 후 DUMP된 데이터셋을 모두 삭제하는 예이다.
ADRDSSU.TEST01, ADRDSSU.TEST02, ADRDSSU.TEST03 데이터셋을 OUTDD에서 기술한 데이터셋 ADRDSSU.DUMPED.DS로 묶어 DUMP 처리하고 해당 데이터셋들을 모두 삭제한다.
//********************************************************************* //*** ADRDSSU LOGICAL DUMP AND DELETE *** //********************************************************************* //ADRDUM01 JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JS010 EXEC PGM=ADRDSSU //OUTDD DD DSN=ADRDSSU.DUMPED.DS,UNIT=3380,DISP=(NEW,CATLG,DELETE) //SYSIN DD * DUMP DATASET(INCLUDE(ADRDSSU.TEST01, - ADRDSSU.TEST02, - ADRDSSU.TEST03)) - OUTDD(OUTDD) - ALLE ALLD(*) - DEL PURGE – TOL(ENQF) - WAIT(2,99) - SHARE /* //SYSPRINT DD SYSOUT=*
다음은 INCLUDE 문에서 와일드 카드 문자를 기술하여 해당 조건에 일치하는 이름을 가진 데이터셋들만 묶어 DUMP 처리하는 예이다.
첫 번째 Qualifier가 ‘ADRTEST’인 데이터셋들만 DUMP 처리한다.
//********************************************************************* //*** ADRDSSU LOGICAL DUMP WITH DATA SET NAME FILTERRING *** //********************************************************************* //ADRDUM01 JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JS010 EXEC PGM=ADRDSSU //OUTDD DD DSN=ADRDSSU.DUMPED.DS,UNIT=3380,DISP=(NEW,CATLG,DELETE) //SYSIN DD * DUMP DATASET( INCLUDE(ADRTEST.**) ) - OUTDD(OUTDD) /* //SYSPRINT DD SYSOUT=*
다음은 INCLUDE 문에서 와일드 카드 문자를 기술하여 해당 조건에 일치하는 이름을 가진 데이터셋들 중 BY 조건에 해당하는 경우만 DUMP 처리하는 예이다.
첫 번째 Qualifier가 ‘ADRTEST’이고 2번째 Qualifier가 'TEST’로 시작하는 데이터셋 중 생성일자가 현재일로부터 하루 전날 이후인 경우만 DUMP 처리한다.
//********************************************************************* //*** ADRDSSU LOGICAL DUMP WITH ‘BY’ FILTERING *** //********************************************************************* //ADRDUM01 JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JS010 EXEC PGM=ADRDSSU //OUTDD DD DSN=ADRDSSU.DUMPED.DS,UNIT=3380,DISP=(NEW,CATLG,DELETE) //SYSIN DD * DUMP DATASET( INCLUDE(ADRTEST.TEST*) BY (CREDT,GT,*,-1) ) - OUTDD(OUTDD) //SYSPRINT DD SYSOUT=*
다음은 INDD 문에서 지정한 볼륨에 속해 있는 모든 Non-VSAM 데이터셋을 DUMP 처리하는 예이다.
INDD에서 지정한 볼륨 시리얼 ‘200000’에 속해 있는 모든 Non-VSAM 데이터들을 묶어 DUMP 처리한다.
//********************************************************************* //*** ADRDSSU PHYSICAL DUMP *** //********************************************************************* //ADRDUM01 JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JS010 EXEC PGM=ADRDSSU //INDD1 DD UNIT=SYSDA,DISP=SHR,VOL=SER=200000 //OUTDD DD DSN=ADRDSSU.DUMPED.DS,UNIT=3380,DISP=(NEW,CATLG,DELETE) //SYSIN DD * DUMP INDD(INDD1) OUTDD(OUTDD) //SYSPRINT DD SYSOUT=*
다음은 DUMP된 데이터셋을 Non-VSAM 데이터셋으로 복원하는 예이다.
ADRDSSU.TEST01, ADRDSSU.TEST02, ADRDSSU.TEST03 데이터셋을 DUMP 데이터셋에서 풀어 복원한다.
//********************************************************************* //*** ADRDSSU LOGICAL RESOTRE *** //********************************************************************* //ADRRES1 JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JS010 EXEC PGM=ADRDSSU //INDD DD DSN=ADRDSSU.DUMPED.DS,DISP=OLD //DASD1 DD VOL=SER=100000,UNIT=3380,DISP=OLD //SYSIN DD * RESTORE DATASET(INCLUDE(ADRDSSU.TEST01, - ADRDSSU.TEST02, - ADRDSSU.TEST03)) - CATALOG - INDD(INDD) - OUTDD(DASD1) /* //SYSPRINT DD SYSOUT=*
다음은 DUMP된 데이터셋을 새로운 이름의 데이터셋으로 RESTORE하는 예이다.
ADRDSSU.TEST01, ADRDSSU.TEST02, ADRDSSU.TEST03 데이터셋을 DUMP 데이터셋에서 풀어서 ADRDSSU.TEST01.NEW, ADRDSSU.TEST02.NEW, ADRDSSU.TEST03.NEW의 새로운 이름으로 각각 복원한다.
//********************************************************************* //*** ADRDSSU LOGICAL RESOTRE AND RENAME *** //********************************************************************* //ADRRES1 JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JS010 EXEC PGM=ADRDSSU //INDD DD DSN=ADRDSSU.DUMPED.DS,DISP=OLD //DASD1 DD VOL=SER=100000,UNIT=3380,DISP=OLD //SYSIN DD * RESTORE DATASET(INCLUDE(ADRDSSU.TEST01, - ADRDSSU.TEST02, - ADRDSSU.TEST03)) - RENUNC((ADRDSSU.TEST01,ADRDSSU.TEST01.NEW ), - (ADRDSSU.TEST02,ADRDSSU.TEST02.NEW ), - (ADRDSSU.TEST03,ADRDSSU.TEST03.NEW )) - CATALOG - INDD(INDD) - OUTDD(DASD1) /* //SYSPRINT DD SYSOUT=*
다음은 DUMP된 데이터셋들을 모두 RESTORE하는 예이다. ADRDSSU.DUMPED.DS 데이터셋에 들어 있는 모든 DUMP된 데이터셋을 각각의 이름으로 복원한다.
//********************************************************************* //*** ADRDSSU PHYSICAL RESOTRE *** //********************************************************************* //ADRRES1 JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JS010 EXEC PGM=ADRDSSU //INDD DD DSN=ADRDSSU.DUMPED.DS,DISP=OLD //DASD1 DD VOL=SER=100000,UNIT=3380,DISP=OLD //SYSIN DD * RESTORE INDDNAME(INDD) OUTDDNAME(DASD1) - DATASET(INCLUDE(**)) /* //SYSPRINT DD SYSOUT=*
다음은 데이터셋을 COPY하는 예이다. ADRDSSU.TEST01을 ADRDSSU.TEST01.NEW로 복사한다.
//********************************************************************* //*** ADRDSSU PHYSICAL COPY *** //********************************************************************* //ADRRES1 JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JS010 EXEC PGM=ADRDSSU //SYSIN DD * COPY DATASET(INCLUDE(ADRDSSU.TEST01)) - WAIT(0,0) SPHERE - RENAMEU(ADRDSSU.TEST01.NEW) /* //SYSPRINT DD SYSOUT=*
2.4. 관련 환경설정
VSAM에 대한 DUMP 기능은 Tibero에서 제공하는 유틸리티를 사용하여 구현되어 있다. Tibero 유틸리티를 활용할 정보를 OpenFrame 환경설정에 adrdssu 서브젝트, DUMP_VSAM 섹션에 설정하고 명령 실행 시 이 정보를 참조한다.
adrdssu 서브젝트의 설정방법은 OpenFrame Batch "환경설정 안내서"를 참고한다. |
2.5. 유의사항
OpenFrame에서 VSAM 형식의 데이터셋을 처리하기 위해서는 TSAM RDB를 사용해야 한다. ofconfig 툴을 통해 OpenFrame 환경설정 중 rc 서브젝트에서 반환코드 12 이상은 에러 처리되도록 지정한다.
ADRDSSU 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.
-
정상적으로 실행한 경우
애플리케이션에서 받은 코드를 반환한다.
-
에러가 발생한 경우
해당 에러 메시지를 SYSPRINT DD에 출력하고, 각 에러에 해당하는 코드를 반환한다.
ADRDSSU 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.
코드 설명 8
프로그램 수행 중 특정 데이터셋에서 에러가 발생하였으나 다른 데이터셋에 대한 처리는 정상적으로 수행한 경우이다.
12
Unrecoverable 유형의 에러로 에러가 발생하여 정상적으로 수행하지 않은 경우이다.
|
3. DFHJUP
SMF 데이터셋에 존재하는 CICS 로그 데이터를 조회 및 처리하는 유틸리티 프로그램이다. DFHJUP 시스템 유틸리티 프로그램으로 SMF 데이터셋 내의 CICS 로그 레코드를 여러 가지 조건으로 선택하여 결과물로 출력하거나, 다른 테이터 셋으로 복사할 수 있다.
유사한 유틸리티 프로그램으로는 IFASMFDP가 있다. |
3.1. DD 설정
DD 설정 항목은 다음과 같다.
항목 | 설명 |
---|---|
SYSPRINT DD |
DFHJUP에서 선택된 레코드 중 SYSPRINT로 출력하는 경우의 출력 데이터셋이다. |
SYSIN DD |
DFHJUP의 명령어를 지정한다. |
SYSUT1 DD |
DFHJUP의 기본 입력 데이터셋을 지정한다. CONTROL 문을 통해 다른 DD로 변경할 수 있다. |
SYSUT4 DD |
DFHJUP의 기본 출력 데이터셋을 지정한다. CONTROL 문을 통해 다른 DD로 변경할 수 있다. |
|
3.2. 명령어 설정
본 절에서는 DFHJUP에서 설정 가능한 명령어에 대해 설명한다.
CONTROL
입출력 데이터셋이 지정된 DD를 지정하거나, 입력 데이터셋의 처리 범위를 레코드 수 단위로 지정한다. CONTROL 명령어 구문 다음과 같다.
CONTROL CNTL [{SKIP|K}=0|number}] [,{STOPAFT|H}={EOF|number|(number,E)}] [,{DDNAME|D}={SYSUT1|ddname}] [,{DDNOUT|O}={SYSUT4|ddname}]
항목 | 설명 |
---|---|
SKIP|K |
입력 데이터셋의 처음부터 몇 개의 레코드를 무시할지 number로 지정한다. (기본값: 0) |
STOPAFT|H |
입력 데이터셋으로부터 읽어서 테스트할 최대 레코드 수를 number에 지정한다. (number,E)는 조건식을 만족한 레코드 수가 number에 도달할 때까지 진행하라는 의미이다. (기본값: EOF, 레코드 수와 무관하게 입력 파일 끝까지를 의미) |
DDNAME|D |
입력 데이터셋을 지정한 DD를 ddname에 기술한다. (기본값: SYSUT1) |
DDNOUT|O |
출력 데이터셋을 지정한 DD를 ddname에 기술한다. (기본값: SYSUT4) |
OPTION
레코드를 선택하는 조건을 기술한다. 각각의 OPTION 문에 기술된 선택 조건은 테스트라고 한다. 각각의 테스트는 기본적으로 OR 조건으로 처리된다. COND 구를 적절히 지정해 여러 개의 테스트를 AND 조건으로 묶어 사용할 수 있는데, 이는 테스트 시리즈라고 한다.
OPTION 명령어 구문은 다음과 같다.
OPTION {PRINT|COPY|NEGOF} [{OFFSET|O}={1|number}] [,{FLDTYP|T}={X|C}] [,{VALUE|V}=string] [,{FLDLEN|L}={1|number}] [,{COND|C}={E|M|T{Y|N}]
항목 | 설명 |
---|---|
모든 선택된 레코드가 SYSPRINT DD에 출력된다. |
|
COPY |
모든 선택된 레코드가 출력 데이터셋에 복사된다. PRTSYS를 이용해 이 레코드들이 SYSPRINT DD로도 출력되도록 할 수 있다. |
NEGOF |
OFFSET에 주어지는 값을 음수로 동작하게 하여 레코드 뒷부분부터의 offset을 지정한다. 선택된 레코드는 SYSPRINT DD로 출력된다. |
OFFSET|O |
검사할 레코드 필드의 첫 Byte 위치를 지정한다. (기본값: 1) NEGOF가 지정되었을 경우 레코드 끝부터의 Byte 수를 지정한다. |
FLDTYP|T |
VALUE로 주어지는 string의 타입을 지정한다. 선택 가능한 값은 다음과 같다.
|
VALUE|V |
지정된 레코드 필드와 비교할 값을 string에 적는다. Character 타입은 255자까지, Hexadecimal 타입은 510자까지 지정 가능하다. |
FLDLEN|L |
VALUE값과 비교할 레코드 필드의 길이를 지정한다. 기본값은 1이며, 255까지 지정할 수 있다. |
COND|C |
테스트의 타입과 다른 테스트 사이의 연관관계를 기술한다.
|
END
CONTROL 문의 종료를 의미한다. END 문은 다음과 같이 기술한다.
END
3.3. 사용예제
다음은 SYSUT1으로 주어진 SMF 데이터셋을 SYSUT4로 복사하는 예제이다.
//DFHJUP JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //STEP EXEC PGM=DFHJUP //SYSOUT DD SYSOUT=* //SYSUT1 DD DSN=SMLOG.CICSDATA,DISP=SHR //SYSUT4 DD DSN=SMF.CICSDUMP,DISP=NEW,DCB=LRECL=32760 //SYSIN DD * OPTION COPY END /* //
다음은 SYSUT1으로 주어진 SMF 데이터셋을 OPTION 문의 조건에 따라 선택해서 SYSPRINT로 출력하는 예제이다. 뒤에서부터 4번째 Byte의 값이 'E’인 레코드만이 선택된다.
//DFHJUP JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //STEP EXEC PGM=DFHJUP //SYSOUT DD SYSOUT=* //SYSUT1 DD DSN=SMLOG.CICSDATA,DISP=SHR //SYSUT4 DD DSN=SMF.CICSDUMP,DISP=NEW,DCB=LRECL=32760 //SYSPRINT DD DSN=SMF.CICSPRT,DISP=NEW,DCB=LRECL=32760 //SYSIN DD * OPTION NEGOF OFFSET=4,T=C,V=E END /* //
다음은 UTILIN으로 주어진 SMF 데이터셋을 OPTION 문의 조건에 따라 선택해서 UTILOUT으로 복사하거나 SYSPRINT로 출력하는 예제이다.
//DFHJUP JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //STEP EXEC PGM=DFHJUP //SYSOUT DD SYSOUT=* //UTILIN DD DSN=SMLOG.CICSDATA,DISP=SHRv //UTILOUT DD DSN=SMF.CICSDUMP,DISP=NEW,DCB=LRECL=32760 //SYSIN DD * CONTROL CNTL SKIP=4,STOPAFT=(8,E),DDNAME=UTILIN,DDNOUT=UTILOUT OPTION COPY OFFSET=7,T=C,V=E,C=M OPTION COPY OFFSET=6,V=30,L=1 OPTION COPY OFFSET=6,FLDTYP=C,VALUE=0,FLDLEN=1,COND=M OPTION COPY O=7,V=D,C=M,L=1,T=C END /* //
-
SKIP 문에 의해 UTILIN 의 첫 4개 레코드는 무시된다.
-
STOPAFT 문에 의해 조건을 만족하는 8개 레코드까지만 DFHJUP에서 처리한다.
-
다음 조건을 만족하는 경우에 UTILOUT으로 복사된다.
( (7번째 Byte 값이 'E' ) AND (6번째 Byte의 값이 X'30') ) OR ( (6번째 Byte 값이 '0') AND (7번째 Byte 값이 'D') )
다음은 SYSUT1으로 주어진 SMF 데이터셋을 SUBSYS 서브 파라미터의 기술 조건에 의해 TRUNCATE 처리하는 예제이다.
//DFHJUP JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //STEP EXEC PGM=DFHJUP //SYSOUT DD SYSOUT=* //SYSUT1 DD DSN=SMLOG.CICSDATA, // SUBSYS=(LOGR,DFHLGCNV,,DELBRCUR) //SYSIN DD * OPTION PRINT END /* //
3.4. 유의사항
DFHJUP 유틸리티 프로그램을 실행한 결과는 다음과 같다.
-
정상적으로 실행한 경우
Batch 애플리케이션에서 받은 코드를 반환한다.
-
에러가 발생한 경우
해당 에러 메시지를 SYSOUT 혹은 SYSPRINT DD에 출력하고 에러에 해당하는 코드를 반환한다.
DFHJUP 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.
코드 설명 0
정상 수행된 경우이다.
8
중대한 에러로 인해 동작이 중지된 경우이다.
다음의 경우에 발생한다.
-
스크립트 파싱 실패
-
데이터셋 이용 불가
-
OpenFrame 시스템 라이브러리 초기화 실패
-
4. IDCAMS
IDCAMS는 OpenFrame의 VSAM과 Non-VSAM 데이터셋 및 카탈로그 정보를 생성하고 관리하는 유틸리티 프로그램이다.
SYSIN DD에 입력된 각 명령은 각각의 명령이 의미하는 작업을 수행하기 위한 명령어와 이를 위한 각종 옵션 또는 파라미터들로 구성된다. IDCAMS는 실행할 명령들을 SYSIN DD에서 읽어 들여 동작한다.
OpenFrame의 IDCAMS 프로그램은 기존 Mainframe의 IDCAMS 명령을 그대로 사용하여 OpenFrame의 VSAM 데이터셋과 Non-VSAM 데이터셋 그리고 카탈로그를 대상으로 동작한다. 사용자 입장에서 Mainframe의 IDCAMS와 동일한 작업을 수행한다.
IDCAMS는 2가지 종류의 명령어로 분류된다.
-
기능 명령어
실제로 사용자가 수행하려는 특정 작업을 나타내는 명령어이다.
명령어 설명 이미 정의되어 있는 데이터셋 또는 카탈로그 자체의 속성을 변경한다.
다음과 같은 데이터셋 오브젝트(또는 카탈로그 엔트리)를 정의하기 위해 사용한다.
VSAM과 Non-VSAM 데이터셋 및 카탈로그를 제거한다.
카탈로그와 VSAM 데이터셋을 이식 가능한 데이터셋으로 반출하거나 백업 데이터셋을 생성한다.
EXPORT 명령으로 생성된 이식 가능한 카탈로그와 VSAM 데이터셋을 반입하거나 백업된 상태의 데이터셋을 원래의 상태로 복원한다.
카탈로그에 등록된 VSAM과 Non-VSAM 데이터셋에 대한 정보를 보여준다.
VSAM과 Non-VSAM 데이터셋에 저장되어 있는 레코드를 출력하여 보여준다.
VSAM과 Non-VSAM 데이터셋의 내용을 복사한다.
VSAM 데이터셋의 비정상 종료(close)로 인해 잘못된 데이터셋 정보로 카탈로그 되어 있는지 확인하고 올바르게 수정한다. 또한 레코드 수 등의 정보도 정확하게 반영되어 있는지 확인한다.
VSAM 데이터셋을 종료할 때 해당 데이터셋의 마지막 위치와 레코드 수 등의 통계정보가 카탈로그에 저장된다. 정상적으로 종료되지 않은 경우 카탈로그 정보와 실제 데이터셋의 상태 정보가 일치하지 않을 수 있으므로, VERIFY 명령으로 이러한 불일치를 올바르게 변경할 수 있다.
-
보조 명령어
일련의 IDCAMS 명령어들의 실행을 제어하기 위한 보조 성격의 명령어이다.
명령어 설명 실행된 명령의 컨디션 코드 값(LASTCC 또는 MAXCC)에 따라 다음에 실행할 명령을 분기하기 위해 사용한다.
아무 동작도 발생시키지 않는 문법적 용도의 명령이다.
IF-THEN-ELSE 명령의 THEN이나 ELSE 다음에 특별한 작업을 수행하지 않는다는 것을 명시적으로 나타내기 위해서 사용한다.
MAXCC나 LASTCC의 값을 특정한 값으로 강제 설정하기 위해 사용한다.
프로그램 실행 중 CANCEL 명령어를 만나면 IDCAMS의 실행이 중지되고, CANCEL 명령 이후의 나머지 명령들은 처리되지 않는다.
PARM
IDCAMS가 실행되는 동안에 적용되는 옵션 및 파라미터 값을 지정한다(현재는 지원하지 않는다).
-
비 기능 명령어
에러가 발생하지 않도록 처리하지만 실제 기능하지 않는 명령어이다.
명령어 설명 특정 데이터셋에 대한 보조 인덱스를 생성한다.
특정 클러스터에 대한 인덱스 및 데이터 컴포넌트의 무결성을 검사한다.
코딩 규약
IDCAMS을 이용하여 코딩할 때 공통적으로 적용되는 규약은 다음과 같다.
-
하이픈 (-)
하나의 명령을 여러 라인에 걸쳐서 작성할 경우 라인의 맨 뒤에 하이픈(-)을 입력하고 그 다음 라인에 계속 이어서 명령의 나머지 부분을 코딩한다. 하이픈(-)은 키워드나 파라미터 값의 중간에 코딩할 수 없으며 일반적으로 키워드나 파라미터 값의 경계가 되는 부분에 라인이 계속 이어진다는 의미로 사용한다.
하이픈(-)을 사용하여 코딩하는 예는 다음과 같다.
LISTCAT ENT( - TEST.CLUS1 - TEST.KSDS1 - TEST.RRDS1 - TEST.SDS1)
여러 라인에 걸쳐서 작성된 명령어의 맨 마지막 라인에는 하이픈(-)을 코딩하지 않도록 주의한다.
-
주석
주석은 IDCAMS 명령 사이에 입력할 수 있다. 단, 키워드나 파라미터 값의 중간에는 주석이 올 수 없다.
주석에 특별한 기능은 없지만 하나의 명령으로 간주되기 때문에 명령 중간에 주석을 추가하는 경우에는 해당 라인의 맨 뒤에 하이픈(-)을 입력해야 한다. 주석은 공백이나 콤마(,)와 같이 IDCAMS 문법에서 필드를 구분하는 역할도 하므로 ‘/*’와 ‘*/’ 사이에 입력한다.
다음은 주석을 기술한 올바른 예이다.
/* This is IDCAMS 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 구조가 의도하지 않은 위치에서 끝나지 않도록 주의해야 한다.
4.1. DD 설정
OpenFrame의 IDCAMS는 JCL을 통해 Batch 작업으로 실행하는 방식과 UNIX 시스템의 명령어 라인에서 직접 실행하는 인터랙티브 방식을 모두 지원한다.
JCL을 통한 JOB 실행(using JCL as JOB)
JCL을 통해서 JOB의 한 STEP으로서 IDCAMS를 실행하는 경우 IDCAMS는 다음과 같은 DD 문을 사용한다.
항목 | 설명 |
---|---|
SYSIN DD |
IDCAMS가 실행할 명령을 기술한다. 데이터셋의 레코드 길이는 72컬럼을 넘을 수 없으며, 명령이 길어질 경우 하이픈(-)을 사용한다. |
SYSPRINT DD 또는 SYSOUT DD |
IDCAMS 실행 결과와 실행 중 발생한 주의를 필요로 하는 정보성 메시지, 경고 메시지 그리고 에러 메시지 등을 저장할 데이터셋을 기술한다. SYSPRINT DD를 기술하지 않거나 지정 데이터셋의 할당, 열기에 실패한 경우 IDCAMS는 아무런 명령도 수행하지 않고 종료되며 컨디션 코드 16을 반환한다. |
추가적인 DD |
IDCAMS 명령 중에서 일부는 JCL에 기술된 DD를 통해 명령의 대상이 되는 ddname이나 entryname을 간접적으로 지정할 수 있다. 이 경우 IDCAMS는 데이터셋을 동적으로 할당하지 않고 JOB의 실행을 제어하는 tjclrun에 의해 JOB 레벨에서 미리 할당된 데이터셋을 승계 받아 사용한다. 일반적으로 명령어의 대상이 되는 데이터셋을 지정하는 파라미터는 JCL에 기술된 ddname을 이용하여 FILE(ddname) 형태의 파라미터 이름을 갖는다. IDCAMS에서 동적 할당을 이용하여 데이터셋을 지정하는 파라미터는 DATASET(entryname) 형태의 파라미터 이름을 갖는다. |
다음은 앞에서 설명한 추가적인 DD에 대한 예로, REPRO BLDINDEX PRINT의 파라미터를 이용하여 JCL에서 할당된 데이터셋을 승계 받아서 동작하도록 한다.
INFILE(ddname), OUTFILE(ddname)
다음은 REPRO BLDINDEX PRINT의 파라미터로, IDCAMS에서 동적으로 데이터셋을 할당하여 동작하는 예이다.
INDATASET(entryname), OUTDATASET(entryname)
JCL을 통해서 JOB의 한 STEP으로 IDCAMS를 실행시키기 위해서는 IDCAMS를 호출하는 JOB STEP에 앞에서 설명한 DD를 기술하고 EXEC PGM에 IDCAMS를 지정한 후 해당 JCL을 전송(submit)한다.
//JOB01 JOB OBM,CLASS=B,MSGCLASS=X,MSGLEVEL=(1,1) //REPRO EXEC PGM=IDCAMS //INDD DD DSN=VSAM.KSDS1,DISP=(OLD,KEEP) //OUTDD DD DSN=VSAM.KSDS2,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSIN DD * REPRO INFILE(INDD) - OUTFILE(OUTDD) - SKIP(50000) COUNT(10000) /* //
명령어 라인에서 실행(using from Command line)
UNIX 시스템의 명령어 라인에서 IDCAMS를 직접 실행한다. 이 경우 SYSIN DD 및 SYSPRINT DD 대신에 표준 입출력 스트림(stdin/stdout/stderr)을 사용하여 작동한다. 즉, stdin으로부터 IDCAMS 명령어를 읽어 들여 명령어 단위로 실행하고, stdout/stderr로는 작업의 결과 및 에러 메시지를 출력하는 인터랙티브한 인터프리터 방식이다.
UNIX 시스템의 명령어 라인에 다음과 같은 명령을 실행하면 IDCAMS는 DEFINE.TEST.CLUS1.CMD라는 VSAM 데이터셋을 제거하고 다시 정의하는 동작을 한다.
$ IDCAMS < DEFINE.TEST.CLUS1.CMD
TEST.CLUS1.CMD는 일반적인 UNIX 텍스트 파일로 아래와 같은 내용을 담고 있다.
DEFINE.TEST.CLUS1.CMD 파일은 IDCAMS 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)
DD (ddname)를 통해 할당된 데이터셋을 승계하여 사용하기 위해서는 OpenFrame Batch 환경, 특히 tjclrun을 필요로 한다. 따라서 JCL을 통해 JOB STEP으로 IDCAMS를 실행하는 경우에 가능했던 ddname을 사용한 데이터셋의 지정이 UNIX 시스템의 명령어 라인에서는 불가능하다.
UNIX 명령어를 실행하는 경우 IDCAMS 명령의 대상이 되는 데이터셋을 지정하기 위해서는 항상 DATASET(entryname) 형태로 지정하여 사용해야 한다.
4.2. 기능 명령어
본 절에서는 IDCAMS 기능 명령어에 대해 설명한다.
ALTER
DEFINE 문으로 카탈로그에 이미 등록되어 있는 데이터셋과 카탈로그 엔트리의 정보 일부를 변경할 수 있다. ALTER 명령어 구문은 다음과 같다.
ALTER entryname [EMPTY|NOEMPTY] [FILE(ddname)] [LIMIT(limit)] [NEWNAME(newname)] [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으로 지정된 카탈로그 엔트리를 찾을 때 사용할 카탈로그를 명시적으로 지정한다. 지정하지 않는 경우에는 카탈로그 검색 순서에 따라서 결정된다. |
NEWNAME |
카탈로그에 등록된 데이터셋의 이름을 변경하기 위해 사용한다. Non-VSAM에 대해서만 사용할 수 있다. Non-VSAM을 GDS 이름으로 변경하여 GDG 베이스와 연관된 상태로 변경할 수 있다. |
그 외의 파라미터는 IBM의 "DFSMS Access Method Services for Catalogs"를 참고한다. |
카탈로그 엔트리 타입과 카탈로그 엔트리에 해당하는 사용자 데이터셋에 데이터가 적재되어 있는지 여부에 따라서 변경 가능한 속성과 변경 불가능한 속성이 있다.
다음은 OpenFrame IDCAMS의 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 |
그 외의 파라미터는 IBM의 "DFSMS Access Method Services for Catalogs"를 참고한다. |
변경할 카탈로그 엔트리에 새로운 속성값을 지정하기 위해서는 각 파라미터 외에도 변경할 대상이 되는 카탈로그 엔트리를 지정하기 위한 파라미터가 필요하다.
다음은 TESTCAT이라는 카탈로그에 등록된 TEST.GDG1란 이름의 GDG의 최대 세대 수를 255로, 만료일자를 2006년의 300번째 날짜로 속성을 변경하는 예이다.
//JOB02 JOB OBM,CLASS=B,MSGCLASS=X,MSGLEVEL=(1,1) //ALTGDG EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * ALTER TEST.GDG1 - LIMIT(255) - TO(2006300) - CATALOG(TESTCAT) /* //
DEFINE
DEFINE 명령에서 공통적으로 사용 가능한 파라미터는 다음과 같다.
DEFINE Commands {NAME(entryname)|NAMES(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)]
항목 | 설명 |
---|---|
NAME|NAMES |
DEFINE 명령으로 생성 또는 정의하려는 카탈로그 객체의 이름을 지정한다. 일부 DEFINE 명령어에서는 NAMES를 지원하지 않으므로 주의한다. |
VOLUMES |
데이터셋을 생성하는 경우 데이터셋을 저장할 볼륨의 일련번호를 지정한다. |
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)를 의미한다.
|
STORAGECLASS |
스토리지 클래스 값(1-8)을 지정한다. 스토리지 클래스는 SMS에서 정의하며 생성되는 데이터셋에 할당되는 저장소 용량과 관련된 속성을 가지고 있다. 스토리지 클래스를 지정하는 경우 필수 파라미터인 CYLINDERS와 같은 스토리지 할당 크기를 지정하는 파라미터를 지정하지 않아도 된다. DEFINE 명령에 직접 스토리지 할당량이 지정되고 스토리지 클래스에 정의된 값과 다른 경우 스토리지 클래스에 정의된 값이 우선한다. |
TO|FOR |
데이터셋 및 카탈로그 엔트리를 생성할 때 해당 객체의 만료일자를 지정한다.
|
DATA, INDEX |
CLUSTER, ALTERNATEINDEX, USERCATALOG와 같이 데이터 컴포넌트와 인덱스 컴포넌트를 가질 수 있는 VSAM 클러스터를 생성하는 경우 데이터 컴포넌트와 인덱스 컴포넌트 각각에 대해서 별도로 위에서 설명한 파라미터(일부 해당하는 파라미터)를 따로 지정할 수 있다. 예를 들어 저장소 할당 크기를 나타내는 CYLINDERS 파라미터는 DEFINE CLUSTER할 때 CLUSTER의 서브 파라미터로서 지정해도 되고 DATA나 INDEX 컴포넌트의 서브 파라미터로서 지정해도 된다. 이렇게 별도로 지정한 경우 컴포넌트 별로 따로 적용하는 것이 가능하다면 컴포넌트별로 다른 값이 적용된다. |
CATALOG |
DEFINE 명령으로 정의하는 카탈로그 엔트리가 등록될 카탈로그 이름을 지정한다. 생략하면 해당 JOB의 STEPCAT이나 JOBCAT에 지정된 카탈로그 또는 카탈로그 엔트리 이름의 일부를 ALIAS로 사용하는 USERCATALOG가 있는 경우 해당 USERCATALOG에 등록된다. 마지막까지 등록할 카탈로그가 결정되지 않으면 마스터 카탈로그에 등록한다. 자세한 사항은 OpenFrame Base "데이터셋 안내서"의 "통합 카탈로그"에서 카탈로그 검색 순서를 참고한다. |
DEFINE 명령별로 지정 가능한 실제 파라미터의 종류는 각각의 DEFINE 명령 절에서 설명한다. 본 절에서는 공통적으로 사용하는 파라미터에 관해 설명한다. |
DEFINE ALIAS
Non-VSAM 데이터셋이나 사용자 카탈로그의 별칭으로 사용할 ALIAS를 카탈로그에 생성한다.
ALIAS에 해당하는 카탈로그 엔트리 역시 원래의 데이터셋 이름과 별칭만을 포함하고 있다. 별도의 사용자 데이터를 저장하기 위한 데이터셋은 존재하지 않는다.
사용자 카탈로그를 제외한 VSAM 데이터셋에 대한 ALIAS는 생성할 수 없다. |
DEFINE ALIAS 명령어 구문은 다음과 같다.
DEFINE ALIAS (NAME(aliasname) RELATE(entryname)) [CATALOG(catname)]
항목 | 설명 |
---|---|
NAME |
생성할 ALIAS 이름을 지정한다. |
RELATE |
ALIAS가 가리키는 실제 엔트리의 entryname을 지정한다. |
CATALOG |
생성할 ALIAS를 등록할 카탈로그를 지정한다. |
다음은 TEST.NVSAM1의 ALIAS로 TEST.ALIAS1을 생성하고 TESTCAT 카탈로그에 등록하는 예이다.
//JOB04 JOB OBM,CLASS=B,MSGCLASS=X,MSGLEVEL=(1,1) //DEFALI EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DEFINE ALIAS(NAME(TEST.ALIAS1) - RELATE(TEST.NVSAM1)) - CATALOG(TESTCAT) /* //
DEFINE ALTERNATEINDEX
DEFINE ALTERNATEINDEX(이하 AIX) 명령을 이용하여 특정 데이터셋(BASE CLUSTER)에 대한 별도의 인덱스 방법을 제공하는 AIX 데이터셋을 정의한다.
VSAM은 베이스 클러스터에 레코드가 추가되거나 삭제 또는 변경되는 경우 이와 연관된 AIX들에 대해서 자동적으로 변경을 수행하여 AIX가 지속적으로 올바르게 베이스 클러스터에 대한 별도의 인덱스를 수행할 수 있도록 한다.
내부 구조 상 AIX 데이터셋도 하나의 KSDS 클러스터 구조를 갖는 데이터셋이므로 DEFINE AIX에 사용되는 대부분의 파라미터는 DEFINE CLUSTER의 파라미터와 동일하다.
DEFINE AIX 명령어 구문과 지정할 수 있는 주요 파라미터는 다음과 같다.
DEFINE AIX (NAME(entryname) | NAMES(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(ddname)] [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(ddname)] [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(ddname)] [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 부분을 보조 키로 한다. 보조 키는 유일하지 않으며 베이스 클러스터가 변경될 때 자동적으로 업그레이드된다.
//JOB05 JOB OBM,CLASS=B,MSGCLASS=X,MSGLEVEL=(1,1) //DEFAIX EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DEFINE AIX (NAME(VSAM.AIX1) - RELATE(VSAM.KSDS1) - UPGRADE - NUNQK - KEYS(7 44) - VOL(VOL100) - SHR(2 3)) /* //
DEFINE CLUSTER
DEFINE CLUSTER 명령을 사용해서 VSAM 데이터셋을 정의하며, 필수적인 속성과 부가적인 속성들을 함께 지정할 수 있다.
DEFINE CLUSTER 명령어 구문과 지정할 수 있는 주요 파라미터는 다음과 같다.
DEFINE CLUSTER (NAME(entryname) | NAMES(entryname) {CYLINDERS(primary[secondary])| KILOBYTES(primary[secondary])| MEGABYTES(primary[secondary])| RECORDS(primary[secondary])| TRACKS(primary[secondary])} VOLUMES(volser[ volser...]) [CONTROLINTERVALSIZE(size)] [DATACLASS(class)] [FILE(ddname)] [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(volser[volser...])] [CONTROLINTERVALSIZE(size)] [FILE(ddname)] [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(ddname)] [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 구조의 데이터셋을 생성하는 예이다.
VSAM.KSDS1에 저장되는 레코드는 350Byte의 고정길이를 갖고 키 필드는 레코드 상에서 맨 앞의 10Byte에 위치하며, VSAM.KSDS1 데이터셋을 구성하는 인덱스와 데이터 컴포넌트의 이름을 각각 명시적으로 지정하고 있다.
//JOB06 JOB OBM,CLASS=B,MSGCLASS=X,MSGLEVEL=(1,1) //DEFCLUS EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * 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)) /* //
DEFINE GDG (Generation Data Group)
GDG에 해당하는 카탈로그 엔트리를 카탈로그에 생성한다.
GDG의 한 세대(Generation)에 해당하는 Non-VSAM 데이터셋 GDS와 달리 GDG에 해당하는 실제 데이터셋은 존재하지 않는다. GDG 카탈로그 엔트리는 추후 해당 GDG 그룹에 속하게 될 여러 GDS를 관리하기 위한 정보만을 갖는 카탈로그 엔트리이다.
DEFINE GDG를 수행한 결과로는 아무런 데이터셋도 생성되지 않고, 단순히 해당 GDG 그룹을 관리하기 위한 카탈로그 엔트리가 카탈로그에 추가된다.
DEFINE GDG 명령어 구문은 다음과 같다.
DEFINE GENERATIONDATAGROUP (NAME(entryname) | NAMES(entryname) LIMIT(limit) [EMPTY|NOEMPTY] [OWNER(ownerid)] [SCRATCH|NOSCRATCH] [TO(date)|FOR(days)]) [CATALOG(catname)]
항목 | 설명 |
---|---|
NAME|NAMES |
생성할 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 그룹의 유효일을 설정한다.
|
CATALOG |
생성할 GDG 베이스가 등록될 카탈로그의 이름을 지정한다. |
다음은 GDS 멤버를 100개까지 포함할 수 있는 TEST.GDG1이라는 이름의 GDG 베이스를 생성하고 2006년 12월 31일까지를 GDG 베이스의 유효기간으로 설정하여 TESTCAT이라는 카탈로그에 등록하는 예이다.
//JOB07 JOB OBM,CLASS=B,MSGCLASS=X,MSGLEVEL=(1,1) //DEFGDG EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DEFINE GDG (NAME(TEST.GDG1) - LIMIT(100) - TO(2006365)) - CATALOG(TESTCAT) /* //
DEFINE NONVSAM
일반적인 PS(Physical Sequential) 타입의 Non-VSAM 데이터셋을 생성하고 만들어진 데이터셋을 카탈로그에 등록한다.
GDG에 속하는 하나의 GDS는 Non-VSAM 데이터셋이기 때문에 DEFINE NONVSAM 명령을 사용해서 GDS를 생성할 수 있다. |
DEFINE NONVSAM 명령어 구문은 다음과 같다.
DEFINE NONVSAM ({NAME(entryname)|NAMES(entryname)} DEVICETYPES(devtype [devtype ...]) VOLUMES(volser [volser ...]) [OWNER(ownerid)] [RECATALOG|NORECATALOG] [TO(date)|FOR(days)]) [CATALOG(catname)]
항목 | 설명 |
---|---|
NAME|NAMES |
만들어질 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 데이터셋의 카탈로그 엔트리 정보가 등록될 카탈로그를 지정한다. |
OWNER |
Non-VSAM 데이터셋의 소유자를 명시적으로 지정한다. |
RECATALOG| NORECATALOG |
Non-VSAM 데이터셋에 해당하는 VVDS와 이미 존재하는 데이터셋을 카탈로그에만 새로 등록하는 경우에는 RECATALOG를 지정한다. (기본값: NORECATALOG, 새로 데이터셋을 생성) |
TO|FOR |
Non-VSAM 데이터셋의 유효일을 설정한다.
|
다음은 Non-VSAM 데이터셋인 TEST.NVSAM1을 생성하고 TESTCAT 카탈로그에 등록하는 예이다.
//JOB08 JOB OBM,CLASS=B,MSGCLASS=X,MSGLEVEL=(1,1) //DEFNVS EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DEFINE NONVSAM (NAME(TEST.NVSAM1) - VOLUMES(100000)) - CATALOG(TESTCAT) /* //
DEFINE PATH
DEFINE PATH 명령을 통해서 베이스 클러스터에 대한 직접적인 접근 경로를 정의하거나 보조 인덱스를 경유하여 베이스 클러스터에 접근하는 간접적인 접근 경로를 정의한다.
DEFINE PATH 명령어 구문은 다음과 같다.
DEFINE PATH ({NAME(entryname) | NAMES(entryname)} [PATHENTRY(entryname)] [OWNER(ownerid)] [RECATALOG|NORECATALOG] [TO(date)|FOR(days)] [UPDATE|NOUPDATE]) [CATALOG(catname)]
항목 | 설명 |
---|---|
NAME|NAMES |
DEFINE PATH 문으로 현재 정의하는 PATH의 이름을 지정한다. |
PATHENTRY |
PATH가 AIX와 베이스 클러스터의 쌍으로 이루어지는 경우에는 AIX 데이터셋의 이름을 지정한다. 베이스 클러스터 자체에 대한 PATH를 정의하는 경우라면 베이스 클러스터 데이터셋의 이름을 지정하며 베이스 클러스터 데이터셋 본래의 인덱스 방법을 지칭하는 단순한 별칭으로 생각할 수 있다. 하지만 하나의 베이스 클러스터에 여러 개의 PATH를 정의할 수 있기 때문에 실제로 액세스할 때 적용되는 속성을 달리 지정하는 용도로 사용할 수 있다. |
OWNER |
접근 경로의 소유자를 명시적으로 지정한다. |
RECATALOG| NORECATALOG |
|
TO|FOR |
접근 경로의 유효일을 설정한다.
|
UPDATE| NOUPDATE |
|
다음은 보조 인덱스 VSAM.AIX1을 경유하여 VSAM.AIX1의 베이스 클러스터에 접근하는 경로(PATH)인 VSAM.PATH1을 생성하는 예이다. UPDATE 파라미터가 지정되어 있으므로 이 접근경로를 사용하여 베이스 클러스터의 내용을 변경하는 경우 VSAM.AIX1 이외의 다른 보조 인덱스에 대해서도 업그레이드가 일어난다.
//JOB09 JOB OBM,CLASS=B,MSGCLASS=X,MSGLEVEL=(1,1) //DEFPATH EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DEFINE PATH (NAME(VSAM.PATH1) - PATHENTRY(VSAM.AIX1) - UPDATE) /* //
다음은 보조 인덱스를 경유하지 않고 직접 베이스 클러스터에 접근하는 경로 VSAM.PATH2를 정의하는 예이다. UPDATE 파라미터가 지정되어 있으므로 VSAM.KSDS1을 베이스 클러스터로 하는 보조 인덱스가 존재하는 경우 VSAM.PATH2를 이용하여 베이스 클러스터의 내용이 변경되는 경우 업그레이드가 일어난다.
//JOB10 JOB OBM,CLASS=B,MSGCLASS=X,MSGLEVEL=(1,1) //DEFPATH EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DEFINE PATH (NAME(VSAM.PATH2) - PATHENTRY(VSAM.KSDS1) - UPDATE) /* //
DEFINE PATH에 관한 자세한 내용은 OpenFrame Base "데이터셋 안내서"를 참고한다. |
DEFINE USERCATALOG
시스템에서 제공하는 하나의 마스터 카탈로그 외에 여러 개의 사용자 카탈로그를 별도로 사용할 수 있다.
모든 데이터셋에 관한 메타정보를 마스터 카탈로그에 모두 등록하는 경우 마스터 카탈로그의 크기가 필요 이상으로 커지게 되므로 시스템의 성능저하를 초래할 수 있다.
DEFINE USERCATALOG 명령으로 시스템 마스터 카탈로그와 비슷한 용도로 사용할 수 있는 사용자 카탈로그를 생성할 수 있다. 이는 마스터 카탈로그의 서브 카탈로그로 생각할 수 있다.
생성된 사용자 카탈로그에 대한 정보는 다시 마스터 카탈로그에 저장된다. 사용자 카탈로그의 서브 카탈로그로 또 다른 사용자 카탈로그를 생성하는 것은 불가능하다. 사용자 카탈로그는 한 레벨로만 생성할 수 있으며, 모든 사용자 카탈로그는 마스터 카탈로그에만 등록되고, 다른 사용자 카탈로그에는 등록될 수 없다. 일반적으로 사용자 카탈로그는 사용자 별로 생성하거나 관련 부서 또는 업무별로 생성한다.
OpenFrame에서는 마스터 카탈로그를 생성하기 위해 별도의 명령을 취하지 않는다. 반면 사용자 카탈로그를 추가로 생성하는 경우에는 IDCAMS의 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(ddname)] [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 |
생성된 사용자 카탈로그가 등록될 마스터 카탈로그의 이름을 지정한다. 생략해도 시스템의 마스터 카탈로그에 자동으로 등록된다. |
이 외의 항목에 대한 설명은 IBM의 "DFSMS Access Method Services for Catalogs"를 참고한다. |
DELETE
VSAM 데이터셋과 Non-VSAM 데이터셋 그리고 이외에 카탈로그된 데이터셋 항목을 제거하기 위해 DELETE 명령을 사용한다. DELETE 명령은 이미 존재하는 항목을 지우는 역할을 하기 때문에 많은 파라미터를 요구하지 않는다. 제거하려는 항목의 이름과 해당 항목의 카탈로그 엔트리 타입만을 필요로 한다.
DELETE 명령어 구문은 다음과 같다.
DELETE (entryname [entryname ...]) [ALIAS| ALTERNATEINDEX| CLUSTER| GENERATIONDATAGROUP| NONVSAM| PATH| TRUENAME| USERCATALOG] [FILE(ddname)] [FORCE|NOFORCE] [PURGE|OPURGE] [CATALOG(catname)]
항목 | 설명 |
---|---|
entryname |
제거할 데이터셋이나 카탈로그 엔트리의 이름을 지정한다. 괄호 안에 여러 개의 이름을 지정하면 한번의 명령으로 다수의 엔트리를 제거할 수 있다. entryname으로 지정된 데이터셋은 배타적으로(DISP=OLD) 할당된다. |
ALIAS| ALTERNATEINDEX| CLUSTER| GENERATIONDATAGROUP| NONVSAM| PATH| TRUENAME| USERCATALOG |
ALIAS는 ALIAS Entry Type이다. 제거할 카탈로그 엔트리의 엔트리 타입을 지정한다. 엔트리 타입 지정은 필수적이지 않지만, 엔트리 타입을 지정하면 실수로 이름이 동일한 의도하지 않은 항목을 제거하는 실수를 방지할 수 있다. AIX, CLUSTER, PATH, TRUENAME은 VSAM 데이터셋의 엔트리 타입이고 나머지는 Non-VSAM 데이터셋의 엔트리 타입이다. |
FILE |
제거할 데이터셋을 지정한다. FILE(ddname)으로 데이터셋을 지정하는 경우 ddname은 IDCAMS를 호출한 JCL의 DD 문을 통해 할당된 ddname을 지정해야 한다. |
FORCE|NOFORCE |
삭제할 GDG가 GDS 멤버를 보유하고 있더라도 강제로 삭제할 지 여부를 결정한다. 현재는 GDG에 대해서만 유효한 옵션이다.
|
PURGE|NOPURGE |
데이터셋을 정의할 때 지정한 사용기간에 관계없이 데이터셋 엔트리를 제거할지 여부를 지정한다.
데이터셋의 사용기간(retention period)은 DEFINE 명령의 TO 및 FOR 파라미터로 지정된다. |
CATALOG |
삭제할 카탈로그 엔트리 정보가 등록되어 있는 카탈로그를 지정한다. |
다음은 VSAM 데이터셋 엔트리 타입의 VSAM.KSDS1과 VSAM.KSDS2를 지정한 사용기간에 관계없이 삭제하는 예이다.
//JOB11 JOB OBM,CLASS=B,MSGCLASS=X,MSGLEVEL=(1,1) //DELCLUS EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DELETE (VSAM.KSDS1 VSAM.KSDS2) - CLUSTER - ERASE - PURGE /* //
EXPORT
EXPORT 명령을 이용하여 VSAM CLUSTER나 ALTERNATE INDEX를 외부로 이식 가능한 데이터셋으로 반출할 수 있다. 카탈로그 데이터셋 자체를 백업하기 위해서 사용된다.
EXPORT 명령어 구문은 다음과 같다.
EXPORT entryname {OUTFILE(ddname)|OUTDATASET(entryname)} [INFILE(ddname)] [TEMPORARY|PERMANENT]
항목 | 설명 |
---|---|
entryname |
EXPORT할 카탈로그 엔트리의 entryname을 지정한다. entryname으로 지정된 반출 대상 데이터셋은 배타적으로(DISP=OLD) 할당된다. |
OUTFILE| OUTDATASET |
EXPORT 결과로 생성될 데이터셋을 지정한다. EXPORT 결과로 생성된 데이터셋을 카탈로그 상에 새로 만들기를 원하거나 이미 카탈로그되어 있는 경우는 entryname을 사용하고, 실행환경에서 IDCAMS 호출 전에 미리 할당되어 있는 데이터셋에 생성되기를 원하는 경우는 ddname을 사용한다. OUTDATASET 파라미터를 이용해서 지정한 데이터셋은 배타적으로(DISP=OLD) 할당된다. |
INFILE |
EXPORT할 데이터셋을 지정한다. INFILE(ddname)으로 데이터셋을 지정하는 경우 ddname은 IDCAMS를 호출한 JCL의 DD 문을 통해 할당된 ddname을 지정해야 한다. |
TEMPORARY|PERMANENT |
EXPORT 동작을 수행한 후 대상이 된 카탈로그 엔트리의 삭제 여부를 결정한다.
|
다음은 카탈로그 TESTCAT을 TESTCAT.BACKUP으로 EXPORT하는 예이다. 카탈로그의 내용을 반출하여 백업한다.
//JOB12 JOB OBM,CLASS=B,MSGCLASS=X,MSGLEVEL=(1,1) //BACKCAT EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //BACK DD DSN=TESTCAT.BACKUP,DISP=OLD //SYSIN DD * EXPORT TESTCAT - OUTFILE(BACK) /* //
IMPORT
IMPORT 명령을 이용하면 EXPORT 명령을 사용해서 생성한 백업이나 외부의 이식 가능한 데이터셋으로부터 다시 데이터셋을 복원하거나 새로 생성할 수 있다.
IMPORT 명령어 구문은 다음과 같다.
IMPORT {INFILE(ddname)|INDATASET(entryname)} {OUTFILE(ddname)|OUTDATASET(entryname)} [INTOEMPTY] [OBJECTS((entryname [MANAGEMENTCLASS(class)] [NEWNAME(newname)] [STORAGECLASS(class)] [VOLUMES(volser[ volser...])]) [(entryname...)...])] [CATALOG(catname)]
항목 | 설명 |
---|---|
INFILE|INDATASET |
IMPORT할 소스 데이터셋을 지정한다. IDCAMS 호출 전에 실행환경에서 미리 할당된 데이터셋을 사용하려는 경우에는 ddname을 지정하고 IDCAMS 내부적으로 할당하려는 경우에는 entryname을 사용한다. INDATASET 파라미터를 이용하여 지정된 소스 데이터셋은 배타적으로(DISP=OLD) 할당된다. |
OUTFILE|OUTDATASET |
IDCAMS 호출 전에 실행환경에서 미리 할당된 데이터셋을 사용하려는 경우에는 ddname을 지정하고 IDCAMS 내부적으로 할당하려는 경우에는 entryname을 사용한다. OUTDATASET 파라미터를 이용하여 지정된 데이터셋은 배타적으로(DISP=OLD) 할당된다. |
INTOEMPTY |
IMPORT 결과로 데이터를 받아들이는 데이터셋이 카탈로그에 등록되어 있거나 데이터셋에는 존재하지만 저장 공간이 할당되지 않은 상태인 경우(empty dataset) IMPORT 명령은 기본적으로 실패하게 된다. 이것을 무시하고 IMPORT 명령 수행 중에 필요한 저장 공간을 확보하여 명령을 성공시키기를 원하는 경우는 INTOEMPTY를 지정한다. |
OBJECTS |
IMPORT 작업을 수행하는 과정에서 부수적으로 IMPORT 원본 데이터셋에 기록된 정보 중에서 일부를 변경하는 작업을 수행할 수 있다. 이때 변경할 entryname과 적용할 새로운 속성을 지정한다. 여러 개의 entryname에 대해서 반복적으로 지정할 수 있다. |
CATALOG |
IMPORT 과정 중에 카탈로깅이 필요한 경우 사용할 카탈로그를 지정한다. |
다음은 TESTCAT.BACKUP이라는 백업 데이터셋의 내용을 카탈로그 TESTCAT으로 IMPORT하는 예이다. TESTCAT.BACKUP에 저장된 내용을 이용하여 카탈로그 TESTCAT을 복원한다.
//JOB13 JOB OBM,CLASS=B,MSGCLASS=X,MSGLEVEL=(1,1) //IMPCAT EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //BACK DD DSN=TESTCAT.BACKUP,DISP=OLD //SYSIN DD * IMPORT INFILE(BACK) - OUTDATASET(TESTCAT) /* //
LISTCAT
LISTCAT 명령을 사용해서 카탈로그에 정의된 데이터셋에 관한 다양한 정보를 출력할 수 있다.
다음과 같은 그룹으로 관련 정보를 정리해서 보여준다.
-
엔트리 객체의 속성
-
생성, 변경, 만료 시간 정보
-
보호(protection) 관련 정보
-
데이터셋 액세스 통계 정보
-
저장공간 할당 정보
-
데이터셋의 구조에 관한 정보
LISTCAT 명령어 구문은 다음과 같다.
LISTCAT [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와 LEVEL의 사용 예는 다음과 같다.
(*는 해당 세그먼트의 모든 이름과 일치한다.) |
NAME|HISTORY| VOLUME| ALLOCATION|ALL |
위의 엔트리 타입 필터 및 ENTRIES 파라미터로 지정되는 엔트리 이름 조건을 만족하는 카탈로그 엔트리에 대한 정보를 출력하는데 있어서 얼마나 자세한 레벨의 정보까지 출력할지를 지정한다. 순서대로 NAME을 지정하면 가장 기본적인 정보만이 출력되고 ALL을 지정하면 모든 해당 엔트리에 대한 정보가 출력된다. |
CATALOG |
LISTCAT 명령의 대상이 카탈로그의 이름을 지정한다. ENTRIES나 LEVEL로 지정하는 entryname은 여기에서 지정하는 카탈로그에서 검색된다. |
다음은 VSAM.KSDS1의 모든 엔트리에 대한 정보를 출력하는 예이다.
//JOB14 JOB OBM,CLASS=B,MSGCLASS=X,MSGLEVEL=(1,1) //LISTC EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * LISTCAT ENTRIES(VSAM.KSDS1) ALL /* //
다음은 앞의 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)
VSAM 및 Non-VSAM 데이터셋에 저장되어 있는 레코드들을 출력한다.
PRINT 명령어 구문은 다음과 같다.
PRINT {INFILE(ddname)|INDATASET(entryname)} [CHARACTER|DUMP|HEX] [FROMKEY(key)|FROMADDRESS(address)|FROMNUMBER(number)|SKIP(number)] [OUTFILE(ddname)] [TOKEY(key)|TOADDRESS(address)|TONUMBER(number)|COUNT(number)]
항목 | 설명 |
---|---|
INFILE|INDATASET |
PRINT 명령을 이용하여 내용을 출력할 데이터셋을 지정한다.
|
CHARACTER| DUMP| HEX |
PRINT 출력내용의 포맷을 지정한다.
|
FROMKEY| FROMADDRESS| FROMNUMBER|SKIP |
PRINT 문은 REPRO 문과 비슷한 파라미터를 통해서 사용자가 출력할 레코드의 범위를 지정할 수 있다. 각 파라미터의 의미는 바로 뒤에 설명되는 REPRO 명령의 해당 파라미터와 동일하다. |
OUTFILE |
SYSPRINT가 아닌 다른 DD에 PRINT 결과를 출력할 경우에 사용한다. PRINT 명령을 통해서 출력한 데이터셋의 내용을 저장할 별도의 데이터셋을 지정하고 JCL을 통해 미리 할당된 ddname을 지정해야 한다. 이 파라미터를 생략하면 기본적으로 PRINT 명령은 SYSPRINT로 출력한다. |
TOKEY|TOADDRESS| TONUMBER|COUNT |
PRINT는 REPRO와 비슷한 파라미터를 통해서 출력할 레코드의 범위를 사용자가 지정할 수 있다. 각 파라미터의 의미는 REPRO 명령의 해당 파라미터와 동일하다. |
다음은 TEST.KSDS1에 저장된 레코드를 DUMP 포맷으로 출력하는 예이다. 출력되는 레코드의 범위는 키 값이 0000000099인 첫 레코드부터 10개이다.
//JOB15 JOB OBM,CLASS=B,MSGCLASS=X,MSGLEVEL=(1,1) //PRINT EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * PRINT INDATASET(TEST.KSDS1) DUMP - FROMKEY(0000000099) COUNT(10) /* //
다음은 위의 JCL을 실행한 결과, SYSPRINT에 출력된 내용이다.
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) IDCAMS: PRINT OK
REPRO
DEFINE 명령을 통해서 데이터셋이 이미 정의되어 있다면 REPRO 명령을 이용해서 VSAM과 Non-VSAM 데이터셋의 내용을 다른 데이터셋에 저장할 수 있다. 이 명령에 사용되는 VSAM 데이터셋은 카탈로그에 등록되어 있어야 하지만 Non-VSAM 데이터셋의 경우는 카탈로그에 등록되어 있지 않아도 된다.
Mainframe의 카탈로그는 일반적으로 하나의 KSDS 클러스터에 저장되어 있기 때문에 REPRO 명령은 카탈로그 내용 자체를 복사하는 용도로 사용될 수 있다.
REPRO 명령을 이용하지 않고 일반적인 애플리케이션을 이용해서 레코드를 데이터셋에 저장하는 경우도 매우 일반적이나 REPRO 명령은 레코드의 내용에 상관하지 않고 주로 관리목적으로 데이터셋을 복사하는 용도로 사용된다.
복사할 원본 데이터셋과 대상 데이터셋을 모두 사용자 카탈로그로 지정한 경우 카탈로그 레코드에 대한 복사가 이루어진다.
REPRO 명령어 구문은 다음과 같다.
REPRO {INFILE(ddname)|INDATASET(entryname)} {OUTFILE(ddname)|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 |
복사할 원본 데이터셋을 지정한다.
|
OUTFILE|OUTDATASET |
원본 데이터셋을 복사한 후 저장할 대상 데이터셋을 지정한다.
|
ENTRIES|LEVEL |
REPRO 명령을 이용하여 카탈로그를 복사하는 경우에 복사 대상이 되는 카탈로그 엔트리 이름을 지정한다. 이 경우 2개의 카탈로그 사이에 카탈로그 엔트리 이름들만 복사된다. 실제 카탈로그 엔트리가 가리키는 데이터셋에 대한 복사를 의미하지는 않는다.
ENTRIES와 LEVEL의 사용 예는 다음과 같다.
(*는 해당 세그먼트의 모든 이름과 일치한다.) |
FROMKEY| FROMADDRESS| FROMNUMBER|SKIP |
데이터셋 전체를 모두 복사하지 않고 해당 데이터셋의 일부 레코드만을 복사하기 위해 복사할 대상을 한정한다. 각각 특정 키와 주소 그리고 레코드 번호 이후의 레코드를 대상으로 복사하고, SKIP 파라미터는 첫 레코드부터 number개의 레코드는 복사하지 않고 number개 다음 레코드부터 복사작업의 대상으로 한다. 즉, 복사작업의 시작이 되는 레코드를 지정한다. KSDS, ESDS, RRDS에 각각 FROMKEY, FROMADDRESS, FROMNUMBER를 사용해 복사 대상을 제어할 수 있다. Non-VSAM 데이터셋은 SKIP만을 사용할 수 있으며, 각 데이터셋 속성에 대응 하지 않는 항목을 사용하면 에러가 발생한다. |
MERGECAT| NOMERGECAT |
REPRO 명령으로 사용자 카탈로그의 레코드를 다른 사용자 카탈로그로 복사할 수 있다.
|
REPLACE|NOREPLACE |
소스 데이터셋을 타깃 데이터셋으로 복사하는 과정에서 타깃 데이터셋에 이미 동일한 레코드가 있는 경우의 처리방법을 지정한다.
|
REUSE|NOREUSE |
카탈로그가 아닌 VSAM 데이터셋이 타깃 데이터셋인 경우에 사용한다.
|
TOKEY|TOADDRESS TONUMBER|COUNT |
복사작업의 대상이 되는 레코드를 제한한다. 복사작업의 대상이 되는 마지막 레코드를 지정한다. FROMKEY, FROMADDRESS, FROMNUMBER, SKIP과 마찬가지로, KSDS, ESDS, RRDS에 각각 TOKEY, TOADDRESS, TONUMBER를 사용해 복사 대상을 제어할 수 있다. Non-VSAM 데이터셋은 COUNT만을 사용할 수 있으며, 각 데이터셋 속성에 대응 하지 않는 항목을 사용하면 에러가 발생한다. |
다음은 VSAM.KSDS1 데이터셋의 50001번 레코드부터 10000개의 레코드를 VSAM.KSDS2 데이터셋으로 복사하는 예이다.
//JOB16 JOB OBM,CLASS=B,MSGCLASS=X,MSGLEVEL=(1,1) //REPRO EXEC PGM=IDCAMS //INDD DD DSN=VSAM.KSDS1,DISP=(OLD,KEEP) //OUTDD DD DSN=VSAM.KSDS2,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSIN DD * REPRO INFILE(INDD) - OUTFILE(OUTDD) - SKIP(50000) COUNT(10000) /* //
VERIFY
VSAM 데이터셋을 개방하고 사용하는 과정에서 비정상적인 종료에 의해서 종료처리가 정확하게 되지 않은 경우 해당 VSAM 데이터셋이 카탈로그에 레코드를 저장하기 위해 사용하는 저장공간에 대한 정보를 부정확한 값으로 기록할 수 있다.
이러한 이유로 카탈로그에 문제가 발생한 경우 VERIFY 명령은 문제가 되는 VSAM 데이터셋에 대해서 올바른 저장공간 및 상태정보를 나타내고 있는지 확인하고, 지정된 데이터셋에 대한 카탈로그 정보가 잘못된 경우 올바른 값으로 갱신한다. 비정상적인 종료가 발생한 경우 카탈로그의 STATISTICS/REC-TOTAL 정보가 실제 VSAM 데이터셋의 레코드 수와 일치하지 않을 수 있으나, VERIFY 명령을 수행하면 STATISTICS/REC-TOTAL 정보를 올바른 값으로 갱신할 수 있다.
VERIFY 명령은 VSAM 데이터셋에 대해서만 동작한다. |
VERIFY 명령어 구문은 다음과 같다.
VERIFY FILE(ddname)|DATASET(entryname)
항목 | 설명 |
---|---|
FILE|DATASET |
VERIFY 명령의 대상이 되는 데이터셋을 지정한다.
|
다음은 TEST.CLUS1 데이터셋의 카탈로그 정보를 확인하는 예이다.
//JOB17 JOB OBM,CLASS=B,MSGCLASS=X,MSGLEVEL=(1,1) //VSTEP EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //TESTDD DD DSN=TEST.CLUS1,DISP=OLD //SYSIN DD * VERIFY FILE(TESTDD) /* //
4.3. 보조 명령어
한 번의 IDCAMS 실행으로 여러 개의 IDCAMS 명령을 수행할 수 있다. 보조 명령어(Modal command)는 여러 개의 IDCAMS 명령을 수행하기 위해서 필요한 기능을 제공하는 명령어로 실제로 카탈로그 엔트리나 오브젝트에 대해 처리하는 기능 명령어와 구분된다.
현재 IDCAMS의 보조 명령어 중 PARM은 지원하지 않는다. |
IF-THEN-ELSE
실행된 명령의 결과 코드 값(LASTCC 혹은 MAXCC)에 따라서 다음에 실행할 명령을 분기하기 위해서 사용된다. IF와 THEN 사이에는 조건 분기할 때 평가되는 조건을 지정해야 한다. 조건은 컨디션 코드(Condition Code)와 특정 상수의 비교를 통해서 기술한다. 예를 들어 LASTCC > 8라고 지정하면 컨디션 코드 변수 중의 하나인 LASTCC 값이 8보다 큰 경우를 의미한다.
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
가장 최근에 실행된 명령의 실행 결과값을 저장하는 IDCAMS에서 사용하는 변수이다. 성공적인 경우의 LASTCC는 0의 값을 갖고, 무시할 수 있는 경고가 발생한 경우의 값은 4이다. 심각한 문제가 발생한 경우 더 큰 값을 갖게 된다.
MAXCC
현재 실행 중인 명령보다 앞서서 실행된 명령의 실행 결과 값 중에서 가장 큰 값을 저장하는데 사용하는 변수이다.
Operator
THEN 문에는 IF 문이 참인 경우 실행할 IDCAMS 명령을 기술하고, ELSE 문에는 IF 문이 거짓인 경우 실행할 명령을 기술한다. 만약 IF 문이 거짓일 경우 실행할 명령이 없다면 ELSE문을 생략할 수 있다.
IF-THEN-ELSE 구문은 조건에 따라서 다른 명령을 수행하는 하나의 IDCAMS 명령으로 간주된다. 따라서 IF-THEN-ELSE 구문을 여러 라인에 걸쳐서 기술하는 경우는 하이픈(-)을 적절히 사용해야 한다.
다음은 LASTCC의 값이 8과 동일한 경우 MAXCC에 0을 설정하는 프로그램의 일부분을 예로 보여준다. 실제 IF-THEN 문이 동작하는 것을 보여주기 위해서 LASTCC를 8로 설정했으며 IF-THEN 문이 실행될 때는 LASTCC 값이 8이므로 THEN 뒤의 SET MAXCC-0이 실행된다. 이 상태에서 IDCAMS를 종료하면 최종적인 MAXCC 값을 보고하고 종료하므로 실행된 결과를 확인할 수 있다.
SET LASTCC=8 IF LASTCC=8 THEN SET MAXCC=0
다음은 LASTCC의 값이 4보다 큰 경우 TEST.SDS1의 엔트리 정보를 가져오고, LASTCC가 4보다 크지 않은 경우 TEST.SDS2의 엔트리 정보를 가져오는 예이다. 일반적으로 SET LASTCC의 위치에 다른 IDCAMS 명령어를 실행하여 그 결과에 의해서 LASTCC가 설정되고, 그 결과에 따라서 조건적으로 명령을 실행한다. 본 예제에서는 IF-THEN-ELSE 문의 동작을 테스트하기 위해 강제로 IF문 전에 LASTCC의 값을 0으로 설정하였다. IF 문의 결과에 따라 TEST.SDS2가 LISTCAT된다.
SET LASTCC=0 IF LASTCC > 4 - THEN - LISTCAT ENT(TEST.SDS1) ELSE - LISTCAT ENT(TEST.SDS2)
Null
Null은 아무 동작도 발생하지 않는 문법적인 용도의 명령으로 다음과 같은 2가지 목적으로 사용된다.
-
IF-THEN-ELSE 구문의 문법에 어긋나지 않고 THEN이나 ELSE에 아무런 명령도 지정하지 않을 경우에 사용한다.
-
Null이 IF-THEN-ELSE 구문 외에서 사용된 경우는 빈 라인으로 처리된다.
THEN이나 ELSE 뒤에서 라인을 변경하는 경우 라인이 계속 이어지는 것을 의미하는 하이픈(-)을 지정하지 않는다. 하이픈(-)을 지정하면 IDCAMS는 THEN이나 ELSE문 다음에 명령이 있는 것으로 가정하고 처리하기 때문에 의도한대로 명령의 분기가 되지 않는다. |
다음은 LASTCC가 4보다 큰 경우에 수행하는 명령은 없으며, LASTCC가 4보다 작은 경우에는 TEST.SDS2의 엔트리 정보를 가져오는 예이다.
SET LASTCC=0 IF LASTCC > 4 - THEN ELSE LISTCAT ENT(TEST.SDS2)
SET
MAXCC나 LASTCC의 값을 강제로 특정한 값으로 설정하는데 사용한다. 주로 특정 경고 수준의 컨디션 코드를 무시하고 JCL에서 IDCAMS 이후의 STEP을 계속 실행하기 위한 용도로 사용된다.
다음은 LASTCC의 값이 8과 동일한 경우 MAXCC의 값을 0으로 강제 설정하는 예이다.
DEL STEP에서 TEST.SDS1이 없는 경우 DEL STEP은 반환코드 8을 반환하고 종료하므로 DEF STEP은 수행되지 않는다. TJES의 설정이나 JOB에 기술된 COND에 따라 달라질 수 있지만, 반환코드가 8인 경우 DEF STEP을 처리하지 않고 JOB이 ABEND 처리되는 경우를 방지하려면 MAXCC를 0으로 강제 설정함으로써 뒤따르는 DEF STEP이 실행되게 할 수 있다.
//JOB18 JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //DEL EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DELETE TEST.SDS1 IF LASTCC=8 THEN SET MAXCC=0 /* //DEF EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DEFINE NONVSAM (NAME(TEST.SDS1) VOLUMES(100000)) /* //
CANCEL
CANCEL 명령어를 만나면 IDCAMS의 실행이 종료되어 CANCEL 명령 이후의 나머지 명령은 처리되지 않는다.
다음 예제는 LASTCC가 4인 경우 다음 THEN 명령을 수행하는 중 CANCEL이 실행되어 IDCAMS의 실행을 종료하는 프로그램의 일부이다.
LISTCAT ENTRIES(MUST.EXIST.SDS) IF LASTCC=4 THEN CANCEL ...
LISCAT으로 지정한 카탈로그 엔트리가 존재하지 않는 경우 컨디션 코드는 4이다. 컨디션 코드가 4인 경우는 메시지 레벨 조건 코드이므로 다음 IDCAMS 명령을 계속 실행하게 된다. 앞의 예제는 MUST.EXIST.SDS이라는 데이터셋이 없는 경우 더 이상 다음 명령을 실행하지 않고 곧 바로 IF 조건이 만족하는 경우 CANCEL 명령을 실행하여 IDCAMS의 실행을 종료한다.
4.4. 비 기능 명령어
IDCAMS의 동작을 위해 실제 기능은 하지 않으나 에러가 발생하지 않도록 처리되는 명령이다.
BLDINDEX
BLDINDEX 명령은 본래 기존에 존재하는 데이터셋에 대한 보조 인덱스를 구성하는 명령이다.
BLDINDEX 명령은 내부적으로 보조 인덱스 클러스터에 하나의 보조 키와 다수 개의 기본 키로 구성되는 레코드를 적재하는 역할을 담당한다.
OpenFrame에서는 데이터셋의 보조 인덱스 구성을 Tibero의 인덱스 기능을 통해 구현하고 있으므로, 이 명령은 실제로 아무 행동도 수행하지 않는다.
BLDINDEX 명령어 구문에서 지정할 수 있는 파라미터는 다음과 같다.
BLDINDEX {INFILE(ddname)|INDATASET(entryname)} {OUTFILE(ddname)|OUTDATASET(entryname)} [CATALOG(catname)]
항목 | 설명 |
---|---|
INFILE| INDATASET |
보조 인덱스를 구성하는데 사용할 베이스 클러스터를 지정한다.
|
OUTFILE| OUTDATASET |
BLDINDEX 결과로 구성되는 보조 인덱스 클러스터를 지정한다. BLDINDEX 전에 보조 인덱스는 미리 DEFINE되어야 한다.
|
CATALOG |
entryname으로 지정된 카탈로그 엔트리를 찾을 때 사용할 카탈로그를 명시적으로 지정한다. 지정하지 않는 경우에는 카탈로그 검색 순서에 따라 결정된다. |
다음은 VSAM.KSDS1의 보조 인덱스인 VSAM.AIX1을 구성하는 예이다.
//JOB03 JOB OBM,CLASS=B,MSGCLASS=X,MSGLEVEL=(1,1) //BLDAIX EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //BASE DD DSN=VSAM.KSDS1,DISP=OLD //AIX DD DSN=VSAM.AIX1,DISP=OLD //SYSIN DD * BLDINDEX INFILE(BASE) - OUTFILE(AIX) /* //
EXAMINE
EXAMINE 명령은 KSDS의 인덱스와 데이터 영역의 무결성을 분석하고 그 결과를 출력하는 명령이다.
OpenFrame에서 이 명령은 실제로 아무 동작도 수행하지 않는다.
EXAMINE 명령어 구문에서 지정할 수 있는 파라미터는 다음과 같다.
EXAMINE {NAME(clustername)} [{INDEXTEST|NOINDEXTEST}] [{DATATEST|NODATATEST}] [ERRORLIMIT(value)]
항목 | 설명 |
---|---|
NAME |
무결성 검사를 수행할 KSDS 또는 사용자 카탈로그 명칭을 지정한다. |
INDEXTEST| NOINDEXTEST |
지정된 클러스터의 인덱스 컴포넌트에 대해 무결성 검사 수행 여부를 결정한다.
|
DATATEST| NODATATEST |
지정된 클러스터의 데이터 컴포넌트에 대해 무결성 검사 수행 여부를 검사한다.
|
ERRORLIMIT |
명령 수행 결과로 출력될 오류 제한 개수를 value로 지정한다. |
다음은 VSAM.KSDS1에 대해 EXAMINE 명령을 수행하는 예이다.
//JOB1 JOB //STP1 EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * EXAMINE - NAME(VSAM.KSDS1) - INDEXTEST - DATATEST - ERRORLIMIT(350) /*
4.5. 관련 환경설정
IDCAMS는 OpenFrame 환경설정에 idcams 서브젝트에 설정한다. 이 설정 파일의 내용을 변경하여 KQCAMS의 몇 가지 동작을 사용자의 요구에 맞게 조정할 수 있다.
idcams 서브젝트에 대한 자세한 내용은 OpenFrame Batch "환경설정 안내서"를 참고한다. |
[참고]
다음은 IDCAMS의 명령 중에서 실제 기능은 하지 않으나 에러가 발생하지 않도록 처리되는 파라미터에 대한 표이다.
명령어 | 파라미터 |
---|---|
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(ddname)] |
|
[SORTMESSAGELEVEL({ALL│CRITICAL│NONE})] |
|
[WORKFILES(ddname[ ddname...]) |
|
DEFINE command |
[ACCOUNT(account-info)] |
[BUFFERSPACE(size)] |
|
[BWO(TYPECICS│TYPEIMS│NO)] |
|
[ERASE│NOERASE] |
|
[EXCEPTIONEXIT(entrypoint)] |
|
[FILE(ddname)] |
|
[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(ddname)])] |
|
[PURGE│NOPURGE] |
|
[SAVRAC│NOSAVRAC] |
|
LISTCAT |
[LIBRARYENTRIES(libent)] |
[PAGESPACE] |
|
[VOLUMEENTRIES(volent)] |
|
[EXPIRATION(days)] |
|
[FILE(ddname)] |
|
[LIBRARY(libname)] |
|
[OUTFILE(ddname)] |
|
[DBCS] |
|
[INSERTSHIFT((offset1 offset2)[(offset1 offset2 )...])│INSERTALL] |
|
[SKIPDBCSCHECK((offset1 offset2) [(offset1 offset2)...])│NODBCSCHECK] |
|
REPRO |
[DBCS] |
[ERRORLIMIT(value)] |
|
[FILE(ddname)] |
|
[INSERTSHIFT((offset1 offset2)[(offset1 offset2 )...])│INSERTALL] |
|
[SKIPDBCSCHECK((offset1 offset2)[(offset1 offset2 )...])│ NODBCSCHECK] |
|
[VOLUMEENTRIES(entryname)] |
|
[ENCIPHER({EXTERNALKEYNAME(keyname)│ INTERNALKEYNAME(keyname)│PRIVATEKEY} [CIPHERUNIT(number│1)] [DATAKEYFILE(ddname)│DATAKEYVALUE(value)] [SHIPKEYNAMES(keyname[ keyname…])] [STOREDATAKEY│NOSTOREDATAKEY] [STOREKEYNAME(keyname)] [USERDATA(value)])] |
|
[DECIPHER ({DATAKEYFILE(ddname)│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)] |
|
[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])] [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)] |
|
[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])] [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])] |
4.6. 유의사항
컨디션 코드(Condition Code)는 IDCAMS가 각각의 명령을 실행한 결과가 정상인지 아니면 명령실행 중에 에러가 발생했는지를 나타내는 일종의 에러 코드이다. 발생 가능한 컨디션 코드는 0, 4, 8, 12, 16이고 큰 값일 수록 명령 실행에 중대한 문제가 있었음을 나타낸다.
각 컨디션 코드 값에 대한 설명은 다음과 같다.
코드 | 설명 |
---|---|
0 |
명령을 정상적으로 처리한 경우 반환되는 코드이며 일부 정보성 메시지가 출력될 수 있다. |
4 |
명령이 완벽하게 처리되지 않았지만 이를 무시하고 추가적인 명령을 수행해도 영구적으로 에러를 발생시키지 않을 것이라고 판단되는 상태로, 추가적인 명령의 수행이 가능하며 경고성 메시지가 함께 출력된다. 예를 들어 LISCAT 명령이 실행될 때 사용자가 지정한 카탈로그 엔트리가 존재하지 않는 경우 컨디션 코드는 4로 설정되고 다음 메시지가 출력된다. IDCAMS: No specified catalog entry found: NOT.EXIST.SDS |
8 |
명령이 의미하는 동작의 일부를 수행하지 않았지만 결과적으로 사용자가 원하는 상태와 동일한 결과로 귀결되는 경우에 해당하는 상태로 추가적인 명령의 수행이 가능하다. 예를 들어 DELETE 명령에 지정한 데이터셋이 존재하지 않는 경우 실제로 DELETE 명령의 완전한 실행은 수행되지 않았지만 결과적으로 지정한 데이터셋이 없다는 상태는 동일하게 된다. 이 경우 추가적인 명령의 실행에 문제는 없으므로 컨디션 코드는 8로 설정되고 경고성 메시지가 출력된다. IDCAMS(WARNING): No such catalog entry - 'NOT.EXIST.SDS' |
12 |
명령의 수행 과정 중 에러가 있어서 꼭 수행되어야 하는 동작이나 기능을 완료할 수 없는 경우에 발생한다. 이러한 에러(logical error)는 동시에 지정할 수 없는 논리적으로 불일치하는 파라미터를 지정하는 경우이거나 꼭 지정되어야 하는 필수 파라미터가 생략된 경우 혹은 데이터셋의 키 길이, 레코드 크기 등으로 지정한 값이 올바르지 않을 때 발생한다. 이러한 상황이 발생한 경우 컨디션 코드는 12로 설정되고 에러 메시지가 출력된다. IDCAMS(ERROR): {error description or logical error code} |
16 |
현재 명령을 수행하는 과정에서 심각한 에러가 발생하여 사용자가 지정한 나머지 명령을 실행할 수 없는 경우에 반환되는 컨디션 코드 값이다. 다음과 같은 경우에 해당 코드가 발생한다.
IDCAMS(ERROR): {error description or logical error code} 또는 IDCAMS(FATAL): {error description} |
조건 코드 변수명 (LASTCC와 MAXCC)
IDCAMS는 LASTCC 및 MAXCC라는 변수에 컨디션 코드 값을 저장한다.
LASTCC에는 최근 실행한 명령의 컨디션 코드가 저장되고, MAXCC에는 기존에 발생한 컨디션 코드 중에서 가장 큰 값이 저장된다. LASTCC 및 MAXCC는 SET 명령을 이용해서 사용자가 직접 설정할 수 있다.
다음은 NOT.EXIST.SDS 데이터셋을 삭제한 후 LASTCC의 값이 8이면 강제적으로 MAXCC를 0으로 설정하는 예이다.
DELETE NOT.EXIST.SDS IF LASTCC = 8 THEN SET MAXCC=0 DEFINE ...
5. IEBCOMPR
2개의 SDS나 PDS를 비교조건을 통해 비교 후 그 결과를 출력하는 유틸리티 프로그램이다.
IEBCOMPR 유틸리티 프로그램은 다음과 같은 기능을 수행할 수 있다.
-
두 SDS를 비교한다.
-
두 PDS를 비교한다.
-
PDS의 특정 멤버만 선택해서 비교한다.
-
비교의 결과가 불일치할 경우 그 결과를 프린트한다.
5.1. DD 설정
DD 설정 항목은 다음과 같다.
항목 | 설명 |
---|---|
SYSPRINT DD |
IEBCOMPR 메시지가 저장되는 데이터셋을 기술한다. |
SYSUT1 DD |
비교하는 순차 데이터셋이나 PDS 타입의 입력 데이터셋을 기술한다. |
SYSUT2 DD |
비교되는 순차 데이터셋이나 PDS 타입의 입력 데이터셋을 기술한다. |
SYSIN DD |
IEBCOMPR 명령어를 기술한다. |
5.2. 명령어 설정
본 절에서는 IEBCOMPR 명령어에 대해 설명한다.
COMPARE
비교하는 데이터셋의 편성, 비교 처리의 중단에 관한 지시, 비교하는 레코드나 필드 등을 지정하는 제어문이다.
COMPARE 명령어 형식은 다음과 같다.
[label] COMPARE [FIELD=(length[,starting-location]) | MASK=(length, starting-location)] [,LIMIT=n] [,MAXNAME=n] [,STRTAFT=n] [,STOPAFT=n] [,TYPORG={PS|PO}] [,DFOFFSET] [,DFOFFSET_ALL] [,MAXIGNORE] [,NOLIMIT]
항목 | 설명 |
---|---|
FIELD |
레코드 내의 필드를 비교할 경우에 설정한다. 이 지정을 생략했을 경우 레코드 전체가 비교된다. 복수로 설정하는 경우 동시에 여러 필드를 비교한다. MASK 옵션과 같이 사용할 수 없다.
|
MASK |
레코드 내의 필드를 제외하고 비교할 경우 설정한다. FIELD 옵션과 같이 사용할 수 없다.
|
LIMIT |
레코드의 비교 도중 동일하지 않은 연속한 레코드의 수가 설정한 값과 일치했을 때 레코드의 비교를 중지한다. 복수의 멤버를 지정했을 경우 다음 멤버의 비교를 개시한다. SDS 또는 1개의 멤버를 비교할 때는 처리를 종료한다. n은 1~ 32760의 10진수로 설정한다. 이 설정을 생략했을 경우나 0으로 입력했을 경우 LIMIT=10이 지정된 것으로 간주한다. |
MAXNAME |
MEMBER 제어문으로 지정하는 멤버명의 수 이상의 값을 설정한다. n은 1~32760의 10진수로 설정한다. MEMBER 제어문이 없는 경우 지정해도 무시한다. |
STRTAFT |
순차 데이터셋을 비교하기 전 스킵할 논리 레코드의 개수를 설정한다. 데이터셋의 n+1번째 논리 레코드부터 비교된다. 레코드의 범위는 32760를 초과하지 않으며, 초과할 경우 에러 메시지를 출력한다. 생략했을 경우 첫 레코드부터 비교한다. |
STOPAFT |
비교할 순차 데이터셋의 논리 레코드 개수를 설정한다. 순서 데이터셋 또는 구분 데이터셋의 각 멤버를 비교하는 레코드 수를 설정한다. 레코드의 범위는 32760를 초과하지 않으며, 초과할 경우 에러 메시지를 출력한다. 생략했을 경우 최종 레코드까지 비교한다. |
TYPORG |
입력 데이터셋이 순차 데이터셋(PS)인지 분할 데이터셋(PO)인지 기술한다. (기본값: PS) |
DFOFFSET |
레코드 다른 부분의 첫 번째 위치를 출력한다. DFOFFSET_ALL과 같이 지정하면 DFOFFSET_ALL로 동작한다. |
DFOFFSET_ALL |
레코드 다른 부분의 모든 위치를 출력한다. |
MAXIGNORE |
LIMIT, STRTAFT, STOPAFT 의 최대 값 제한을 해제한다. (지정 안할 경우 최댓값: 32760) |
NOLIMIT |
지정할 때 LIMIT 체크를 안하고 레코드 끝까지 비교한다. |
MEMBER
입력 데이터셋이 PDS일 때, 비교하는 멤버의 멤버명을 지정하는 제어문이다.
-
모든 멤버를 비교할 때는 생략할 수 있다.
-
모든 멤버를 비교할 때는 이름이 같은 경우만 비교한다.
본 제어문으로 지정한 멤버명의 수 이상을 COMPARE 제어문의 MAXNAME 파라미터로 지정해야 한다.
[label] MEMBER NAME={member-name | (sysut1-member-name,sysut2-member-name)}[,...]
항목 | 설명 |
---|---|
NAME |
비교하는 멤버의 멤버명을 설정한다.
|
LABELS
유저 라벨의 처리할 때 기술한다. 파싱만 지원한다.
EXITS
출구 루틴을 사용할 때 기술한다. 파싱만 지원한다.
5.3. 사용예제
다음은 필드를 지정해서 데이터를 비교하는 예이다. IEBCOMPR.TEST.INPUT01과 IEBCOMPR.TEST.INPUT02의 첫 필드부터 11번째 필드와 15번째 필드부터 길이 5만큼의 필드를 비교한다.
불일치한 경우 그 결과를 출력해준다.
//TEST JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JOBSTEP EXEC PGM=IEBCOMPR //SYSUT1 DD DSNAME=IEBCOMPR.TEST.INPUT01,DISP=(SHR) //SYSUT2 DD DSNAME=IEBCOMPR.TEST.INPUT02,DISP=(SHR) //SYSPRINT DD SYSOUT=A //SYSIN DD * COMPARE FIELD=11,FIELD(5,15),TYPORG=PS /*
다음은 제외할 필드를 지정해서 지정된 필드를 제외하고 데이터를 비교하는 예이다. IEBCOMPR.TEST.INPUT01과 IEBCOMPR.TEST.INPUT02의 15번째 필드부터 길이 7만큼의 필드는 제외하고 비교한다.
//TEST JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JOBSTEP EXEC PGM=IEBCOMPR //SYSUT1 DD DSNAME=IEBCOMPR.TEST.INPUT01,DISP=(SHR) //SYSUT2 DD DSNAME=IEBCOMPR.TEST.INPUT02,DISP=(SHR) //SYSPRINT DD SYSOUT=A //SYSIN DD * COMPARE MASK=(7,15),TYPORG=PS /*
다음은 레코드를 지정해서 데이터를 비교하는 예이다. IEBCOMPR.TEST.INPUT01과 IEBCOMPR.TEST.INPUT02의 2번째 레코드까지 비교를 스킵하고 3번째 레코드부터 7개의 레코드를 비교한다.
불일치하는 연속한 레코드의 수가 3과 일치했을 때 비교를 중지한다.
불일치한 경우 그 결과를 출력해준다.
//TEST JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JOBSTEP EXEC PGM=IEBCOMPR //SYSUT1 DD DSNAME=IEBCOMPR.TEST.INPUT01,DISP=(SHR) //SYSUT2 DD DSNAME=IEBCOMPR.TEST.INPUT02,DISP=(SHR) //SYSPRINT DD SYSOUT=A //SYSIN DD * COMPARE LIMIT=3,STRTAFT=2,STOPAFT=7,TYPORG=PS /*
다음은 멤버명이 같은 멤버를 지정해서 데이터를 비교하는 예이다. IEBCOMPR.TEST.INPUT01과 IEBCOMPR.TEST.INPUT02의 멤버 A,B,C를 비교한다.
불일치한 경우 그 결과를 출력해준다.
//TEST JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JOBSTEP EXEC PGM=IEBCOMPR //SYSUT1 DD DSNAME=IEBCOMPR.TEST.INPUT01,DISP=(SHR) //SYSUT2 DD DSNAME=IEBCOMPR.TEST.INPUT02,DISP=(SHR) //SYSPRINT DD SYSOUT=A //SYSIN DD * COMPARE MAXNAME=3,TYPORG=PO MEMBER NAME=A,B,C /*
다음은 멤버명이 다른 멤버를 지정해서 데이터를 비교하는 예이다. IEBCOMPR.TEST.INPUT01의 멤버 A, B, D와 IEBCOMPR.TEST.INPUT02의 멤버 A, C, D를 비교한다.
불일치한 경우 그 결과를 출력해준다.
//TEST JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JOBSTEP EXEC PGM=IEBCOMPR //SYSUT1 DD DSNAME=IEBCOMPR.TEST.INPUT01,DISP=(SHR) //SYSUT2 DD DSNAME=IEBCOMPR.TEST.INPUT02,DISP=(SHR) //SYSPRINT DD SYSOUT=A //SYSIN DD * COMPARE MAXNAME=4,TYPORG=PO MEMBER NAME=A,(B,C),D /*
5.4. 유의사항
IEBCOMPR 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.
-
정상적으로 실행한 경우
Batch 애플리케이션에서 받은 코드를 반환한다.
-
에러가 발생한 경우
해당 에러 메시지를 SYSPRINT DD에 출력하고 에러에 해당하는 코드를 반환한다.
IEBCOMPR 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.
코드 설명 8
동일하지 않은 레코드가 1개 이상 있을 경우 복귀 코드는 8이다.
동일하지 않은 레코드가 LIMIT 파라미터로 지정한 값 이상 있을 때 해당된다.
-
PDS인 경우 다음의 멤버를 처리한다. 복귀 코드는 8이다.
12
동일하지 않은 레코드가 LIMIT 파라미터로 지정한 값 이상 있을 때 해당된다.
-
SDS인 경우에만 해당된다.
Unrecoverable 형태의 에러로 다음의 경우가 해당된다.
-
데이터셋 관련(pgmdd, open/close, read/write) 에러
-
SYSIN DD 명령어 문법 에러
-
기타 IEBCOMPR 유틸리티 프로그램 에러
16
시스템 에러와 관련된 에러로 다음의 경우가 해당된다.
-
OpenFrame 시스템 라이브러리 초기화 실패
-
6. IEBCOPY
1개 이상의 PDS에 대해서 멤버들을 전체 또는 일부만 복사하거나 병합하는 유틸리티 프로그램이다.
IEBCOPY 유틸리티 프로그램으로 다음과 같은 기능을 수행할 수 있다.
-
PDS에 대해 복사 또는 병합 기능을 수행한다.
-
PDS의 내용을 SDS에 복사한다.
-
PDS를 복사한 SDS의 내용을 PDS에 복사한다.
-
PDS의 특정 멤버만 선택해서 복사하고, 선택된 멤버 이름을 재정의한다.
-
PDS의 특정 멤버만 제외하고 복사한다.
-
PDS 멤버를 교체한다.
6.1. DD 설정
DD 설정 항목은 다음과 같다.
항목 | 설명 |
---|---|
SYSPRINT DD |
IEBCOPY 메시지를 저장하는 데이터셋을 정의한다. |
SYSUT1 DD 또는 user_defined_name1 DD |
PDS, SDS 타입의 입력 데이터셋을 정의한다. 이때, SDS 타입의 데이터셋은 IEBCOPY의 OUTDD 통해 PDS 정보와 레코드가 출력되어 IEBCOPY가 읽어 들일 수 있는 형식을 가진 데이터셋이어야 한다. |
SYSUT2 DD 또는 user_defined_name2 DD |
PDS, SDS 타입의 출력 데이터셋을 정의한다. SDS 타입의 데이터셋인 경우, SYSUT1에서 읽어 들인 PDS 정보와 멤버 순서대로 IEBCOPY의 형식에 맞게 레코드를 기록한다. |
SYSIN DD |
IEBCOPY 명령어를 정의한다. |
6.2. 명령어 설정
IEBCOPY에서는 2가지 방법으로 명령어를 설정할 수 있다. JCL의 EXEC 문의 PARM 파라미터를 이용하여 명령어를 기술하거나 JCL의 SYSIN 문에 명령어를 기술할 수 있다.
다음과 같은 명령어 약자를 사용할 수 있다.
명령어 | 약어 |
---|---|
COPY |
C |
EXCLUDE |
E |
SELECT |
S |
OUTDD |
O |
INDD |
I |
LIST |
L |
MEMBER |
M |
EXEC PARM
EXEC 문의 PARM 파라미터 명령어 구문은 다음과 같다.
//[stepname] EXEC PGM=IEBCOPY[,PARM=<parms>]
항목 | 설명 |
---|---|
PARM |
PARM 파라미터의 parms 값으로 다음 3가지 중 하나의 명령어를 설정한다.
|
COPY
PDS의 멤버를 복사한다.
SYSIN DD의 COPY 명령어 구문은 다음과 같다.
[label] COPY OUTDD=ddname, INDD=[(]{ddname|(ddname,R)}[,...][)] [,LIST={YES|NO}]
항목 | 설명 |
---|---|
OUTDD |
출력 데이터셋을 위한 DD 이름을 기술한다. |
INDD |
입력 데이터셋을 위한 DD 이름을 기술한다. 출력 데이터셋에 복사하려는 멤버가 이미 존재하고 있는 경우 R(REPLACE) 파라미터가 있으면 오버라이드하고 없으면 복사하지 않는다. |
LIST |
SYSPRINT에 복사한 멤버들의 이름을 기록하고 기본값은 YES이다. 만약 LIST가 기술되지 않으면 EXEC PARM의 내용이 적용된다. |
INDD
COPY 문 다음에 설정하며, 설정한 순서로 입력 데이터셋을 출력 데이터셋으로 새로운 COPY 작업을 수행한다.
COPY 문의 서브 명령어로 쓰이는 INDD에 대해서는 여러 개의 입력 데이터셋에 대하여 각각 EXCLUDE 문이나 SELECT 문을 적용하기 어렵지만, INDD 문을 사용하면 여러 개의 입력 데이터셋에 대하여 각각 EXCLUDE 문과 SELECT 문을 사용할 수 있다.
EXCLUDE
EXCLUDE 문은 COPY 문 다음에 설정하며, COPY 문을 수행할 때 입력 데이터셋에서 특정 멤버를 제외한다. 이 구문은 아래 나오는 SELECT 문과 함께 사용할 수 없다. EXCLUDE 문과 SELECT 문 모두 지정하지 않으면, 데이터셋 전체에 대한 COPY 작업을 수행한다.
EXCLUDE 문의 구문은 다음과 같다.
[label] EXCLUDE MEMBER=[(] name1[,name2][,...][)]
항목 | 설명 |
---|---|
MEMBER |
복사하지 않을 멤버의 이름을 기술한다. 해당 멤버들은 COPY 문을 수행할 때 복사 대상에서 제외된다. |
SELECT
SELECT 문은 COPY 문 다음에 설정하며, 입력 데이터셋의 특정 멤버를 선택하여 새로운 이름으로 COPY 작업을 수행한다.
SELECT 문의 구문은 다음과 같다.
[label] SELECT MEMBER=({name1|(name1,newname1[,R])|(name1,,R)} [,{name2|(name2,newname2[,R])|(name2,,R)}][,...])
항목 | 설명 |
---|---|
MEMBER |
name 필드에 기술한 입력 데이터셋의 멤버를 newname 필드에서 지정한 새로운 이름으로 복사한다. newname 필드를 지정하지 않은 경우 name 필드에 기술한 멤버명과 동일한 이름을 사용한다. R(REPLACE) 파라미터를 선택하면 입력 데이터셋의 멤버 이름과 출력 데이터셋의 멤버 이름이 같을 경우 입력 데이터셋의 멤버를 출력 데이터셋의 멤버로 오버라이드한다. |
6.3. 사용예제
다음은 PDS DATASET1을 PDS DATASET2로 전체 데이터셋을 복사하는 예이다.
//COPYALL JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JOBSTEP EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=A //SYSUT1 DD DSNAME=DATASET1,DISP=(SHR,KEEP) //SYSUT2 DD DSNAME=DATASET2,UNIT=disk,VOL=SER=200000, // DISP=(NEW,CATLG) //SYSIN DD DUMMY
다음처럼 DATASET1의 모든 멤버 A, B, F가 PDS DATASET2로 모두 복사된다.
다음은 4개의 데이터셋을 병합하는 예이다. 이미 존재하고 있는 데이터셋 DATASET5에 DATASET1, DATASET3, DATASET4의 멤버가 복사되어 병합된다. SYSIN DD의 명령어 INDD 순서에 따라 DATASET1이 먼저 복사되고, DATASET4, DATASET3의 순서로 복사된다.
//MERGE JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JOBSTEP EXEC PGM=IEBCOPY //SYSPRINT DD SYSOUT=A //IN01 DD DSNAME=DATASET1,DISP=(SHR,KEEP) //IN02 DD DSNAME=DATASET3,DISP=(SHR,KEEP) //OUT01 DD DSNAME=DATASET5,DISP=(SHR,KEEP) //IN03 DD DSNAME=DATASET4,DISP=(SHR,KEEP) //SYSIN DD * COPYOPER COPY OUTDD=OUT01,INDD=IN01,INDD=IN03,INDD=IN02 /*
IEBCOPY가 시작되기 전 DATASET5에는 A라는 멤버가 존재하고 있다. DATASET1이 최초로 복사되는데 A라는 멤버는 이미 OUTPUT에 있고, REPLACE 조건이 없으므로 A는 복사되지 않고 B와 F만 복사된다. 다음으로 DATASET4가 복사되는데 멤버 B 역시 이미 OUTPUT에 있으므로 복사되지 않고 멤버 D와 X만 복사된다. 마지막으로 DATASET3이 복사된다. 멤버 F와 X가 이미 OUTPUT에 있으므로 복사되지 않고 멤버 C와 Y만 복사된다.
다음 그림은 위의 예제를 실행하면서 출력 데이터셋에 멤버가 복사되는 과정과 최종 복사된 멤버를 보여준다.
다음은 입력 데이터셋에서 특정 멤버를 선택하거나 제외하여 복사하는 예이다.
//SELECT JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JOBSTEP EXEC PGM=IEBCOPY //IN01 DD DSNAME=DATASET4,DISP=(SHR,KEEP) //IN02 DD DSNAME=DATASET3,DISP=(SHR,KEEP) //OUT01 DD DSNAME=DATASET6,DISP=(OLD,KEEP) //SYSPRINT DD SYSOUT=* //SYSIN DD * COPYOPER COPY OUTDD=OUT01 INDD=IN01 EXCLUDE MEMBER=X INDD=IN02 SELECT MEMBER=((F,Z),(C,A,R),(Y,,R)) /*
IEBCOPY가 실행되기 전에 DATASET6에는 멤버 A, K, Y가 있다. INDD=IN01에 의해 먼저 DATASET4가 복사되는데, EXCLUDE문에 의해 멤버 X는 제외하고, 멤버 B와 D가 복사된다. INDD=IN02에 의해 DATASET3이 복사된다. SELECT 문에 의해 멤버 F가 새로운 이름 Z로 복사되고, 멤버 C가 새로운 이름 A로 복사된다. 이때 DATASET6에 이미 멤버 A가 있으므로 내용을 오버라이드한다. 만약 REPLACE가 지정되지 않았다면, 복사하지 않고 다음 처리로 넘어간다. 마지막으로 멤버 Y가 기존 멤버 Y를 오버라이드한다.
다음 그림은 앞의 예제를 실행하면서 출력 데이터셋에 멤버가 복사되는 과정과 최종 복사된 멤버를 보여준다.
다음은 INDD 문을 사용하여 여러 개의 INPUT을 다르게 처리하는 경우의 예이다.
//INDD01 JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JOBSTEP EXEC PGM=IEBCOPY //IN01 DD DSNAME=DATASET11,DISP=(SHR,KEEP) //IN02 DD DSNAME=DATASET12,DISP=(SHR,KEEP) //IN03 DD DSNAME=DATASET13,DISP=(SHR,KEEP) //OUT01 DD DSNAME=DATASET14,DISP=(OLD,KEEP) //SYSPRINT DD SYSOUT=* //SYSIN DD * COPYOPER COPY OUTDD=OUT01 INDD=IN01 EXCLUDE MEMBER=B INDD=IN02 SELECT MEMBER=((B,,R),(Y,N)) INDD=IN03 /*
IN01 DD에 정의된 데이터셋 DATASET11로부터 멤버 B를 제외한 다른 멤버 A와 C를 복사한다. IN02 DD에 정의된 데이터셋 DATASET12로부터 멤버 B’를 교체하고, 멤버 Y의 이름을 바꾸어 N으로 복사한다. IN03 DD에 정의된 데이터셋 DATASET13으로부터 전체 멤버를 복사한다. 단, 같은 이름의 멤버가 이미 존재할 경우 교체하지 않는다.
다음은 COPY 문의 서브 명령어로 INDD를 사용하는 경우의 예이다.
//INDD01 JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //JOBSTEP EXEC PGM=IEBCOPY //IN01 DD DSNAME=DATASET11,DISP=(SHR,KEEP) //IN02 DD DSNAME=DATASET12,DISP=(SHR,KEEP) //IN03 DD DSNAME=DATASET13,DISP=(SHR,KEEP) //OUT01 DD DSNAME=DATASET14,DISP=(OLD,KEEP) //SYSPRINT DD SYSOUT=* //SYSIN DD * COPYOPER COPY OUTDD=OUT01,INDD=(INO1,(IN02,R),IN03) /*
IN01 DD에 정의된 데이터셋 DATASET11로부터 전체 멤버를 복사한다. 단, 같은 이름의 멤버가 이미 존재할 경우 교체하지 않는다. IN02 DD에 정의된 데이터셋 DATASET12로부터 전체 멤버를 복사한다. 멤버 B’은 교체된다. IN03 DD에 정의된 데이터셋 DATASET13으로부터 전체 멤버를 복사한다. 같은 이름의 멤버가 이미 존재할 경우 교체하지 않는다.
6.4. 유의사항
IEBCOPY 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.
-
정상적으로 실행한 경우
Batch 애플리케이션에서 받은 코드를 반환한다.
-
에러가 발생한 경우
해당 에러 메시지를 SYSPRINT DD에 출력하고 에러에 해당하는 코드를 반환한다.
IEBCOPY 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.
코드 설명 12
Unrecoverable 형태의 에러로 다음의 경우가 해당된다.
-
데이터셋 관련(pgmdd, open/close, read/write) 에러
-
SYSIN DD 명령어 문법 에러
-
기타 IEBCOPY 유틸리티 프로그램 에러
16
시스템 에러와 관련된 에러로 다음의 경우가 해당된다.
-
OpenFrame 시스템 라이브러리 초기화 실패
-
7. IEBDG
테스트 데이터셋을 생성하는 유틸리티 프로그램이다. SYSIN DD에 데이터의 패턴을 지정하여 테스트 데이터셋을 생성한다.
7.1. DD 설정
DD 설정 항목은 다음과 같다.
항목 | 설명 |
---|---|
SYSPRINT DD |
IEBDG 메시지를 저장하는 데이터셋을 정의한다. |
user_defined_name1 DD |
JCL이 저장된 입력 데이터셋이나 데이터셋의 멤버를 기술한다. |
user_defined_name2 DD |
새로 생성된 JCL을 저장할 데이터셋이나 데이터셋의 멤버를 기술한다. |
SYSIN DD |
IEBDG의 명령어를 기술한다. |
7.2. 명령어 설정
본 절에서는 SYSIN DD에서 설정하는 IEBDG의 명령어에 대해서 설명한다.
DSD
DSD명령어는 IEBDG를 통해 실행하는 명령어의 시작을 의미하며, 테스트 데이터 생성에 이용할 입력 데이터셋과 테스트 데이터가 출력될 출력 데이터셋을 지정한다. 최소 1개 이상의 DSD가 존재해야 하며 END 문으로 끝나야 한다.
DSD 명령문의 구문은 다음과 같다.
[label] DSD OUTPUT=(ddname) [,INPUT=(ddname1[,ddname2][,...])]
항목 | 설명 |
---|---|
OUTPUT |
출력 데이터셋의 DD를 지정한다. |
INPUT |
입력으로 이용할 데이터셋들의 DD를 지정한다. |
FD
테스트 데이터가 출력될 출력 데이터의 필드 형식을 지정한다.
FD 명령문의 구문은 다음과 같다.
[label] FD NAME=name ,LENGTH=length [,STARTLOC=starting-location] [,FILL={'character'|X'nn'}] [,{FORMAT=pattern[,CHARACTER=character] |PICTURE=length,{'character-string'|P'n'|B'n'}}] [,SIGN=sign] [,ACTION={FX|RO|RP|SL|SR|TL|TR|WV} [,INDEX=n[,CYCLE=n][,RANGE=n]]
항목 | 설명 |
---|---|
NAME |
필드의 이름을 지정한다. CREATE 명령의 NAME 문을 사용하여 필드이름을 지정할때 이용된다. |
LENGTH |
필드의 길이를 지정한다. |
STARTLOC |
레코드 내에 필드의 시작위치를 지정한다. |
FILL |
기본적으로 필드를 채울 값을 지정한다. 작은따옴표(' ') 안에 character를 두거나 헥사 값을 입력하는 2가지 방법이 있다.
|
FORMAT |
필드를 채울 패턴을 지정한다. pattern에는 다음과 같은 값이 올 수 있다.
|
CHARACTER |
패턴의 시작 문자를 지정한다. |
PICTURE |
사용자가 패턴을 직접 정의하여 사용한다. LENGTH에서 지정한 필드 길이만큼 지정하며 LENGTH의 길이보다 크게 지정이 되면 그 이후 패턴은 무시된다(위에서 기술한 FORMAT 문과 같이 사용하지 않는다). |
SIGN |
PACKED DECIMAL이나 바이너리 필드의 부호를 결정한다. |
ACTION |
필드의 내용이 변경되는 방법을 지정한다. 현재는 PICTURE를 통해 사용자가 직접 지정한 문자열 타입의 필드 또는 FORMAT의 AL,AN 필드에 대해서만 동작한다.
|
INDEX |
레코드가 추가될 때마다 필드 값을 증가시킬 십진수를 지정한다. FORMAT이 ZD, PD, BI이거나 PICTURE를 지정한 경우에 이용할 수 있다. 단, PICTURE의 'character-string’의 뒷 부분은 숫자형으로 구성되어야 한다.
|
REPEAT
REPEAT 명령문은 CREATE 명령문 그룹이 몇 번 반복되어 실행할지 지정한다.
REPEAT 명령문의 구문은 다음과 같다.
[label] REPEAT QUANTITY=number[,CREATE=number]
항목 | 설명 |
---|---|
QUANTITY |
CREATE 명령문의 그룹이 반복될 횟수를 지정한다. |
CREATE |
CREATE 명령문의 그룹을 구성하는 CREATE 명령문의 갯수를 지정한다. (기본값: 1) |
CREATE
CREATE 명령문은 출력 데이터셋의 레코드 구성을 정의한다.
CREATE 명령문의 구문은 다음과 같다.
[label] CREATE [QUANTITY=n] [,FILL={'character'|X'nn'}] [,INPUT={ddname|SYSIN[({cccc|$$$E})]}] [,PICTURE=length,startloc,{'character-string'| P'n'|B'n'}] [,NAME={(namelist)| (namelist-or-(copygroup))} [,EXIT=routinename]
항목 | 설명 |
---|---|
QUANTITY |
CREATE 문에 의해서 생성될 레코드 개수를 지정한다. (기본값: 1) |
FILL |
기본적으로 필드를 채울 값을 지정한다. 작은따옴표(' ') 안에 character를 두거나 헥사 값을 입력하는 2가지 방법이 있다.
|
INPUT |
입력으로 이용할 데이터셋들의 DD를 지정한다. DD 대신 SYSIN을 통해 입력 데이터를 직접 JCL 내에 기술할 수 있으며 데이터의 끝은 '$$$E’로 표시한다. SYSIN의 'cccc' 기능은 지원하지 않는다.
|
PICTURE |
사용자가 패턴을 직접 정의한다. |
NAME |
입력으로 사용할 namelist를 기술한다. namelist만으로 기술하거나, namelist와 copygroup를 혼용할 수 있다.
사용방법은 다음과 같다.
|
EXIT |
현재 지원하지 않는다. |
END
END 명령문은 DSD 명령문과 한쌍을 이루며, 명령문의 끝을 의미한다.
END 명령문의 구문은 다음과 같다.
[label] END
7.3. 사용예제
다음은 2개의 CREATE 명령문을 사용하여 각각의 필드에 맞추어 OUTPUT DD에 저장하는 예이다.
첫 번째 CREATE 명령문은 총 3개의 필드명(REC01NAME,REC01FD01,REC01FD02)을 가지고 1줄을 출력한다. 두 번째 CREATE 명령문은 총 4개의 필드명(EC02NAME,REC02FD01,REC02FD02,REC02FD03)을 가지고 2줄을 출력한다.
//GENDAT0 JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //STEP1 EXEC PGM=IEBDG //OUTPUT DD DSN=IEBDG.DATASET.OUT01,DISP=(NEW,CATLG,DELETE), // DCB=(RECFM=VB,LRECL=32760) //SYSIN DD DATA DSD OUTPUT=(OUTPUT) FD NAME=REC01NAME,LENGTH=12,PICTURE=12,'RECORD01 ' FD NAME=REC01FD01,LENGTH=7,PICTURE=7,'A000001',INDEX=1 FD NAME=REC01FD02,LENGTH=4993,FORMAT=AL,ACTION=TL FD NAME=REC02NAME,LENGTH=12,PICTURE=12,'RECORD02 ' FD NAME=REC02FD01,LENGTH=7,PICTURE=7,'A000001',INDEX=1,CYCLE=2 FD NAME=REC02FD02,LENGTH=8,PICTURE=8,'AM000001',INDEX=1 FD NAME=REC02FD03,LENGTH=4985,FORMAT=AL REPEAT QUANTITY=131072,CREATE=2 CREATE QUANTITY=1,NAME=(REC01NAME,REC01FD01,REC01FD02) CREATE QUANTITY=2,NAME=(REC02NAME,REC02FD01,REC02FD02,REC02FD03) END /* //SYSPRINT DD SYSOUT=*
다음은 앞의 예제에 대한 결과로 생성된 출력 데이터셋의 레코드로 총 레코드건수는 393,216건, 각 레코드의 길이는 5012Bytes이다.
RECORD01 A000001ABCDEFGHIJKLMNOPQRSTUVWXYZ... RECORD02 A000001AM000001ABCDEFGHIJKLMNOPQR... RECORD02 A000001AM000002ABCDEFGHIJKLMNOPQR... RECORD01 A000002 BCDEFGHIJKLMNOPQRSTUVWXYZ... RECORD02 A000002AM000003ABCDEFGHIJKLMNOPQR... RECORD02 A000002AM000004ABCDEFGHIJKLMNOPQR... RECORD01 A000003 CDEFGHIJKLMNOPQRSTUVWXYZ... RECORD02 A000003AM000005ABCDEFGHIJKLMNOPQR... RECORD02 A000003AM000006ABCDEFGHIJKLMNOPQR... RECORD01 A000004 DEFGHIJKLMNOPQRSTUVWXYZ... RECORD02 A000004AM000007ABCDEFGHIJKLMNOPQR... RECORD02 A000004AM000008ABCDEFGHIJKLMNOPQR... RECORD01 A000005 EFGHIJKLMNOPQRSTUVWXYZ... RECORD02 A000005AM000009ABCDEFGHIJKLMNOPQR... RECORD02 A000005AM000010ABCDEFGHIJKLMNOPQR... RECORD01 A000006 FGHIJKLMNOPQRSTUVWXYZ... RECORD02 A000006AM000011ABCDEFGHIJKLMNOPQR... RECORD02 A000006AM000012ABCDEFGHIJKLMNOPQR... RECORD01 A000007 GHIJKLMNOPQRSTUVWXYZ... RECORD02 A000007AM000013ABCDEFGHIJKLMNOPQR... RECORD02 A000007AM000013ABCDEFGHIJKLMNOPQR... ... RECORD01 A131071 ... RECORD02 A131071AM262141ABCDEFGHIJKLMNOPQR... RECORD02 A131071AM262142ABCDEFGHIJKLMNOPQR... RECORD01 A131072 ... RECORD02 A131072AM262143ABCDEFGHIJKLMNOPQR... RECORD02 A131072AM262144ABCDEFGHIJKLMNOPQR...
다음은 2개의 CREATE 명령문을 사용하여 2개의 필드를 지정하고 각각의 ACTION을 지정한 경우이다.
첫 번째 FIELD 명령문은 LENGTH를 10으로 지정하고 5bytes 길이의 사용자 정의 PICTURE 패턴을 지정한 다음 ACTION으로 RO를 부여했다. 두 번째 FIELD 명령문은 LENGTH를 10으로 지정하고 5bytes 길이의 사용자 정의 PICTURE 패턴을 지정한 다음 ACTION으로 WV를 부여했다. CREATE 문으로 두 개의 필드를 사용해 레코드를 출력한다.
//IEBDGJ14 JOB //JSTEP010 EXEC PGM=IEBDG //SYSPRINT DD SYSOUT=* //OUTPUT01 DD DSN=OF71.IEBDG01.DATA01,DISP=(NEW,CATLG,CATLG), // DCB=(RECFM=FB,DSORG=PS,LRECL=40), // VOL=SER=DEFVOL //SYSIN DD * DSD OUTPUT=(OUTPUT01) FD NAME=RFDN001,LENGTH=10,PICTURE=5,'A0001',ACTION=RO FD NAME=RFDN002,LENGTH=10,PICTURE=5,'A0001',ACTION=WV REPEAT QUANTITY=1 CREATE QUANTITY=20,NAME=(RFDN001,RFDN002) END /*
다음은 앞의 예제에 대한 결과로 생성된 출력 데이터셋의 레코드로 필드에 주어진 10bytes 안에서 각 필드의 ACTION에 따라 패턴을 이동하며 레코드를 출력한다.
A0001 A0001.................... A0001 A0001 .................... A0001 A0001 .................... A0001 A0001 .................... A0001 A0001 .................... A0001 A0001 .................... A0001 A0001.................... A0001 A0001 .................... A0001 A0001 .................... A0001 A0001 .................... A0001 A0001 .................... A0001 A0001 .................... A0001 A0001.................... A0001 A0001 .................... A0001 A0001 .................... A0001 A0001 .................... A0001 A0001 .................... A0001 A0001 .................... A0001 A0001.................... A0001 A0001 ....................
다음은 4개의 CREATE 명령문에 NAME 파라미터를 지정하여 레코드를 출력하는 경우이다.
4개의 문자열 필드를 생성하고 각각 ACTION을 지정한 다음 CREATE 문에서 NAME 파라미터에 copygroup을 명시해 반복 출력할 필드 명을 기록하였다.
//IEBDGJ03 JOB //JSTEP010 EXEC PGM=IEBDG //SYSPRINT DD SYSOUT=* //OUTPUT01 DD DSN=OF71.IEBDG01.DATA01,DISP=(NEW,CATLG,CATLG), // DCB=(RECFM=FB,DSORG=PS,LRECL=40), // VOL=SER=DEFVOL //SYSIN DD * DSD OUTPUT=(OUTPUT01) FD NAME=RFDN001,LENGTH=10,FORMAT=AL,ACTION=TL FD NAME=RFDN002,LENGTH=10,FORMAT=AL,ACTION=TR FD NAME=RFDN003,LENGTH=10,FORMAT=AL,ACTION=SL FD NAME=RFDN004,LENGTH=10,FORMAT=AL,ACTION=SR REPEAT QUANTITY=1,CREATE=4 CREATE QUANTITY=10,NAME=((COPY=4,RFDN001)) CREATE QUANTITY=10,NAME=((COPY=4,RFDN002)) CREATE QUANTITY=10,NAME=((COPY=4,RFDN003)) CREATE QUANTITY=10,NAME=((COPY=4,RFDN004)) END /*
다음은 앞의 예제에 대한 결과로 CREATE 문의 NAME 파라미터에 지정한 copygroup으로 인해 4개의 필드가 반복되어 출력되었다.
ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ BCDEFGHIJ BCDEFGHIJ BCDEFGHIJ BCDEFGHIJ CDEFGHIJ CDEFGHIJ CDEFGHIJ CDEFGHIJ DEFGHIJ DEFGHIJ DEFGHIJ DEFGHIJ EFGHIJ EFGHIJ EFGHIJ EFGHIJ FGHIJ FGHIJ FGHIJ FGHIJ GHIJ GHIJ GHIJ GHIJ HIJ HIJ HIJ HIJ IJ IJ IJ IJ J J J J ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGH ABCDEFGH ABCDEFGH ABCDEFGH ABCDEFG ABCDEFG ABCDEFG ABCDEFG ABCDEF ABCDEF ABCDEF ABCDEF ABCDE ABCDE ABCDE ABCDE ABCD ABCD ABCD ABCD ABC ABC ABC ABC AB AB AB AB A A A A ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ BCDEFGHIJ BCDEFGHIJ BCDEFGHIJ BCDEFGHIJ CDEFGHIJ CDEFGHIJ CDEFGHIJ CDEFGHIJ DEFGHIJ DEFGHIJ DEFGHIJ DEFGHIJ EFGHIJ EFGHIJ EFGHIJ EFGHIJ FGHIJ FGHIJ FGHIJ FGHIJ GHIJ GHIJ GHIJ GHIJ HIJ HIJ HIJ HIJ IJ IJ IJ IJ J J J J ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGHI ABCDEFGH ABCDEFGH ABCDEFGH ABCDEFGH ABCDEFG ABCDEFG ABCDEFG ABCDEFG ABCDEF ABCDEF ABCDEF ABCDEF ABCDE ABCDE ABCDE ABCDE ABCD ABCD ABCD ABCD ABC ABC ABC ABC AB AB AB AB A A A A
IEBDG에 대한 더 자세한 내용은 "IBM OS/390 DFSMSdfp Utilities"의 "IEBDG"를 참고한다. |
7.4. 유의사항
IEBDG 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.
-
정상적으로 실행한 경우
Batch 애플리케이션에서 받은 코드를 반환한다.
-
에러가 발생한 경우
해당 에러 메시지를 SYSPRINT DD에 출력하고 에러에 해당하는 코드를 반환한다.
IEBDG 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.
코드 설명 08
제어문 처리 중, 에러가 발생한 경우다.
진행 중인 데이터의 생성을 바로 중지하고, 다음 DSD 문을 처리한다.
12
입출력 데이터셋에 관한 처리 중 에러가 발생한 경우다.
유틸리티를 즉시 중지한다.
16
Unrecoverable 형태의 에러로 다음의 경우가 해당된다. 유틸리티를 즉시 중지한다.
-
SYSIN DD 명령어 문법 에러
-
OpenFrame 시스템 라이브러리 초기화 실패
-
기타 IEBDG 유틸리티 프로그램 에러
-
8. IEBEDIT
JOB 스트림 데이터셋을 작성하거나 편집하는 유틸리티 프로그램이다.
SYSIN DD로 기술된 명령에 따라 입력 데이터셋에 주어진 JCL에서 JOB과 STEP을 발췌하여 출력 데이터셋으로 새로운 JCL을 생성할 수 있다. 선택된 모든 JOB과 STEP은 입력 데이터셋에 보이는 것과 같은 순서로 출력 데이터셋으로 복사된다.
8.1. DD 설정
DD 설정 항목은 다음과 같다.
항목 | 설명 |
---|---|
SYSUT1 DD |
JCL이 저장된 입력 데이터셋을 기술한다. |
SYSUT2 DD |
새로 생성된 JCL을 저장할 데이터셋을 기술한다. |
SYSIN DD |
IEBEDIT의 명령어를 기술한다. |
SYSUT1, SYSUT2와 SYSIN 데이터셋의 블록 크기는 80의 배수이어야 한다. |
8.2. 명령어 설정
본 절에서는 SYSIN DD에서 설정하는 IEBEDIT의 명령어에 대해서 설명한다.
EDIT
어떤 JOB의 STEP들을 출력 데이터셋에 포함할지 조건을 명시한다. EDIT 문을 생략할 경우 입력 데이터셋을 출력 데이터셋으로 복사한다.
EDIT 문의 구문은 다음과 같다.
[label] EDIT [START=jobname] [,TYPE={POSITION|INCLUDE|EXCLUDE}] [,STEPNAME=(namelist)] [,NOPRINT]
항목 | 설명 |
---|---|
START |
EDIT 문을 적용할 jobname을 기술한다. 하나의 EDIT 문은 1개의 JOB에만 적용되며 TYPE과 STEPNAME 없이 START를 기술하면 해당 JOB과 JOB STEP의 내용이 출력 데이터셋으로 모두 복사된다. START에 jobname을 생략할 경우 첫 번째 EDIT 문이었다면 첫 번째 JOB을, 두 번째 JOB부터는 이전의 EDIT 문이 지정한 JOB의 다음 JOB을 자동으로 선택한다. 해당 JOB이 정해지면 해당 JOB 문장은 필수적으로 포함되므로 여러 JOB으로부터 STEP을 발췌하여 하나의 JOB으로 만드는 것은 불가능하다. |
TYPE |
EDIT 문의 동작을 기술한다. 다음 중 하나의 옵션을 선택한다.
|
STEPNAME |
인자로 사용할 namelist를 기술한다. STEP의 namelist는 다음의 3가지 방법을 모두 사용하여 기술할 수 있다.
콤마(,)와 대시(-)를 구분자로 하여 혼용할 수 있다. |
NOPRINT |
SYSPRINT에 데이터셋 처리 결과를 출력할 지 여부를 결정한다. 이 옵션이 활성화 되면 처리 결과를 SYSUT2로만 출력하고 SYSPRINT에는 나타나지 않는다. |
8.3. 사용예제
다음은 SYSUT1 DD로 주어진 JCL을 SYSIN 명령어에 맞도록 EDIT한 후 SYSUT2 DD에 저장하는 예이다.
//JOB1 JOB CLASS=A //STEP1 EXEC PGM=IEBEDIT //SYSPRINT DD SYSOUT=* //SYSIN DD * EDIT START=,TYPE=POSITION,STEPNAME=T12 EDIT START=JOB2,TYPE=INCLUDE,STEPNAME=(T22,T23) /* //SYSUT1 DD DATA //JOB1 JOB CLASS=A //T11 EXEC PGM=IEFBR14 /TEMP1 DD TEMP1 //T12 EXEC PGM=IEFBR14 //TEMP2 DD TEMP2 //T13 EXEC PGM=IEFBR14 //JOB2 JOB CLASS=B //T21 EXEC PGM=IEBEDIT //TEMP3 DD TEMP3 //T22 EXEC PGM=IEBEDIT //TEMP4 DD TEMP4 //TEMP41 DD TEMP41 //T23 EXEC PGM=IEBEDIT //TEMP5 DD TEMP5 //T24 EXEC PGM=IEBEDIT //TEMP6 DD TEMP6 /* //SYSUT2 DD DSNAME=OFTEST.IEBEDIT.OUT2, // DISP=(NEW,CATLG),DCB=(RECFM=F,LRECL=80,BLKSIZE=80)
첫 번째 EDIT 문장은 JOB1에서 T12 STEP 이후로만 출력한다. 두 번째 EDIT 문장은 JOB2에서 T22와 T23 STEP만을 출력한다.
다음은 앞의 예제에 대한 결과로서 생성된 SYSUT2 JCL이다.
(EDIT START=,TYPE=POSITON,STEPNAME=T12으로 생성) //JOB1 JOB CLASS=A //T12 EXEC PGM=IEFBR14 //TEMP2 DD TEMP2 //T13 EXEC PGM=IEFBR14 //JOB2 JOB CLASS=B (EDIT START=JOB2,TYPE=INCLUDE,STEPNAME=(T22,T23)으로 생성) //JOB2 JOB CLASS=B //T22 EXEC PGM=IEBEDIT //TEMP4 DD TEMP4 //TEMP41 DD TEMP41 //T23 EXEC PGM=IEBEDIT //TEMP5 DD TEMP5
IEBEDIT에 대한 더 자세한 내용은 “IBM OS/390 DFSMSdfp Utilities”의 “IEBEDIT”을 참고한다. |
9. IEBGENER
순차 데이터셋, VSAM 데이터셋 또는 PDS의 멤버를 복사하는 유틸리티 프로그램이다. ICEGENER 유틸리티 프로그램과 동일한 기능을 제공한다.
IEBGENER 유틸리티 프로그램으로 다음과 같은 기능을 수행할 수 있다.
-
순차 데이터셋, VSAM 데이터셋이나 PDS의 멤버를 복사한다.
-
순차 데이터셋, VSAM 데이터셋으로부터 PDS를 생성한다.
-
기존의 PDS에 멤버를 추가한다.
-
입력 레코드를 편집한다.
9.1. DD 설정
DD 설정 항목은 다음과 같다.
항목 | 설명 |
---|---|
SYSPRINT DD |
IEBGENER의 메시지가 저장되는 데이터셋을 정의한다. |
SYSUT1 DD |
입력 데이터셋을 정의하며, 순차 데이터셋, VSAM 데이터셋이나 PDS의 멤버가 될 수 있다. |
SYSUT2 DD |
출력 데이터셋을 정의하며, 순차 데이터셋, VSAM 데이터셋이나 PDS의 멤버 또는 PDS가 될 수 있다. |
SYSIN DD |
IEBGENER의 명령어를 정의한다. |
9.2. 명령어 설정
IEBGENER 유틸리티가 제공하는 기능을 수행하기 위한 명령어를 SYSIN DD에 기술한다. SYSIN DD에 어떠한 명령어도 기술되지 않은 경우는 SYSUT1의 데이터셋을 SYSUT2의 데이터셋으로 복사하는 기능을 제공한다.
본 절에서 SYSIN DD에서 설정하는 IEBGENER의 명령어에 대해서 설명한다.
GENERATE
MEMBER와 RECORD의 매개변수에 대한 설정을 한다. GENERATE 문의 구문은 다음과 같다.
[label] GENERATE [,MAXNAME=n] [,MAXFLDS=n] [,MAXGPS=n] [,MAXLITS=n]
항목 | 설명 |
---|---|
MAXNAME |
최대 멤버 수를 지정한다. 1 ~ 3276개의 멤버를 지정할 수 있다. |
MAXFLDS |
레코드의 최대 필드 수를 지정한다. 1 ~ 4095개까지 지정할 수 있다. |
MAXGPS |
레코드의 최대 IDENT 개수를 지정한다. 1 ~ 2520개까지 지정할 수 있다. |
MAXLITS |
레코드의 필드에서 사용되는 리터럴의 최대 캐릭터 개수를 지정한다. 1 ~ 2730개까지 지정할 수 있다. |
MEMBER
PDS의 여러 멤버를 가지고 출력 레코드가 생성될 경우 생성할 멤버 개수만큼 MEMBER 문이 필요하다.
MEMBER 문의 구문은 다음과 같다.
[label] MEMBER NAME=(name[,alias1][,alias2][,...])
항목 | 설명 |
---|---|
NAME |
생성할 멤버의 이름을 기술한다. |
현재 IEBGENER 유틸리티의 MEMBER 문 중 Alias는 실제 기능은 하지 않으나 에러를 발생시키지 않도록 지원하고 있다. |
RECORD
입력 레코드에 대해서 어떻게 처리할 것인지 조건을 기술한다.
RECORD 문의 구문은 다음과 같다.
[label] RECORD [IDENT=(length,'name',input-location)] [,FIELD=([length], [{input-location|'literal'}], [conversion], [output-location])] [,FIELD=...]
항목 | 설명 |
---|---|
IDENT |
MEMBER 문이 RECORD 문 전에 나왔을 경우 그 멤버에 복사될 입력 레코드에 대한 조건을 나타내고 같은 레코드의 FIELD에 대해서 적용될 입력 레코드를 구별한다. 레코드의 input-location에서 length만큼의 값과 name 값을 비교하여 값이 같으면 멤버의 마지막 레코드가 되거나 FIELD가 적용되는 마지막 레코드가 된다.
|
FIELD |
레코드 편집을 위한 정보를 기술한다. 입력 레코드에서 input-location 위치부터 length만큼의 데이터를 출력 레코드의 output-location 위치에 쓰거나 리터럴을 length만큼 출력 레코드의 output-location 위치에 쓴다.
|
9.3. 사용예제
다음은 순차 데이터셋을 복사하는 예이다.
SYSIN DD에 명령어가 기술되어있지 않으므로 순차 데이터셋인 TEST.INPUT을 TEST.COPY로 복사하고, IEBGENER의 메시지는 JOB에서 사용하는 메시지 클래스에 저장한다.
//COPY JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //COPYSDS EXEC PGM=IEBGENER //SYSUT1 DD DSNAME=TEST.INPUT,DISP=(SHR,KEEP) //SYSUT2 DD DSNAME=TEST.COPY,DISP=(NEW,CATLG), // DCB=(RECFM=FB,LRECL=120 ,BLKSIZE=120) //SYSPRINT DD SYSOUT=* //SYSIN DD DUMMY
다음은 순차 데이터셋으로 새 멤버를 갖는 PDS를 구성하는 예이다.
순차 데이터셋인 TEST.INPUT을 MEMBER1, MEMBER2, MEMBER3으로 나누어 새로 생성한 PDS TEST.PDS01에 저장한다.
//CREATE JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //NEWPDS EXEC PGM=IEBGENER //SYSUT1 DD DSNAME=TEST.INPUT,DISP=(SHR,KEEP) //SYSUT2 DD DSNAME=TEST.PDS01,DISP=(NEW,CATLG), // DCB=(DSORG=PO,RECFM=FB,LRECL=120,BLKSIZE=120) //SYSPRINT DD SYSOUT=* //SYSIN DD * GENERATE MAXNAME=3,MAXGPS=2 MEMBER NAME=MEMBER1 GROUP1 RECORD IDENT=(8,'firstxxx',30) MEMBER NAME=MEMBER2 GROUP2 RECORD IDENT=(8,'secondxx',30) MEMBER NAME=MEMBER3 /*
TEST.INPUT에서 입력 레코드의 30번째 위치부터 37번째까지의 값을 순차 검색하여 ‘firstxxx’인 레코드가 나타나면 ‘firstxxx’ 레코드를 포함하여 현재까지 검색된 레코드를 MEMBER1에 복사한다. 그리고 ‘firstxxx’ 레코드 다음 레코드부터 다시 ‘secondxx’ 레코드를 검색하기 시작한다.
‘secondxx’ 레코드가 검색되면 ‘firstxxx’ 레코드 이후부터 ‘secondxx’ 레코드를 포함하여 검색한 모든 레코드를 MEMBER2에 복사하고 ‘secondxx’ 레코드 이후의 모든 레코드는 MEMBER3에 복사된다.
다음은 기존의 PDS에 멤버를 추가하는 예이다.
//MERGE JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //MERGEPDS EXEC PGM=IEBGENER //SYSUT1 DD DSNAME=TEST.INPUT2,DISP=(SHR,KEEP) //SYSUT2 DD DSNAME=IEBGENER.TEST.PDS01,DISP=(OLD,KEEP) //SYSPRINT DD SYSOUT=* //SYSIN DD * GENERATE MAXNAME=2,MAXGPS=1 MEMBER NAME=MEMX GROUP1 RECORD IDENT=(11,'endofrecord',15) MEMBER NAME=MEMY /*
순차 데이터셋인 TEST.INPUT2의 레코드에서 15번째 Byte부터 25번째 Byte까지 레코드의 값을 ‘endofrecord’와 비교하여 값이 일치하면 검색한 모든 레코드를 MEMX에 복사하고, ‘endofrecord’ 레코드 이후의 모든 레코드는 MEMY에 복사한다. 그리고 기존의 PDS TEST.PDS01에 PDS 멤버로 MEMX와 MEMY를 추가한다.
다음은 입력 레코드를 수정하는 예이다. TEST.INPUT3 레코드를 수정하여 TEST.EDIT0로 복사한다.
//EDIT JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //EDIT EXEC PGM=IEBGENER //SYSUT1 DD DSNAME=TEST.INPUT3,DISP=(SHR,KEEP) //SYSUT2 DD DSNAME=IEBGENER.TEST.EDIT01,DISP=(NEW,CATLG), // DCB=(RECFM=FB,LRECL=80,BLKSIZE=80) //SYSPRINT DD SYSOUT=* //SYSIN DD * GENERATE MAXGPS=1,MAXFLDS=4,MAXLITS=10 RECORD IDENT=(8,'firstmem',1),FIELD=(50,76,,31), FIELD=(30,20,,1) RECORD FIELD=(70,41,,11),FIELD=(10,'**********',,1) /*
앞의 예제에서 2개의 RECORD 문 중 첫 번째 RECORD의 IDENT 조건에 의해서 순차적으로 입력 레코드의 첫 번째 Byte부터 8Byte의 값으로 'firstmem’이 나올 때까지 모든 레코드에 대해 FIELD 조건을 적용한다.
즉, 다음 그림과 같이 입력 레코드의 76번째 Byte 위치부터 50Byte 길이만큼의 값을 출력 레코드의 31번째 Byte 위치에 복사하고 입력 레코드의 20번째 Byte 위치부터 30Byte 길이의 값을 출력 레코드의 첫 번째 Byte 위치에 복사한다.
IDENT 조건에 맞는 레코드가 처리되고 난 다음부터는 두 번째 RECORD 문이 다음 그림과 같이 적용된다. 입력 레코드의 41번째 Byte 위치부터 70Byte 길이만큼의 값을 출력 레코드의 11번째 Byte 위치에 복사하고 출력 레코드의 처음 10Byte는 리터럴 ‘**********'로 복사한다.
9.4. 관련 환경설정
OpenFrame 환경설정에 ds 서브젝트, DATASET_DEFAULT 섹션의 SET_OUTPUT_DCB_TO_SMS 키를 통해 Output 데이터셋의 DCB를 Output 데이터셋의 acs rule을 따라 sms class로 설정할 것인지, Input 데이터셋의 DCB 정보와 동일하게 설정할 것인지 지정한다.
ds 서브젝트 환경설정 항목의 세부 내용은 OpenFrame Batch "환경설정 안내서"를 참고한다. |
9.5. 유의사항
IEBGENER 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.
-
정상적으로 실행한 경우
Batch 애플리케이션에서 받은 코드를 반환한다.
-
에러가 발생한 경우
해당 에러 메시지를 SYSPRINT DD에 출력하고 에러에 해당하는 코드를 반환한다.
IEBGENER 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.
코드 설명 12
Unrecoverable 형태의 에러로 다음의 경우가 해당된다.
-
데이터셋 관련(pgmdd, open/close, read/write) 에러
-
SYSIN DD 명령어 문법 에러
-
기타 IEBGENER 유틸리티 프로그램 에러
16
시스템 에러와 관련된 에러로 다음의 경우가 해당된다.
-
OpenFrame 시스템 라이브러리 초기화 실패
-
유사한 유틸리티 프로그램으로는 ICEGENER가 있다. |
10. IEBPTPCH
순차 데이터셋이나 PDS의 전체 또는 일부를 실제 출력할 형식으로 데이터를 생성하는 유틸리티 프로그램이다.
IEBPTPCH 유틸리티 프로그램은 다음과 같은 경우에 사용될 수 있다.
-
순차 데이터셋 또는 PDS 전체를 프린트한다.
-
PDS의 특정 멤버를 프린트한다.
-
순차 데이터셋 또는 PDS의 레코드 필드를 편집하여 프린트한다.
10.1. DD 설정
DD 설정 항목은 다음과 같다.
항목 | 설명 |
---|---|
SYSPRINT DD |
IEBPTPCH 메시지가 저장되는 데이터셋을 기술한다. |
SYSUT1 DD |
순차 데이터셋이나 PDS 타입의 입력 데이터셋을 기술한다. |
SYSUT2 DD |
순차 데이터셋 타입의 출력 데이터셋을 기술한다. |
SYSIN DD |
IEBPTPCH 명령어를 기술한다. |
10.2. 명령어 설정
본 절에서 SYSIN DD에서 설정하는 IEBPTPCH의 명령어에 대해서 설명한다.
데이터를 프린트한다. PRINT 문은 가장 처음에 기술해야 하는 명령어로 여러 번 반복해서 지정할 수 없다.
PRINT 명령어 형식은 다음과 같다.
[label] PRINT [PREFORM=A] [,TYPORG={PS|PO}] [,CNTRL={n|1}] [,STRTAFT=n] [,STOPAFT=n] [,SKIP=n] [,MAXNAME=n] [,MAXFLDS=n] [,MAXGPS=n] [,MAXLITS=n] [,MAXLINE=n]
항목 | 설명 |
---|---|
PREFORM |
각 레코드의 첫 번째 Byte가 제어 문자를 의미하는지 기술한다. 데이터가 이미 프린트될 포맷으로 갖추었고 그 형태로 프린트 되어야 한다는 것을 의미한다. PREFORM이 기술되면 TYPORG를 제외한 추가적인 PRINT 문의 모든 파라미터 설정은 무시된다. 앞의 명령어에서 사용된 A는 ASA 제어 문자를 의미한다. |
TYPORG |
입력 데이터셋이 순차 데이터셋(PS)인지 분할 데이터셋(PO)인지 기술한다. (기본값: PS) |
CNTRL |
라인 스페이스 값을 설정한다. 라인 스페이스로 3을 설정할 경우 첫 번째 라인에는 데이터를 쓰고, 두 번째와 세 번째 라인에는 공백 라인을 프린트한다. 이와 같은 순서로 다음 데이터도 프린트된다. 현재는 라인 스페이스 값을 3까지만 허용한다. 허용범위 이외의 값은 모두 1로 인식하여 처리하게 된다. |
STRTAFT |
순차 데이터셋을 프린트하기 전 스킵할 논리 레코드의 개수를 지정한다. 데이터셋의 n+1번째 논리 레코드부터 프린트된다. 레코드의 범위는 32767를 초과하지 않으며, 초과할 경우 레코드가 있는 만큼 처리하되 최대 32767개를 처리할 수 있다. |
STOPAFT |
프린트되어야 할 순차 데이터셋의 논리 레코드 개수를 지정한다. 최대 32767개의 논리 레코드를 설정할 수 있다. 32767 이상의 값을 설정하면 32767로 설정된다. 만일 STOPAFT 문과 RECORD 문의 IDENT가 함께 기술되었다면 STOPAFT에 설정된 값을 만족하거나 IDENT에 의해 구분되는 레코드 그룹의 마지막일 때, 둘 중 먼저 해당되는 쪽이 나타났을 때, 현재 입력 데이터셋의 데이터 처리를 위한 명령어 수행이 종료된다. |
SKIP |
n번째 레코드마다 프린트되어야 함을 의미한다. 32767 이상의 값을 설정하면 32767로 설정된다. |
MAXNAME |
MEMBER 문의 최대 멤버 개수를 지정한다. MEMBER 명령어가 있을 경우 반드시 명시해야 한다. 설정값은 32767을 넘을 수 없다. |
MAXFLDS |
RECORD 문의 최대 FIELD 파라미터 개수를 지정한다. 설정값은 32767을 넘을 수 없다. |
MAXGPS |
최대 IDENT 파라미터 개수를 지정한다. 설정값은 32767을 넘을 수 없다. |
MAXLITS |
RECORD 문의 IDENT 파라미터에 포함될 최대 리터럴 개수를 지정한다. 설정값은 32767을 넘을 수 없다. |
MAXLINE |
출력될 페이지의 최대 라인 수를 지정한다. 32767 이상의 값을 설정하면 32767로 설정된다. (기본값: 60) |
TITLE
출력되어야 할 타이틀이나 서브 타이틀을 기술한다.
IEBPTPCH에서는 TITLE 문에서 두 개의 ITEM을 기술할 수 있다. 첫 번째 ITEM 문은 타이틀을, 두 번째 ITEM 문은 서브 타이틀을 정의한다. 기술된 타이틀과 서브 타이틀은 매 페이지마다 출력된다.
TITLE 명령어 구문은 다음과 같다.
[label] TITLE ITEM=('title'[,output-location]) [,ITEM=...]
항목 | 설명 |
---|---|
ITEM |
title과 output-location은 다음과 같이 설정한다.
|
MEMBER
입력 데이터셋이 PDS일 경우 특정 멤버의 데이터만 처리하고자 할 때 사용한다. MEMBER 문을 사용하기 위해서는 PRINT 문의 MAXNAME을 설정해야 한다.
MEMBER 명령어 구문은 다음과 같다.
[label] MEMBER NAME=membername
항목 | 설명 |
---|---|
NAME |
PDS에서 프린트되어야 할 멤버 이름을 기술한다. |
RECORD
프린트되어야 할 레코드의 그룹을 정의한다.
RECORD 명령어 구문은 다음과 같다.
[label] RECORD [IDENT=(length,'name',input-location)] [,FIELD=(length,[input-location],[conversion] [output-location])] [,FIELD=…]
항목 | 설명 |
---|---|
IDENT |
레코드 그룹의 마지막 레코드를 식별한다. 레코드의 input-location에서 length만큼의 값과 name 값을 비교하여 값이 같으면 멤버의 마지막 레코드가 되거나 FIELD가 적용되는 마지막 레코드가 된다. IDENT를 사용하기 위해서는 PRINT 문의 MAXGPS와 MAXLITS가 기술되어 있어야 한다.
|
FIELD |
레코드 편집을 위한 정보를 기술한다. 입력 레코드상에서 input-location 위치부터 length만큼의 데이터를 출력 레코드의 output-location 위치에 쓰거나 리터럴을 length만큼 출력 레코드의 output-location 위치에 쓴다. FIELD를 사용하기 위해서는 PRINT 문의 MAXFLDS가 기술되어 있어야 한다.
|
CONVERSION |
레코드의 변환을 위한 정보를 기술한다. CV, PZ, VC, XE의 4가지 파라미터 값을 사용할 수 있다.
|
10.3. 사용예제
다음은 특정 멤버만 선택하여 지정한 프린트 형식으로 데이터를 출력하는 예이다. IEBCOPY.TEST.INPUT01의 멤버 중 MEMBER2의 레코드가 순차적으로 SYSUT2에 정의된 SYSOUT으로 출력된다.
만일 MEMBER2의 레코드의 21번째 Byte부터 8Byte의 값이 'ENDRECORD’이면 이 레코드까지만 출력한다. 이 SYSOUT은 JOB이 종료된 후 OUTPUT PROCESSING을 통해 프린터기에서 프린트되며 이 데이터는 한 페이지에 30 라인씩 프린트된다.
//TEST JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //NEWPDS EXEC PGM=IEBPTPCH //SYSUT1 DD DSNAME=IEBCOPY.TEST.INPUT01,DISP=(SHR,CATLG) //SYSUT2 DD SYSOUT=A //SYSPRINT DD SYSOUT=* //SYSIN DD * PRINT TYPORG=PO,CNTRL=1,MAXLINE=30,MAXNAME=1,MAXLITS=10,MAXGPS=3 MEMBER NAME=MEMBER2 RECORD IDENT=(8,'ENDRECORD',21) /*
10.4. 유의사항
IEBPTPCH 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.
-
정상적으로 실행한 경우
Batch 애플리케이션에서 받은 코드를 반환한다.
-
에러가 발생한 경우
해당 에러 메시지를 SYSPRINT DD에 출력하고 에러에 해당하는 코드를 반환한다.
IEBPTPCH 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.
코드 설명 12
Unrecoverable 형태의 에러로 다음의 경우가 해당된다.
-
데이터셋 관련(pgmdd, open/close, read/write) 에러
-
SYSIN DD 명령어 문법 에러
-
기타 IEBPTPCH 유틸리티 프로그램 에러
16
시스템 에러와 관련된 에러로 다음의 경우가 해당된다.
-
OpenFrame 시스템 라이브러리 초기화 실패
-
11. IEBUPDTE
리소스(애플리케이션 소스, JCL 소스 등)를 신규 생성, 갱신, 복사하는 유틸리티 프로그램이다. 각 레코드에 순서 번호를 붙일 수 있으며 이 순서 번호에 따라 각 레코드의 내용을 변경/삭제/삽입할 수 있다.
IEBUPDTE 유틸리티 프로그램으로 다음과 같은 기능을 수행할 수 있다.
-
PDS를 신규 생성한다.
-
PDS의 멤버를 복사, 치환한다.
-
PDS 멤버의 레코드를 편집한다. (레코드 치환, 추가, 삭제, 순서 번호 부여)
파라미터 설정
다음은 IEBUPDTE에서 설정할 수 있는 파라미터이다.
//EXEC PGM=IEBUPDTE[,PARM={NEW|MOD}]
항목 | 설명 |
---|---|
PARM |
|
11.1. DD 설정
DD 설정 항목은 다음과 같다.
항목 | 설명 |
---|---|
SYSPRINT DD |
IEBUPDTE 메시지를 저장하는 데이터셋을 정의한다. |
SYSUT1 DD |
입력 데이터셋을 기술한다. |
SYSUT2 DD |
출력 데이터셋을 기술한다. |
SYSIN DD |
IEBUPDTE의 명령어를 기술한다. |
11.2. 명령어 설정
본 절에서는 SYSIN DD에서 설정하는 IEBUPDTE의 명령어에 대해서 설명한다.
IEBUPDTE의 모든 명령은 "./" 기호로 시작한다. 그렇지 않은 문장은 DATA 문장으로 취급한다. |
ADD, REPL, REPRO, CHANGE
입력 데이터셋로부터 레코드를 추가/치환/복사/편집하여 출력 데이터셋에 레코드를 작성한다.
ADD, REPL, REPRO, CHANGE 명령어의 구문은 다음과 같다.
./[label] FUNC [NAME=member-name] [,LIST=ALL] [,SEQFLD=nnn] [,COLUMN=n] [,UPDATE=INPLACE] [,NEW={PO|PS}] [,MEMBER=member-name] [,LEVEL=n] [,SOURCE=x] [,SSI=hhhhhhhh] [,INHDR=routine-name] [,INTLR=routine-name] [,OUTHDR=routine-name] [,OUTTLR=routine-name] [,TOTAL=(routine-name, size)]
항목 | 설명 |
---|---|
FUNC |
ADD, REPL, REPRO, CHANGE를 기술한다. |
NAME |
신규, 복사, 편집, 치환을 하는 경우 출력 PDS의 멤버명을 지정한다. |
LIST |
출력 데이터셋으로 출력되는 모든 레코드를 SYSPRINT로 출력하는 항목이다. (미지원 기능) |
SEQFLD |
순서 번호의 위치와 길이를 지정한다. 앞에 2자리수로 위치를 뒤에 1자리수로 길이를 지정한다. 위치는 1 ~ 80까지 길이는 1 ~ 8까지 지정할 수 있다. (기본값: 738) |
COLUMN |
레코드의 데이터를 치환할 위치를 지정한다. |
UPDATE |
입력 데이터셋과 출력 데이터셋이 동일하여, 해당 데이터셋 내에서 변경이 일어나는 경우 지정한다. |
NEW |
입력 데이터셋과 출력 데이터셋의 DSORG가 다를 경우 출력 데이터셋의 DSORG를 지정한다. |
MEMBER |
SDS로부터 PDS로 출력하는 경우에 멤버명을 지정한다. |
LEVEL |
출력 데이터셋이 PDS인 경우 체인지 레벨을 지정하는 항목이다. (미지원 기능) |
SOURCE |
출력 데이터셋이 PDS인 경우 사용자에 의한 수정인지 IBM에 의한 수정인지 지정하는 항목이다. (미지원 기능) |
SSI |
출력 데이터셋이 PDS인 경우 시스템 상태 정보를 지정하는 항목이다. (미지원 기능) |
INHDR |
입력 유저 표제 라벨 처리 루틴을 지정하는 항목이다. (미지원 기능) |
INTLR |
입력 유저 마지막 라벨 처리 루틴을 지정하는 항목이다. (미지원 기능) |
OUTHDR |
출력 유저 표제 라벨 처리 루틴을 지정하는 항목이다. (미지원 기능) |
OUTTLR |
출력 유저 마지막 라벨 처리 루틴을 지정하는 항목이다. (미지원 기능) |
TOTAL |
토탈 루틴과 영역의 크기를 지정하는 항목이다. (미지원 기능) |
NUMBER, DELETE
NUMBER, DELETE 문은 ADD, REPL, REPRO, CHANGE 문과 함께 쓰이며, 레코드들의 순서 번호를 다시 할당하거나 지정한 순서 번호에 해당되는 레코드들을 지우는 역할을 한다. NUMBER는 순서 번호를 새로 붙이거나 다시 붙이는 경우에 이용한다. DELETE는 지정된 순서 번호에 해당하는 레코드를 삭제할 때 이용한다.
NUMBER, DELETE 명령어의 구문은 다음과 같다.
./[label] NUMBER [NEW1=n] [,INCR=n] [,SEQ1={n|ALL}] [,SEQ2=n] [,INSERT=YES] ./[label] DELETE SEQ1=n [,SEQ2=n]
항목 | 설명 |
---|---|
NEW1 |
순서 번호를 작성하는 경우의 초기값을 지정한다. |
INCR |
순서 번호를 작성하는 경우의 증가값을 지정한다. |
SEQ1 |
CHANGE를 시작하는 순서 번호를 지정한다. CHANGE 문에서만 유효하다. INSERT=YES와 함께 지정된 경우 새로 추가되는 레코드의 위치를 지정한다. 전체 레코드를 대상으로 할 때 ALL을 지정한다. |
SEQ2 |
CHANGE를 종료하는 순서 번호를 지정한다. CHANGE 문에서만 유효하다. 1개의 레코드를 삭제하는 경우에 생략할 수 있다. |
INSERT |
순서 번호가 없는 레코드를 새로 추가하는 경우 SEQ1에 지정된 순서 번호 다음부터 레코드를 추가한다. |
ENDUP
SYSIN 입력의 마지막을 나타낸다.
./[label] ENDUP
ALIAS
ALIAS를 다룰 때 기술한다. 지원하지 않는 명령어이다.
LABEL
유저 라벨을 다룰 때 기술한다. 지원하지 않는 명령어이다.
11.3. 사용예제
다음은 새로운 PDS와 멤버를 생성하는 예제이다.
//IEBUPDT1 JOB //STEP1 EXEC PGM=IEBUPDTE,PARM=NEW //SYSPRINT DD SYSOUT=A //SYSUT2 DD DSNAME=NEWPDS,DISP=(NEW,CATLG), // VOLUME=SER=DEFVOL,SPACE=(TRK,(50,,10)), // DCB=(RECFM=F,LRECL=80,BLKSIZE=80) //SYSIN DD DATA ./ ADD NAME=MEMB1 MEMB1 DATA1 00000010 MEMB1 DATA2 00000020 MEMB1 DATA3 00000030 ./ ADD NAME=MEMB2 MEMB2 DATA1 00000010 MEMB2 DATA2 00000020 MEMB2 DATA3 00000030 ./ ADD NAME=MEMB3 MEMB3 DATA1 00000010 MEMB3 DATA2 00000020 MEMB3 DATA3 00000030 ./ ENDUP /*
첫 번째 ADD 문은 MEMB1이라는 멤버를 생성하고 그 다음에 나오는 DATA 문을 레코드로 갖는다. 두 번째 ADD 문은 MEMB2이라는 멤버를 생성하고 그 다음에 나오는 DATA 문을 레코드로 갖는다. 세 번째 ADD 문은 MEMB3이라는 멤버를 생성하고 그 다음에 나오는 DATA 문을 레코드로 갖는다.
다음은 새로운 PDS에 기존 PDS의 멤버를 복사하고 새로 추가하는 예제이다.
//IEBUPDT2 JOB //STEP1 EXEC PGM=IEBUPDTE //SYSPRINT DD SYSOUT=* //SYSUT1 DD DSNAME=OLDPDS,DISP=SHR //SYSUT2 DD DSNAME=NEWPDS,DISP=(NEW,CATLG), // VOL=SER=DEFVOL,SPACE=(TRK,(100,,10)), // DCB=(RECFM=F,LRECL=80,BLKSIZE=4000) //SYSIN DD DATA ./ REPRO NAME=MEMB1 ./ REPRO NAME=MEMB2 ./ ADD NAME=MEMB3 ./ NUMBER NEW1=100,INCR=100 MEMB3 DATA1 MEMB3 DATA2 MEMB3 DATA3 ./ ENDUP /*
첫 번째 REPRO 문은 OLDPDS의 멤버 MEMB1을 NEWPDS로 복사한다. 두 번째 REPRO 문은 OLDPDS의 멤버 MEMB2을 NEWPDS로 복사한다. ADD 문은 MEMB3이라는 멤버를 생성하고 5 ~ 7번째 줄 DATA 문을 레코드로 갖는다. NUMBER 문에 의해 각 레코드는 100부터 100씩 증가하는 순서 번호를 갖게 된다.
다음은 기존 PDS의 멤버에 순서 번호를 새로 작성하고, 일부 레코드를 치환하는 예이다.
//IEBUPDT3 JOB //STEP1 EXEC PGM=IEBUPDTE //SYSPRINT DD SYSOUT=A //SYSUT1 DD DSNAME=OLDPDS,DISP=(OLD,KEEP),VOL=SER=DEFVOL //SYSIN DD * ./ CHANGE NAME=MEMB1,UPDATE=INPLACE ./ NUMBER SEQ1=ALL,NEW1=100,INCR=50 CHANGE DATA1 00000200 CHANGE DATA2 00000600 ./ ENDUP /*
첫 번째 CHANGE 문은 MEMB1에 대해 입력 데이터셋 내에서 변경이 일어나도록 지정한다. NUMBER 문은 MEMB1의 모든 레코드에 대해 순서 번호를 새로 작성하도록 한다. 각 레코드는 100부터 50씩 증가하는 순서 번호를 갖는다. DATA 문들은 고유의 순서 번호를 가지고 있다. 순서 번호를 새로 작성하기 전 기준으로 기존 레코드를 찾아 해당 레코드로 교체한다. 'UPDATE=INPLACE' 옵션이 주어진 가운데 기존 레코드에서 부여된 순서번호를 찾지 못한 경우에는 에러 처리된다.
다음은 PDS의 멤버를 편집하여 SDS로 출력하는 예이다.
//IEBUPDT4 JOB //STEP1 EXEC PGM=IEBUPDTE //SYSPRINT DD SYSOUT=A //SYSUT1 DD DSNAME=PDS,DISP=(OLD,KEEP),VOL=SER=DEFVOL //SYSUT2 DD DSNAME=SDS,DISP=(NEW,KEEP),VOL=SER=DEFVOL, // DCB=(RECFM=FB,LRECL=80,BLKSIZE=2000) //SYSIN DD * ./ CHANGE NEW=PS,NAME=MEMB1 CHANGE DATA1 00000200 ./ DELETE SEQ1=250,SEQ2=300 DELETE DATA2 00000275 ./ ENDUP /*
첫 번째 CHANGE 문은 PDS의 멤버 MEMB1에 대해 SDS로 출력할 것을 지정한다. 첫 번째 DATA 문은 순서 번호 200을 갖는 레코드에 대해 해당 데이터로 교체할 것을 지정한다. 첫 번째 DELETE 문은 순서 번호 250부터 300까지의 레코드를 삭제할 것을 지정한다. 두 번째 DATA 문은 순서 번호 275를 갖는 레코드를 추가할 것을 지정한다. 앞서 250부터 300까지의 레코드가 삭제되었으므로 교체가 아닌 추가 작업이 이루어진다.
다음은 PDS의 멤버에 새로운 레코드를 추가하는 예이다.
//IEBUPDT5 JOB //STEP1 EXEC PGM=IEBUPDTE //SYSPRINT DD SYSOUT=A //SYSUT1 DD DSNAME=PDS,DISP=(OLD,KEEP),VOL=SER=DEFVOL //SYSUT2 DD DSNAME=PDS,DISP=(OLD,KEEP),VOL=SER=DEFVOL //SYSIN DD * ./ CHANGE NAME=MEMB1 ./ NUMBER SEQ1=150,NEW1=200,INCR=50,INSERT=YES INSERT DATA1 INSERT DATA2 INSERT DATA3 /*
CHANGE 문은 PDS의 멤버 MEMB1에 대해 변경이 이루어짐을 지정한다. NUMBER 문은 순서 번호가 150인 레코드 다음부터 새로운 레코드를 추가하며 새로운 레코드는 200부터 50씩 증가하게 된다는 것을 지정한다.
DATA 문들은 위의 요건에 따라 각각 200, 250, 300의 순서 번호가 부여되어 추가된다. 기존에 200 ~ 300 사이의 순서 번호를 가진 레코드가 있다면 위의 DATA 문과 마찬가지로 새로 추가된 순서 번호 300 이후로 50씩 증가한 번호로 변경된다. 이러한 변경은 앞서 변경된 레코드의 순서 번호가 다음 레코드의 순서 번호보다 작을 때까지 반복된다.
11.4. 유의사항
IEBUPDTE 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.
-
정상적으로 실행한 경우
Batch 애플리케이션에서 받은 코드를 반환한다.
-
에러가 발생한 경우
해당 에러 메시지를 SYSPRINT DD에 출력하고 에러에 해당하는 코드를 반환한다.
IEBUPDTE 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.
코드 설명 12
Unrecoverable 형태의 에러로 다음의 경우가 해당된다.
-
데이터셋 관련(pgmdd, open/close, read/write) 에러
-
SYSIN DD 명령어 문법 에러
-
OpenFrame 시스템 라이브러리 초기화 실패
-
기타 IEBUPDTE 유틸리티 프로그램 에러
-
12. IEHLIST
PDS의 데이터셋 정보와 멤버 리스트 또는 볼륨 정보와 볼륨에 포함된 데이터셋 리스트를 제공하는 유틸리티 프로그램이다.
IEHLIST 유틸리티 프로그램으로 다음과 같은 기능을 수행할 수 있다.
-
PDS 정보와 PDS 멤버 리스트를 확인한다.
-
볼륨의 디스크 정보와 데이터셋 리스트를 확인한다.
12.1. DD 설정
DD 설정 항목은 다음과 같다.
항목 | 설명 |
---|---|
SYSPRINT DD |
IEHLIST 메시지가 저장되는 데이터셋을 정의한다. |
SYSIN DD |
IEHLIST의 명령어를 정의한다. |
12.2. 명령어 설정
본 절에서 SYSIN DD에서 설정하는 IEHLIST의 명령어에 대해서 설명한다.
LISTPDS
PDS 정보와 멤버 리스트를 보여준다.
LISTPDS 명령어 구문은 다음과 같다.
[label] LISTPDS DSNAME=(name[,name[,...]]) [,VOL=anyname=serial]
항목 | 설명 |
---|---|
DSNAME |
PDS의 데이터셋 이름을 지정한다. 최대 10개의 데이터셋 이름을 지정할 수 있다. |
VOL |
DSNAME에 기술한 데이터셋에 포함된 볼륨 시리얼(볼륨명)을 기술한다. anyname에 볼륨의 디바이스명을 지정하거나 원하는 이름으로 지정한다. 설정한 anyname은 문법을 맞추기 위한 것으로 실제로는 무시된다. |
LISTVTOC
주어진 볼륨에 해당하는 디스크 정보와 데이터셋 리스트를 보여준다.
LISTVTOC 명령어 구문은 다음과 같다.
[label] LISTVTOC [,VOL=anyname=serial] [,DSNAME=(name[,name[,...]])
항목 | 설명 |
---|---|
VOL |
조회할 볼륨 시리얼을 기술한다. anyname에 볼륨의 디바이스명을 지정하거나 원하는 이름으로 지정한다. 설정한 anyname은 문법을 맞추기 위한 것으로 실제로는 무시된다. |
DSNAME |
데이터셋 리스트에 포함할 데이터셋 이름을 기술한다. 최대 10개의 데이터셋 이름을 지정할 수 있다. DSNAME 파라미터가 없으면 조회하려는 볼륨에 있는 모든 데이터셋 리스트가 조회된다. |
12.3. 사용예제
다음은 PDS 정보와 멤버 리스트를 확인하는 예이다.
PDS DATASET1과 DATASET2의 정보와 멤버 리스트를 SYSPRINT에 기록한다.
//LISTPDS JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1), // USER=ROOT,PASSWORD=SYS1 //STEP01 EXEC PGM=IEHLIST //SYSPRINT DD SYSOUT=* //SYSIN DD * LISTPDS DSNAME=(DATASET1,DATASET2), VOL=disk=100000 /*
다음은 볼륨의 디스크 정보와 데이터셋 리스트를 확인하는 예이다.
볼륨 시리얼이 100000인 볼륨에 대한 디스크 정보와 데이터셋 리스트를 SYSPRINT에 기록한다.
//LISTVOL JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //STEP01 EXEC PGM=IEHLIST //SYSPRINT DD SYSOUT=* //SYSIN DD * LISTVTOC VOL=disk=100000 /*
12.4. 유의사항
IEHLIST 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.
-
정상적으로 실행한 경우
Batch 애플리케이션에서 받은 코드를 반환한다.
-
에러가 발생한 경우
해당 에러 메시지를 SYSPRINT DD에 출력하고 에러에 해당하는 코드를 반환한다.
IEHLIST 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.
코드 설명 12
Unrecoverable 형태의 에러로 다음의 경우가 해당된다.
-
데이터셋 관련(pgmdd, open/close, read/write) 에러
-
SYSIN DD 명령어 문법 에러
-
기타 IEHLIST 유틸리티 프로그램 에러
16
시스템 에러와 관련된 에러로 다음의 경우가 해당된다.
-
OpenFrame 시스템 라이브러리 초기화 실패
-
13. IEHPROGM
Non-VSAM 데이터셋을 관리하는 유틸리티 프로그램이다.
IEHPROGM 시스템 유틸리티 프로그램으로 다음과 같은 기능을 수행할 수 있다.
-
데이터셋 또는 PDS의 멤버를 해당 볼륨에서 물리적으로 삭제한다.
-
데이터셋을 카탈로그 또는 언카탈로그 한다.
유사한 유틸리티 프로그램으로는 IDCAMS가 있다. |
13.1. DD 설정
DD 설정 항목은 다음과 같다.
항목 | 설명 |
---|---|
SYSPRINT DD |
IEHPROGM 메시지가 저장되는 데이터셋을 지정한다. |
SYSIN DD |
IEHPROGM의 명령어를 지정한다. |
13.2. 명령어 설정
본 절에서 SYSIN DD에서 설정하는 IEHPROGM의 명령어에 대해서 설명한다.
SCRATCH
디스크 볼륨에 저장된 물리적인 파일(데이터셋이나 PDS의 멤버)을 제거한다. SCRATCH 대상 데이터셋이 카탈로그에 등록되어있는 경우 카탈로그 정보도 함께 삭제한다.
SCRATCH 명령어 구문 다음과 같다.
[label] SCRATCH {VTOC|DSNAME=name},VOL=anyname=serial [,MEMBER=name][,SYS]
항목 | 설명 |
---|---|
VTOC |
지정한 볼륨에 존재하는 모든 데이터셋을 삭제하고자 할 때 사용한다. |
DSNAME |
삭제할 데이터셋 이름을 지정한다. |
VOL |
삭제할 데이터셋의 볼륨을 지정한다. anyname에 볼륨의 디바이스 이름을 지정하거나 원하는 이름으로 지정한다. 설정한 anyname은 문법을 맞추기 위한 것으로 실제로는 무시된다. |
MEMBER |
PDS의 멤버만 삭제하고자 할 때 사용하며, 삭제할 멤버의 이름을 지정한다. |
SYS |
임시 데이터셋만을 삭제하고자 할 때 사용하는 파라미터이다. 예를 들어 데이터셋명이 앰퍼샌드(&) 문자로 시작한다면 삭제 대상이 된다. 이 항목은 VTOC을 지정했을 때에만 유효하다. |
CATLG
카탈로그에 Non-VSAM 데이터셋의 기본정보를 등록한다.
CATLG 명령어 구문은 다음과 같다.
[label] CATLG DSNAME=name,VOL=anyname=serial
항목 | 설명 |
---|---|
DSNAME |
카탈로그에 등록할 데이터셋 이름을 지정한다. |
VOL |
데이터셋의 볼륨을 지정한다. anyname에 볼륨의 디바이스 이름을 지정하거나 원하는 이름으로 지정한다. 설정한 anyname은 문법을 맞추기 위한 것으로 실제로는 무시된다. |
UNCATLG
카탈로그에 등록되어 있는 Non-VSAM 데이터셋을 언카탈로그한다.
UNCATLG 문을 사용하여 카탈로그에 등록된 특정 데이터셋을 삭제할 수는 있지만 볼륨에 저장되어 있는 물리적인 파일은 삭제할 수 없다. 볼륨에 저장되어있는 파일을 삭제하고자 하면 SCRATCH 문을 사용해 물리적 파일을 삭제하고 난 후 UNCATLG 문을 사용하여 카탈로그에 등록된 데이터셋 정보를 삭제한다.
UNCATLG 명령어 구문은 다음과 같다.
[label] UNCATLG DSNAME=name
항목 | 설명 |
---|---|
DSNAME |
카탈로그에서 삭제할 데이터셋 이름을 지정한다. |
13.3. 사용예제
볼륨 시리얼 넘버가 100000인 VTOC에 존재하는 임시 데이터셋을 삭제하는 예이다.
//CATALOG JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //STEP1 EXEC PGM=IEHPROGM //SYSPRINT DD SYSOUT=* //VOLDD DD VOL=SER=100000,DISP=OLD //SYSIN DD * SCRATCH VTOC,VOL=SER=100000,SYS /*
다음은 카탈로그에 시리얼 넘버가 100000인 볼륨에 존재하는 TEST01 데이터셋을 등록하는 예이다.
//CATALOG JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //STEP1 EXEC PGM=IEHPROGM //SYSPRINT DD SYSOUT=* //SYSIN DD * CATLG DSNAME=IEHPROGM.TEST01,VOL=SER=100000 /*
다음은 시리얼 넘버가 100000인 볼륨에서 TEST01 데이터셋을 삭제한 후 카탈로그에 등록되어있는 TEST01 데이터셋을 삭제하는 예이다.
//CATALOG JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //STEP1 EXEC PGM=IEHPROGM //SYSPRINT DD SYSOUT=* //SYSIN DD * SCRATCH DSNAME=IEHPROGM.TEST01,VOL=SER=100000 UNCATLG DSNAME=IEHPROGM.TEST01 /*
13.4. 유의사항
IEHPROGM 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.
-
정상적으로 실행한 경우
Batch 애플리케이션에서 받은 코드를 반환한다.
-
에러가 발생한 경우
해당 에러 메시지를 SYSPRINT DD에 출력하고 에러에 해당하는 코드를 반환한다.
IEHPROGM 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.
코드 설명 8
Warning 형태의 에러로 다음의 경우가 해당된다.
-
데이터셋을 찾을 수 없는 경우
12
Unrecoverable 형태의 에러로 다음의 경우가 해당된다.
-
데이터셋 관련(pgmdd, open/close, read/write) 에러
-
SYSIN DD 명령어 문법 에러
-
기타 IEHPROGM 유틸리티 프로그램 에러
16
시스템 에러와 관련된 에러로 다음의 경우가 해당된다.
-
OpenFrame 시스템 라이브러리 초기화 실패
-
14. IFASMFDP
SMF 데이터셋을 일반 데이터셋으로 DUMP하거나 내용을 초기화하는 유틸리티 프로그램이다.
IFASMFDP 시스템 유틸리티 프로그램으로 다음과 같은 기능을 수행할 수 있다.
-
SMF 데이터셋을 초기화한다.
-
SMF 데이터셋을 일반 사용자 데이터셋으로 DUMP한다.
유사한 유틸리티 프로그램으로는 DFHJUP가 있다. |
14.1. DD 설정
DD 설정 항목은 다음과 같다.
항목 | 설명 |
---|---|
SYSOUT DD |
IFASMFDP 메시지가 저장되는 데이터셋을 지정한다. |
SYSIN DD |
IFASMFDP의 명령어를 지정한다. |
14.2. 명령어 설정
본 절에서는 SYSIN DD에서 설정하는 IFASMFDP의 명령어에 대해서 설명한다.
INDD
입력 데이터셋과 처리 방식을 지정한다.
INDD 명령어 구문은 다음과 같다.
INDD(ddname,OPTIONS(data))
항목 | 설명 |
---|---|
INDD |
입력 데이터셋과 처리 방식을 지정한다. INDD 구문이 없을 경우 기본값은 INDD(DUMPIN,OPTIONS(ALL)) 이다. |
ddname |
입력 데이터셋의 ddname을 지정한다. |
data |
DUMP, CLEAR, ALL 중 하나로 입력 데이터셋의 처리 방법을 지정한다.
|
OUTDD
출력 데이터셋과 복사될 레코드 타입의 목록을 지정한다.
OUTDD 명령어 구문은 다음과 같다.
OUTDD(ddname,{TYPE(list),NOTYPE(list)})
항목 | 설명 |
---|---|
OUTDD |
출력 데이터셋과 레코드 타입의 복사 범위를 지정한다. OUTDD 구문이 없을 경우 기본값은 OUTDD(DUMPOUT,TYPE(000:255))이다. |
ddname |
출력 데이터셋 ddname을 지정한다. |
TYPE |
출력 데이터셋에 복사할 경우 포함할 레코드 타입을 list에 열거한다. |
NOTYPE |
출력 데이터셋에 복사할 경우 제외할 레코드 타입을 list에 열거한다. |
list |
레코드 타입을 아래의 3가지 방법으로 열거한다. 구분자는 콤마(,)이다.
|
DATE
복사할 레코드의 날짜 범위를 지정한다.
DATE 명령어 구문은 다음과 같다.
DATE({yyddd|yyyyddd},{yyddd|yyyyddd})
항목 | 설명 |
---|---|
DATE |
첫 번째 인자로 지정된 날로부터 두 번째 인자로 지정된 날까지 작성된 레코드를 복사한다. DATE 구문이 없을 경우 기본값은 DATE(1900000,2099366)이다. |
yyddd |
19yy년의 ddd번째 날을 의미한다. ddd의 범위는 001~366까지이다. |
yyyyddd |
yyyy년의 ddd번째 날을 의미한다. ddd의 범위는 001~366까지이다. |
START
복사할 레코드의 시간 범위 중 시작 시각을 지정한다.
START 명령어 구문은 다음과 같다.
START(hhmm)
항목 | 설명 |
---|---|
START |
시간범위의 시작시각을 hhmm의 형태로 지정한다. START 문이 없을 경우 기본값은 START(0000)이다. |
hhmm |
hh는 시간(24시간 base)이며 mm은 분이다. |
END
복사할 레코드의 시간 범위 중 종료시각을 지정한다.
END 명령어 구문은 다음과 같다.
END(hhmm)
항목 | 설명 |
---|---|
END |
시간 범위의 종료시각을 hhmm의 형태로 지정한다. END 문이 없을 경우 기본값은 END(2400)이다. |
hhmm |
hh는 시간(24시간 bae)이며 mm은 분이다. |
SID
주어진 시스템 ID에 맞는 레코드만을 복사한다.
SID 명령어 구문은 다음과 같다.
SID(XXXX)
항목 | 설명 |
---|---|
SID |
특정 시스템 ID에서 작성된 SMF 레코드만을 출력 데이터셋으로 복사한다. 주어지지 않으면 SID 필드는 무시한다. |
xxxx |
1~4개의 알파벳으로 이루어진 시스템 ID이다. |
14.3. 사용예제
다음은 INDD1으로 주어진 SMF 데이터셋을 DUMP 및 CLEAR 시키고, INDD2로 주어진 SMF 데이터셋은 DUMP만 하여 OUTDD1, OUTDD2, OUTDD3의 3가지 새로운 데이터셋을 만드는 예제이다.
2009년 1월 1일부터 2009년 1월 2일까지의 레코드만이 추출되며, OUTDD1에는 레코드 타입 0, 2, 10, 15~40이 저장되며, OUTDD2와 OUTDD3에는 레코드 타입 10~255가 저장된다.
//SMFDUMP JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1) //STEP EXEC PGM=IFASMFDP //SYSOUT DD SYSOUT=* //INDD1 DD DSN=SMLOG.DATA1,DISP=SHR //INDD2 DD DNS=SMLOG.DATA2.DISP=SHR //OUTDD1 DD DSN=SMF.DUMP1,DISP=SHR,DCB=LRECL=32760 //OUTDD2 DD DSN=SMF.DUMP2,DISP=SHR,DCB=LRECL=32760 //OUTDD3 DD DSN=SMF.DUMP3,DISP=SHR,DCB=LRECL=32760 //SYSIN DD * INDD(INDD1,OPTIONS(ALL)) INDD(INDD2,OPTIONS(DUMP)) OUTDD(OUTDD1,TYPE(0,2,10,15:40)) OUTDD(OUTDD2,TYPE(10:255)) OUTDD(OUTDD3,TYPE(10:255)) DATE(2009001,2009002) /* //
14.4. 유의사항
IFASMFDP 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.
-
정상적으로 실행한 경우
Batch 애플리케이션에서 받은 코드를 반환한다.
-
에러가 발생한 경우
해당 에러 메시지를 SYSPRINT DD에 출력하고 에러에 해당하는 코드를 반환한다.
IEHPROGM 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.
코드 설명 0
정상 수행된 경우이다.
8
중대한 에러로 인해, 동작이 중지된 경우이다. 다음의 경우에 발생한다.
-
스크립트 파싱 실패
-
데이터셋 이용 불가
-
OpenFrame 시스템 라이브러리 초기화 실패
-