데이터 셋 유틸리티

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

1. 개요

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

프로그램명 설명

ADRDSSU

IBM Mainframe MVS 환경에서 제공하는 DFSMSdss의 기능들을 JCL에서 호출하려는 경우 사용하는 유틸리티 프로그램이다.

DFHJUP

SMF 데이터 셋에 존재하는 CICS 로그 데이터를 조회 및 처리하는 유틸리티 프로그램이다.

IDCAMS

VSAM과 Non-VSAM 데이터 셋 및 카탈로그 정보를 생성하고 관리하는 유틸리티 프로그램이다.

IEBCOMPR

2개의 SDS나 PDS를 비교조건을 통해 비교 후 그 결과를 출력하는 유틸리티 프로그램이다.

IEBCOPY

1개 이상의 PDS에 대해서 멤버들을 전체 또는 일부만 복사하거나 병합하는 유틸리티 프로그램이다.

IEBDG

테스트 데이터 셋을 생성하는 유틸리티 프로그램이다.

IEBEDIT

JOB 스트림 데이터 셋을 작성하거나 편집하는 유틸리티 프로그램이다.

IEBGENER

순차 데이터 셋 또는 PDS의 멤버를 복사하는 유틸리티 프로그램이다.

IEBPTPCH

순차 데이터 셋이나 PDS의 전체 또는 일부를 실제 출력할 형식으로 데이터를 생성하는 유틸리티 프로그램이다.

IEBUPDTE

리소스(애플리케이션 소스, JCL 소스 등)를 신규 생성, 갱신, 복사하는 유틸리티 프로그램이다.

IEHLIST

PDS의 데이터 셋 정보와 멤버 리스트 또는 볼륨 정보와 볼륨에 포함된 데이터 셋 리스트를 제공하는 유틸리티 프로그램이다.

IEHPROGM

2개의 SDS나 PDS를 비교조건을 통해 비교 후 그 결과를 출력하는 유틸리티 프로그램이다.

IFASMFDP

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에 대해서만 지원한다.

figure 1 1
DUMP와 RESTORE
  1. DFSMSdss(Data Facility Storage Management Subsystem Data Set Services)는 데이터셋 또는 볼륨의 복사, 이동, 덤프, 복구 등의 기능을 제공하는 IBM Mainframe MVS 환경의 데이터 스토리지 관리 서비스이다.

  2. tar는 UNIX에서 기본적으로 제공되는 프로그램으로, 주로 여러 개의 파일이나 디렉터리를 하나의 묶음파일로 변환하거나 묶음 파일을 원래대로 풀어서 복구하는데 사용된다.

  3. OpenFrame에서 VSAM 데이터셋을 대상으로 ADRDSSU 명령을 처리하기 위해서는 TSAM RDB를 사용해야 한다. TSAM RDB에 대한 설명은 OpenFrame "마이그레이션 안내서"를 참고한다.

다음은 일반적인 DUMP 처리 과정을 나타낸 순서도이다.

figure 1 2
DUMP 처리 과정

다음은 일반적인 RESTORE 처리 과정을 나타낸 순서도이다.

figure 1 3
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 대상 데이터셋을 지정하려는 경우 기술한다.

  • INDD 문으로 DUMP 대상 볼륨의 DD 이름을 지정하여 볼륨 단위의 처리를 진행하려는 경우 DATASET 문의 생략이 가능하다. INDD 문으로 처리대상 볼륨의 DD 이름과 DUMP 대상 데이터셋 이름을 함께 기술한 경우 카탈로그에 등록되어 있지 않더라도 해당 데이터셋의 DUMP 처리가 가능하나 INDD 문 지정 없이 데이터셋 이름만 기술한 경우는 해당 데이터셋이 먼저 카탈로그에 등록되어 있어야 한다.

  • FULL 문은 볼륨 단위의 처리를 진행하려 할 때 사용하며 생략 가능하다.

INCLUDE

DUMP 대상 데이터셋 이름을 하나 이상 기술한다. 대상 데이터셋이 여러 개인 경우에 각각의 데이터셋의 구분은 콤마(,), 공백, 개행문자로 한다.

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

EXCLUDE

DUMP 대상에서 제외할 데이터셋 이름을 하나 이상 기술한다.

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

제외할 데이터셋이 여러 개인 경우에 각각의 데이터셋의 구분은 콤마(,), 공백, 개행문자로 한다.

BY

INCLUDE 문에서 지정한 데이터셋 중에서 BY 문으로 기술한 조건과 일치하는 데이터셋만 필터링하여 처리한다.

  • CREDT : DUMP 대상 데이터셋의 생성일자를 의미한다.

  • EXPDT : DUMP 대상 데이터셋의 만료일자를 의미한다.

  • REFDT : DUMP 대상 데이터셋의 최종 접근일자를 의미한다.

  • 연산자 : EQ(=), LE(<=), LT(<), GT(>), GE(>=), NE(!=) 중 하나를 선택한다. 연산자에 대한 자세한 내용은 비교연산자의 표를 참고한다.

  • 애스터리스크(*) : 기준일을 선택한다. 애스터리스크(*)는 현재일자를 의미한다.

  • 일수 : 데이터셋의 기준일자(생성일자, 만료일자, 참조일자)로부터 지정한 일수만큼 가감한다. 마이너스(-) 부호가 일수 앞에 있는 경우 기준일자에서 차감한다.

다음은 현재일로부터 최소 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

  1. RESTORE의 경우 INCLUDE/EXCLUDE 데이터셋에 대한 필터링 옵션(BY)은 지원하지 않는다.

  2. 여유 공간을 최대한 활용하면서 사이즈 초과로 인한 에러를 줄이기 위해 데이터셋을 RESTORE하기 전에 OUTDD에 기술한 볼륨 중 여유공간이 가장 큰 볼륨을 선택하여 RESTORE한다.

[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 문을 지정할 때 이미 존재하는 데이터셋에 대한 검색 순서는 다음과 같다.

  1. 첫 번째 마스터 카탈로그 정보를 검색한다.

  2. 해당 정보가 존재하지 않으면 OUTPUT 볼륨을 검색한다.

  3. 해당 정보가 존재하지 않으면 DUMP 처리 당시의 카탈로그 정보를 검색한다.

  4. 위의 검색에서도 최종적으로 발견되지 않으면 OUTDD 문에서 지정한 DD의 볼륨에 복원 처리한다.

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 유형의 에러로 에러가 발생하여 정상적으로 수행하지 않은 경우이다.

  1. ADRDSSU 유틸리티 프로그램에 대한 더 자세한 정보는 "IBM z/OS DFSMSdss Storage Administration Reference"와 "IBM z/OS DFSMSdss Storage Administration Guide"를 참고한다.

  2. ofconfig 프로그램의 사용 설명은 OpenFrame Base "툴 참조 안내서"를 참고한다.

  3. rc 서브젝트의 설정 방법은 OpenFrame Batch "환경설정 안내서"를 참고한다.

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로 변경할 수 있다.

  1. SYSUT1 DD에 SUBSYS 서브 파라미터가 존재할 때 특별한 처리가 존재한다.

  2. SUBSYS 파라미터의 첫 번째 파라미터가 LOGR이고, 네 번째 파라미터가 DELBRCUR이면, SYSUT4 DD 및 명령어 기술 여부와 관계없이 SYSUT1 DD에 기술된 데이터셋을 TRUNCATE 처리한다.

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}]
항목 설명

PRINT

모든 선택된 레코드가 SYSPRINT DD에 출력된다.

COPY

모든 선택된 레코드가 출력 데이터셋에 복사된다. PRTSYS를 이용해 이 레코드들이 SYSPRINT DD로도 출력되도록 할 수 있다.

NEGOF

OFFSET에 주어지는 값을 음수로 동작하게 하여 레코드 뒷부분부터의 offset을 지정한다. 선택된 레코드는 SYSPRINT DD로 출력된다.

OFFSET|O

검사할 레코드 필드의 첫 Byte 위치를 지정한다. (기본값: 1)

NEGOF가 지정되었을 경우 레코드 끝부터의 Byte 수를 지정한다.

FLDTYP|T

VALUE로 주어지는 string의 타입을 지정한다. 선택 가능한 값은 다음과 같다.

  • X : Hexadecimal 필드

  • C : Character 필드

VALUE|V

지정된 레코드 필드와 비교할 값을 string에 적는다.

Character 타입은 255자까지, Hexadecimal 타입은 510자까지 지정 가능하다.

FLDLEN|L

VALUE값과 비교할 레코드 필드의 길이를 지정한다.

기본값은 1이며, 255까지 지정할 수 있다.

COND|C

테스트의 타입과 다른 테스트 사이의 연관관계를 기술한다.

  • E : 기본값으로, 테스트 시리즈의 마지막임을 알린다. 테스트 시리즈가 아닌 독립된 테스트를 지정할 때에도 사용한다. 테스트 시리즈 간 또는 개별 테스트와 테스트 시리즈 간에는 OR 조건으로 연결된다.

  • M : 테스트 시리즈를 작성할 때 사용한다. 연속된 M 타입 테스트들과 그 뒤에 따라오는 E 타입 테스트가 하나의 테스트 시리즈를 이룬다. 테스트 시리즈에 속한 테스트 간에는 AND 조건으로 연결된다.

  • T{Y|N} : VALUE구의 값이 비교 연산이 아닌 MASK 연산으로 처리된다. VALUE구에 지정된 값은 첫 1Byte가 MASK로 사용된다. FLDLEN은 주어지지 않거나 1로 주어져야 한다.

    • Y : MASK 연산의 결과가 True(0 이외의 값)일 때 레코드가 선택됨을 의미한다.

    • N : 연산 결과가 False(0)일 때 선택됨을 의미한다.

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가지 종류의 명령어로 분류된다.

  • 기능 명령어

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

    명령어 설명

    ALTER

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

    DEFINE

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

    DELETE

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

    EXPORT

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

    IMPORT

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

    LISTCAT

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

    PRINT

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

    REPRO

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

    VERIFY

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

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

  • 보조 명령어

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

    명령어 설명

    IF-THEN-ELSE

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

    Null

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

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

    SET

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

    CANCEL

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

    PARM

    IDCAMS가 실행되는 동안에 적용되는 옵션 및 파라미터 값을 지정한다(현재는 지원하지 않는다).

  • 비 기능 명령어

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

    명령어 설명

    BLDINDEX

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

    EXAMINE

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

코딩 규약

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)를 의미한다.

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

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

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

STORAGECLASS

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

스토리지 클래스는 SMS에서 정의하며 생성되는 데이터셋에 할당되는 저장소 용량과 관련된 속성을 가지고 있다.

스토리지 클래스를 지정하는 경우 필수 파라미터인 CYLINDERS와 같은 스토리지 할당 크기를 지정하는 파라미터를 지정하지 않아도 된다.

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

TO|FOR

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

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

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

DATA, INDEX

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

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

CATALOG

DEFINE 명령으로 정의하는 카탈로그 엔트리가 등록될 카탈로그 이름을 지정한다.

생략하면 해당 JOB의 STEPCAT이나 JOBCAT에 지정된 카탈로그 또는 카탈로그 엔트리 이름의 일부를 ALIAS로 사용하는 USERCATALOG가 있는 경우 해당 USERCATALOG에 등록된다. 마지막까지 등록할 카탈로그가 결정되지 않으면 마스터 카탈로그에 등록한다. 자세한 사항은 OpenFrame Base "데이터셋 안내서"의 "통합 카탈로그"에서 카탈로그 검색 순서를 참고한다.

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 그룹의 유효일을 설정한다.

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

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

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 데이터셋의 유효일을 설정한다.

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

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

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

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

  • NORECATALOG : 새로운 접근 경로인 경우만 생성될 수 있다.

TO|FOR

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

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

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

UPDATE|

NOUPDATE

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

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

다음은 보조 인덱스 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에 대해서만 유효한 옵션이다.

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

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

PURGE|NOPURGE

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

  • PURGE : 사용기간에 관계없이 데이터셋 엔트리를 제거한다.

  • NOPURGE : 유지기간이 만료된 엔트리만을 대상으로 제거를 수행하며, 만료되지 않은 엔트리에 대해서는 제거하지 않는다. 생략된 경우 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 동작을 수행한 후 대상이 된 카탈로그 엔트리의 삭제 여부를 결정한다.

  • TEMPORARY : 카탈로그 엔트리를 삭제하지 않는다.

  • PERMANENT : 카탈로그 엔트리를 삭제한다. (기본값)

다음은 카탈로그 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 : 카탈로그에 존재하는 엔트리 이름 중에서 지정된 entryname과 이름이 일치하고 세그먼트 개수도 일치하는 이름만 명령의 대상으로 지정된다.

  • LEVEL : 카탈로그에 존재하는 엔트리 이름 중에서 지정된 entryname과 이름의 앞부분이 일치하는 이름이 명령의 대상으로 지정된다. 사용자가 지정한 entryname의 세그먼트 개수보다 많은 세그먼트 개수를 갖는 이름들도 명령의 대상으로 지정된다.

ENTRIES와 LEVEL의 사용 예는 다음과 같다.

  • 카탈로그가 다음의 엔트리 이름들을 가지고 있는 경우

    1. A.A.B

    2. A.B.B

    3. A.B.B.C

    4. A.B.B.C.C

    5. A.C.C

    6. A.D

    7. A.E

    8. A

  • ENTRIES(A.*)를 지정한 경우 6, 7이 명령의 대상으로 선택된다.

  • ENTRIES(A.*.B)를 지정한 경우 1, 2가 명령의 대상으로 선택된다.

  • LEVEL(A.*.B)를 지정한 경우 1, 2, 3, 4가 명령의 대상으로 선택된다.

  • LEVEL(A)를 지정한 경우 1,2,3,4,5,6,7이 모두 명령의 대상으로 선택된다.

(*는 해당 세그먼트의 모든 이름과 일치한다.)

NAME|HISTORY|

VOLUME|

ALLOCATION|ALL

위의 엔트리 타입 필터 및 ENTRIES 파라미터로 지정되는 엔트리 이름 조건을 만족하는 카탈로그 엔트리에 대한 정보를 출력하는데 있어서 얼마나 자세한 레벨의 정보까지 출력할지를 지정한다.

순서대로 NAME을 지정하면 가장 기본적인 정보만이 출력되고 ALL을 지정하면 모든 해당 엔트리에 대한 정보가 출력된다.

CATALOG

LISTCAT 명령의 대상이 카탈로그의 이름을 지정한다. ENTRIES나 LEVEL로 지정하는 entryname은 여기에서 지정하는 카탈로그에서 검색된다.

다음은 VSAM.KSDS1의 모든 엔트리에 대한 정보를 출력하는 예이다.

//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)
PRINT

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 명령을 이용하여 내용을 출력할 데이터셋을 지정한다.

  • INFILE : JCL을 통해 미리 할당된 ddname을 지정해야 한다.

  • INDATASET : IDCAMS에서 직접 데이터셋을 할당하며 배타적(DISP=OLD) 할당을 한다.

CHARACTER|

DUMP|

HEX

PRINT 출력내용의 포맷을 지정한다.

  • CHARACTER : 스트링 형태로 레코드의 내용을 출력한다.

  • DUMP : 오른쪽에는 16진수로 왼쪽에는 스트링 형태를 나란히 출력한다. (기본값)

  • HEX : 16진수 형태로 출력한다.

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

복사할 원본 데이터셋을 지정한다.

  • INFILE : JCL을 통해서 명시된 ddname을 값으로 지정해야 하는 반면 INDATASET 파라미터를 사용하는 경우에는 데이터셋의 카탈로그에 등록된 엔트리 이름을 지정해야 한다.

  • INDATASET : 파라미터를 이용해서 지정한 원본 데이터셋은 배타적으로(DISP=OLD) 할당된다.

OUTFILE|OUTDATASET

원본 데이터셋을 복사한 후 저장할 대상 데이터셋을 지정한다.

  • OUTFILE : 파라미터의 값으로는 ddname을 지정해야 한다.

  • OUTDATASET : 파라미터의 값으로는 카탈로그된 엔트리 이름을 지정해야 한다. 파라미터를 이용해서 지정한 대상 데이터셋은 배타적으로(DISP=OLD) 할당된다.

ENTRIES|LEVEL

REPRO 명령을 이용하여 카탈로그를 복사하는 경우에 복사 대상이 되는 카탈로그 엔트리 이름을 지정한다. 이 경우 2개의 카탈로그 사이에 카탈로그 엔트리 이름들만 복사된다. 실제 카탈로그 엔트리가 가리키는 데이터셋에 대한 복사를 의미하지는 않는다.

  • ENTRIES : 카탈로그에 존재하는 엔트리 이름 중에서 지정된 entryname과 이름이 일치하고 세그먼트 개수도 일치하는 이름만이 명령의 대상으로 지정된다.

  • LEVEL : 카탈로그에 존재하는 엔트리 이름 중에서 지정된 entryname과 이름의 앞부분이 일치하는 이름이 명령의 대상으로 지정된다. 즉, 사용자가 지정한 entryname의 세그먼트 개수보다 많은 세그먼트 개수를 갖는 이름들도 명령의 대상으로 지정된다.

ENTRIES와 LEVEL의 사용 예는 다음과 같다.

  • 카탈로그가 다음의 엔트리 이름들을 가지고 있는 경우

    1. A.A.B

    2. A.B.B

    3. A.B.B.C

    4. A.B.B.C.C

    5. A.C.C

    6. A.D

    7. A.E

    8. A

  • ENTRIES(A.*)를 지정한 경우 6, 7이 명령의 대상으로 선택된다.

  • ENTRIES(A.*.B)를 지정한 경우 1, 2가 명령의 대상으로 선택된다.

  • LEVEL(A.*.B)를 지정한 경우 1, 2, 3, 4가 명령의 대상으로 선택된다.

  • LEVEL(A)를 지정한 경우 1, 2, 3, 4, 5, 6, 7이 모두 명령의 대상으로 선택된다.

(*는 해당 세그먼트의 모든 이름과 일치한다.)

FROMKEY|

FROMADDRESS|

FROMNUMBER|SKIP

데이터셋 전체를 모두 복사하지 않고 해당 데이터셋의 일부 레코드만을 복사하기 위해 복사할 대상을 한정한다.

각각 특정 키와 주소 그리고 레코드 번호 이후의 레코드를 대상으로 복사하고, SKIP 파라미터는 첫 레코드부터 number개의 레코드는 복사하지 않고 number개 다음 레코드부터 복사작업의 대상으로 한다. 즉, 복사작업의 시작이 되는 레코드를 지정한다.

KSDS, ESDS, RRDS에 각각 FROMKEY, FROMADDRESS, FROMNUMBER를 사용해 복사 대상을 제어할 수 있다. Non-VSAM 데이터셋은 SKIP만을 사용할 수 있으며, 각 데이터셋 속성에 대응 하지 않는 항목을 사용하면 에러가 발생한다.

MERGECAT|

NOMERGECAT

REPRO 명령으로 사용자 카탈로그의 레코드를 다른 사용자 카탈로그로 복사할 수 있다.

  • MERGECAT : 소스 카탈로그의 레코드를 타깃 카탈로그로 복사한 후에 소스 카탈로그 상에서 레코드를 제거한다.

  • NOMERGECAT : 단순히 복사만 진행되고 원본 카탈로그에서 카탈로그 레코드는 삭제되지 않는다. NOMERGECAT을 지정하는 경우 타깃 카탈로그는 비어 있어야 한다. (기본값)

REPLACE|NOREPLACE

소스 데이터셋을 타깃 데이터셋으로 복사하는 과정에서 타깃 데이터셋에 이미 동일한 레코드가 있는 경우의 처리방법을 지정한다.

  • REPLACE : 기존의 레코드를 새로운 레코드로 대체한다.

  • NOREPLACE : 중복 레코드가 발견되었다는 에러 메시지만 나타나고 타깃 데이터셋의 중복 레코드에 복사하지 않는다. (기본값)

REUSE|NOREUSE

카탈로그가 아닌 VSAM 데이터셋이 타깃 데이터셋인 경우에 사용한다.

  • REUSE : 해당 타깃 데이터셋에 이미 레코드가 들어있더라도 맨 처음부터 레코드를 추가한다. 기존 레코드를 REUSE한다기보다 데이터셋 레코드를 저장하는데 사용되는 공간을 REUSE한다.

  • NOREUSE : 타깃 데이터셋의 마지막 레코드 이후부터 레코드를 추가하여 기존에 있던 데이터셋의 레코드를 놔둔 상태로 타깃 데이터셋에 레코드를 복사한다.

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 명령의 대상이 되는 데이터셋을 지정한다.

  • FILE : JCL을 통해 할당된 데이터셋의 ddname을 지정해야 한다.

  • DATASET : IDCAMS에서 지정된 데이터셋을 직접 할당하며 공유(DISP=SHR) 할당을 한다.

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

    컨디션 코드의 값을 평가하기 위한 연산자이다.

    지정 가능한 값과 의미는 ADRDSSU 비교연산자 표를 참고한다.

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

보조 인덱스를 구성하는데 사용할 베이스 클러스터를 지정한다.

  • INFILE : IDCAMS 호출 전에 실행환경에 의해서 미리 할당된 데이터셋을 사용하는 경우에는 ddname을 사용한다.

  • INDATASET : IDCAMS 자체적으로 데이터셋을 할당하는 경우에는 entryname을 사용한다. INDATASET 파라미터를 이용해서 지정한 베이스 클러스터는 배타적으로(DISP=OLD) 할당된다.

OUTFILE|

OUTDATASET

BLDINDEX 결과로 구성되는 보조 인덱스 클러스터를 지정한다. BLDINDEX 전에 보조 인덱스는 미리 DEFINE되어야 한다.

  • OUTFILE : IDCAMS 호출 전에 실행환경에 의해서 미리 할당된 데이터셋을 사용하는 경우에는 ddname을 사용한다.

  • OUTDATASET : IDCAMS 자체적으로 데이터셋을 할당하는 경우에는 entryname을 사용한다. OUTDATASET 파라미터를 이용해서 지정한 보조 인덱스 클러스터는 배타적으로(DISP=OLD) 할당된다.

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

지정된 클러스터의 인덱스 컴포넌트에 대해 무결성 검사 수행 여부를 결정한다.

  • INDEXTEST : 인덱스 컴포넌트의 무결성 검사를 수행한다. (기본값)

  • NOINDEXTEST : 인덱스 컴포넌트의 무결성 검사를 수행하지 않는다.

DATATEST|

NODATATEST

지정된 클러스터의 데이터 컴포넌트에 대해 무결성 검사 수행 여부를 검사한다.

  • 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)]

PRINT

[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의 실행 로그를 사용할 수 없는 경우

    출력 메시지가 저장될 출력 데이터셋을 사용할 수 없는 경우 컨디션 코드 16이 발생한다. 예를 들어 SYSPRINT DD를 열지 못한 경우 IDCAMS는 더 이상의 실행하지 않고 바로 종료한다.

  • IDCAMS 명령을 잘못 코딩한 경우

    IF-THEN-ELSE 문을 잘못 코딩하거나 여러 라인에 걸쳐서 명령을 코딩할 때 하이픈(-)을 적절히 사용하지 않은 경우에 발생한다.

  • 시스템 데이터셋이 망가진 경우

    BCS나 VVDS의 내용에 오류가 존재해서 명령을 수행할 수 없는 경우이며, SYSPRINT DD를 사용할 수 있는 경우라면 다음과 같은 에러 메시지가 출력된다.

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 옵션과 같이 사용할 수 없다.

  • length : 비교하는 필드의 길이를 설정한다.

  • starting-location : 레코드 내의 필드가 시작되는 위치를 설정한다.

MASK

레코드 내의 필드를 제외하고 비교할 경우 설정한다.

FIELD 옵션과 같이 사용할 수 없다.

  • length : 제외 할 필드의 길이를 설정한다.

  • starting-location : 레코드 내의 제외할 필드가 시작되는 위치를 설정한다.

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

비교하는 멤버의 멤버명을 설정한다.

  • member-name : SYSUT1과 SYSUT2의 멤버명이 같은 경우 설정한다.

  • SYSUT1-member-name, SYSUT2-member-name : SYSUT1과 SYSUT2의 멤버명이 다른 경우 설정한다.

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 : SYSUT1 데이터셋을 SYSUT2 데이터셋으로 복사한다.

  • REPLACE : 출력 데이터셋에 있는 멤버와 같은 이름으로 복사할 경우 이 명령어가 있으면 오버라이드하고 그렇지 않으면 복사하지 않는다.

  • LIST : 복사된 멤버들의 이름을 SYSPRINT에 기록한다. EXEC 문의 PARM 파라미터에 COPY나 REPLACE를 설정하면 SYSIN DD에 설정한 명령어는 무시된다. (기본값: YES)

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로 모두 복사된다.

figure 1 4
PDS 데이터셋 복사

다음은 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만 복사된다.

다음 그림은 위의 예제를 실행하면서 출력 데이터셋에 멤버가 복사되는 과정과 최종 복사된 멤버를 보여준다.

figure 1 5
데이터셋 병합

다음은 입력 데이터셋에서 특정 멤버를 선택하거나 제외하여 복사하는 예이다.

//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를 오버라이드한다.

다음 그림은 앞의 예제를 실행하면서 출력 데이터셋에 멤버가 복사되는 과정과 최종 복사된 멤버를 보여준다.

figure 1 6
특정 멤버 복사

다음은 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으로부터 전체 멤버를 복사한다. 단, 같은 이름의 멤버가 이미 존재할 경우 교체하지 않는다.

figure 1 7
INDD 문을 사용하여 INPUT 처리

다음은 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으로부터 전체 멤버를 복사한다. 같은 이름의 멤버가 이미 존재할 경우 교체하지 않는다.

figure 1 8
COPY 문의 서브 명령어로 INDD를 사용하는 경우

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가지 방법이 있다.

  • character 형식 : 1Byte 문자만 입력한다.

  • X’nn 형식 : 헥사 2자리로 입력한다. (예: FILL=X'40' 또는 FILL=X’FF' )

FORMAT

필드를 채울 패턴을 지정한다.

pattern에는 다음과 같은 값이 올 수 있다.

  • AL : 알파벳을 패턴으로 사용한다. (Alphabetic)

  • AN : 알파벳과 숫자를 패턴으로 사용한다. (Alphanumeric)

  • BI : 바이너리를 패턴으로 사용한다. (Binary number)

  • CO : Collating sequence를 패턴으로 사용한다. (현재 지원하지 않음)

  • PD : PACKED DECIMAL을 패턴으로 사용한다. (10자리까지 표현이 가능하며 10자리 이후는 0x00으로 초기화)

  • RA : 무작위의 바이너리를 패턴으로 사용한다. (Random number)

  • ZD : ZONED DECIMAL을 패턴으로 사용한다. (18자리까지 표현이 가능하며 18자리 이후는 0x30으로 초기화)

CHARACTER

패턴의 시작 문자를 지정한다.

PICTURE

사용자가 패턴을 직접 정의하여 사용한다. LENGTH에서 지정한 필드 길이만큼 지정하며 LENGTH의 길이보다 크게 지정이 되면 그 이후 패턴은 무시된다(위에서 기술한 FORMAT 문과 같이 사용하지 않는다).

SIGN

PACKED DECIMAL이나 바이너리 필드의 부호를 결정한다.

ACTION

필드의 내용이 변경되는 방법을 지정한다. 현재는 PICTURE를 통해 사용자가 직접 지정한 문자열 타입의 필드 또는 FORMAT의 AL,AN 필드에 대해서만 동작한다.

  • FX : 고정된 내용이 출력 레코드에 포함된다.

  • RO : PICTURE에서 지정한 패턴이 왼쪽으로 한 칸씩 이동하다 마지막 문자까지 도달한 경우 다시 오른쪽으로 한 칸씩 이동하며 본 위치로 돌아온 후 다시 왼쪽으로 이동한다. RO가 동작하려면 PICTURE를 통해 지정한 길이가 FD의 LENGTH 값보다 작아야 한다.

  • RP : 바이너리를 패턴으로 사용한다. 문자가 한 칸씩 왼쪽으로 이동한다. 필드의 마지막 Byte는 기존의 첫 Byte 문자나 위의 FORMAT에서 지정된 패턴에 따라 계속 이어진다.

  • SL : 왼쪽 방향으로 패턴을 옮겨나간다. 문자가 한 개만 남은 경우 초기 필드 상태로 돌아간 후 계속 옮겨간다.

  • SR : 오른쪽 방향으로 패턴을 옮겨나간다. 문자가 한 개만 남은 경우 초기 필드 상태로 돌아간 후 계속 옮겨간다.

  • TL : 필드의 왼쪽 문자부터 지우며 길이를 줄인다. 문자가 한 개만 남은 경우 초기 필드 상태로 돌아간 후 계속 줄여간다.

  • TR : 필드의 오른쪽 문자부터 지우며 길이를 줄인다. 문자가 한 개만 남은 경우 초기 필드 상태로 돌아간 후 계속 줄여간다.

  • WV : PICTURE에서 지정한 패턴이 왼쪽으로 한 칸씩 이동한다. 끝까지( 빈칸이 아닌 캐릭터가 필드의 첫 Byte에 위치) 도달한 후 계속 이동한다. WV가 동작하려면 PICTURE를 통해 지정한 길이가 FD의 LENGTH 값보다 작아야 한다.

INDEX

레코드가 추가될 때마다 필드 값을 증가시킬 십진수를 지정한다.

FORMAT이 ZD, PD, BI이거나 PICTURE를 지정한 경우에 이용할 수 있다. 단, PICTURE의 'character-string’의 뒷 부분은 숫자형으로 구성되어야 한다.

  • CYCLE : INDEX가 적용될 레코드 단위를 지정한다. CYCLE=3이라면 레코드가 3개 추가될 때마다 필드의 값이 증가한다. 생략되면 1로 간주한다.

  • RANGE : 필드의 값의 최고치를 지정한다. INDEX에 의해 증가한 필드 값이 이 값을 초과하는 경우 필드의 값은 기존 값 그대로 갖게 된다. 생략되면 무한히 증가한다.

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가지 방법이 있다.

  • character 형식 : 1Byte 문자만 입력한다.

  • X’nn 형식 : 헥사 2자리로 입력한다. (예: FILL=X'40' 또는 FILL=X’FF' )

INPUT

입력으로 이용할 데이터셋들의 DD를 지정한다.

DD 대신 SYSIN을 통해 입력 데이터를 직접 JCL 내에 기술할 수 있으며 데이터의 끝은 '$$$E’로 표시한다. SYSIN의 'cccc' 기능은 지원하지 않는다.

  • 예)

    CREATE 문에서 SYSIN을 통한 입력 데이터 '1234567890’를 지정하는 경우

    CREATE QUANTITY=2,INPUT=SYSIN
    1234567890
    $$$E

PICTURE

사용자가 패턴을 직접 정의한다.

NAME

입력으로 사용할 namelist를 기술한다.

namelist만으로 기술하거나, namelist와 copygroup를 혼용할 수 있다.

  • namelist는 NAME 항목으로 구성되며, NAME 항목은 FD 명령에서 NAME 문으로 지정한 필드이다.

  • copygroup은 (COPY=n,name1[,name2] [,…​]) 형식으로 구성되고, COPY 문에 정의된 값은 COPY 문 다음에 올 NAME의 반복 횟수이다. 예로 NAME=(COPY=3, 필드NAME1)문의 의미는 NAME=(필드NAME1,필드NAME1,필드NAME1)과 동일하다.

사용방법은 다음과 같다.

  • 필드NAME1

  • 필드NAME1, 필드NAME2,…​.

  • 필드NAME1, (COPY=2, 필드NAME2), 필드NAME3

  • 필드NAME1, (COPY=2, 필드NAME2), 필드NAME3, (COPY=4, 필드NAME4)

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 문의 동작을 기술한다. 다음 중 하나의 옵션을 선택한다.

  • POSITION : STEPNAME으로 지정한 STEP을 포함하여 해당 JOB의 모든 STEP을 출력 데이터셋에 포함하고, 이전의 모든 STEP은 무시한다.

  • INCLUDE : 해당 JOB의 STEP 중에서 STEPNAME으로 지정한 STEP만을 출력 데이터셋에 포함한다.

  • EXLCUDE : 해당 JOB의 STEP 중에서 STEPNAME으로 지정한 STEP 이외의 모든 STEP을 데이터셋에 포함한다.

STEPNAME

인자로 사용할 namelist를 기술한다.

STEP의 namelist는 다음의 3가지 방법을 모두 사용하여 기술할 수 있다.

  • STEP

  • STEPA, STEPB,…​.

  • STEPA-STEPG (STEPA부터 STEPG까지를 의미)

콤마(,)와 대시(-)를 구분자로 하여 혼용할 수 있다.

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가 적용되는 마지막 레코드가 된다.

  • length : name을 식별하기 위한 길이를 최대 8Byte까지 지정할 수 있다.

  • 'name' : 마지막 레코드를 식별하기 위한 값으로서 반드시 작은따옴표(' ') 안에 기술되어야 한다.

  • Input-location : 입력 레코드에서 name 값과 비교할 FIELD의 첫 번째 시작위치를 지정한다.

FIELD

레코드 편집을 위한 정보를 기술한다.

입력 레코드에서 input-location 위치부터 length만큼의 데이터를 출력 레코드의 output-location 위치에 쓰거나 리터럴을 length만큼 출력 레코드의 output-location 위치에 쓴다.

  • length : 처리되는 입력 필드의 길이 또는 리터럴의 길이를 기술한다.

  • input-location : 처리되는 필드의 시작위치를 지정한다.

  • 'literal' : output-location에 위치해야 하는 리터럴을 지정한다.

  • conversion : 파라미터로 CG, CV, GC, GV, HE, PZ, VC, VG, ZP를 사용할 수 있으며, 현재는 ZP, PZ만 기능을 수행한다.

    • ZP : Zoned Decimal 값을 Packed Decimal로 변환한다.

    • PZ : Packed Decimal 값을 Zoned Decimal로 변환한다

  • 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 위치에 복사한다.

figure 1 9
첫 번째 입력 레코드 필드 복사

IDENT 조건에 맞는 레코드가 처리되고 난 다음부터는 두 번째 RECORD 문이 다음 그림과 같이 적용된다. 입력 레코드의 41번째 Byte 위치부터 70Byte 길이만큼의 값을 출력 레코드의 11번째 Byte 위치에 복사하고 출력 레코드의 처음 10Byte는 리터럴 ‘**********'로 복사한다.

figure 1 10
두 번째 입력 레코드 필드 복사

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 문은 가장 처음에 기술해야 하는 명령어로 여러 번 반복해서 지정할 수 없다.

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은 다음과 같이 설정한다.

  • title : 타이틀이나 서브 타이틀에 대한 리터럴을 기술한다. 최대 40Byte까지 지정할 수 있다.

  • output-location : 출력 레코드에서 ITEM의 리터럴이 놓여져야 할 위치를 지정한다.

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가 기술되어 있어야 한다.

  • length : 마지막 레코드를 식별하기 위한 길이를 지정한다. 최대 8Byte까지 지정할 수 있다.

  • 'name' : 마지막 레코드를 식별하기 위한 값으로 반드시 작은따옴표(‘ ‘) 안에 기술되어야 한다.

  • input-location : 입력 레코드에서 name 값과 처리할 데이터의 마지막 레코드를 식별할 필드의 첫 번째 시작위치를 지정한다.

FIELD

레코드 편집을 위한 정보를 기술한다. 입력 레코드상에서 input-location 위치부터 length만큼의 데이터를 출력 레코드의 output-location 위치에 쓰거나 리터럴을 length만큼 출력 레코드의 output-location 위치에 쓴다.

FIELD를 사용하기 위해서는 PRINT 문의 MAXFLDS가 기술되어 있어야 한다.

  • length : 편집되어 처리되는 입력 필드의 길이 또는 리터럴의 길이를 기술한다.

  • input-location : 처리되는 필드의 시작위치를 기술한다.

  • output-location : 출력 레코드에 기록될 시작위치를 지정한다.

CONVERSION

레코드의 변환을 위한 정보를 기술한다. CV, PZ, VC, XE의 4가지 파라미터 값을 사용할 수 있다.

  • CV : SOSI 변환 없이 출력한다.

  • PZ : Packed 10진 데이터를 Zoned 10진 데이터로 변경하려 출력한다.

  • VC : 필드 선두에 0E, 후미에 0F를 추가해 출력한다.

  • XE : 16진 데이터로 변환하여 출력한다.

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

  • NEW : 데이터셋을 신규 생성하는 경우에 지정한다. DD 설정 항목의 SYSUT1 DD 항목을 생략할 수 있다.

  • MOD : 기존 데이터셋을 수정하는 경우에 지정한다. DD 설정 항목의 SYSUT1 DD 항목은 반드시 존재해야 한다. (기본값)

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 중 하나로 입력 데이터셋의 처리 방법을 지정한다.

  • DUMP : 입력 데이터셋을 읽어서 출력 데이터셋으로 복사한다. 데이터셋의 초기화는 이루어지지 않는다.

  • CLEAR : 입력 데이터셋의 모든 내용을 삭제하고 데이터셋을 초기화한다. 출력 데이터셋으로의 복사는 이루어지지 않는다.

  • ALL : DUMP 후에 CLEAR를 수행한다.

OUTDD

출력 데이터셋과 복사될 레코드 타입의 목록을 지정한다.

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

OUTDD(ddname,{TYPE(list),NOTYPE(list)})
항목 설명

OUTDD

출력 데이터셋과 레코드 타입의 복사 범위를 지정한다.

OUTDD 구문이 없을 경우 기본값은 OUTDD(DUMPOUT,TYPE(000:255))이다.

ddname

출력 데이터셋 ddname을 지정한다.

TYPE

출력 데이터셋에 복사할 경우 포함할 레코드 타입을 list에 열거한다.

NOTYPE

출력 데이터셋에 복사할 경우 제외할 레코드 타입을 list에 열거한다.

list

레코드 타입을 아래의 3가지 방법으로 열거한다. 구분자는 콤마(,)이다.

  • 개별 지정, n : 레코드 타입 n을 의미한다.

  • 범위 지정, n:m : n부터 m의 레코드 타입을 의미한다.

  • 서브 레코드 타입 지정, n(list) : list에 기술된 서브 레코드 타입을 가진 n의 레코드 타입을 의미한다.

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 시스템 라이브러리 초기화 실패