기타 유틸리티

본 장에서는 기타 유틸리티에 대해 기술한다.

1. 개요

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

프로그램명 설명

ADAPT

업무처리 등에 쓰이는 데이터 셋을 간단한 명령어를 사용함으로써 자유롭게 조작하는 유틸리티 프로그램이다.

DSDIFF

데이터 셋의 레코드별 차이점을 보여주는 유틸리티 프로그램이다.

EZTPA00

JCL에서 SYSIN으로 입력된 CA-Easytrieve Plus 스크립트를 실행시켜주는 유틸리티 프로그램이다.

ICETOOL

SORT 유틸리티 프로그램을 이용하여 1개의 JOB STEP에서 복수의 데이터 셋을 다양한 방법으로 출력하는 유틸리티 프로그램이다.

KDJBR14

JCL에 기술된 내용이 정상적으로 실행되는지 확인하기 위해 사용하는 테스트용 유틸리티 프로그램이다.

KEQEFT01

데이터베이스를 사용하는 Batch 애플리케이션을 JCL로 실행하려고 할 때 애플리케이션이 실행되기 전에 데이터베이스 시스템으로 접속해주는 유틸리티 프로그램이다.

2. ADAPT

업무처리 등에 쓰이는 데이터셋을 간단한 명령어를 사용함으로써 자유롭게 조작하는 유틸리티 프로그램이다.

복사(COPY), 편집(EDIT), 비교(COMP), 인쇄(PRINT), 덤프(LIST), 변경(ALTER), 추가(INSERT), 체크(CHECK)의 기능이 있으나 현재 ADAPT는 복사(COPY), 편집(EDIT), 변경(ALTER)의 3가지 기능만 구현되어 있다.

2.1. DD 설정

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

항목 설명

SYSIN DD

ADAPT에 필요한 명령어를 기술한다.

SYSPRINT DD 또는 SYSOUT DD

ADAPT를 수행하는 중 발생한 메시지가 출력된다.

임의 DD

ADAPT의 입력 또는 출력 데이터셋을 기술한다. SYSIN에서 INPUT, OUTPUT, OUT2(ddname)을 통해 임의 DD를 사용하도록 지정한다.

2.2. 명령어 설정

SYSIN DD를 통해 다음의 순서로 명령어를 기술할 수 있고, 여러 개를 기술할 수 있다. 각 명령어의 사용법은 각 절의 설명을 참고한다.

  • 명령어를 기술할 때의 제한 조건

    • 명령어의 시작은 공백 또는 문자(/)로 시작하여야 한다.

    • 명령어는 70글자 이하로 기술해야 한다.

    • 명령어 다음 공백 이후로는 comment로 처리된다.

2.2.1. 기능 제어 명령어

  • COPY

    명령어에 주어진 조건에 따라 레코드의 추출, 삭제, 분류를 수행한다.

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

    COPY OUTPUT,INPUT[,OUT2(ddname)]
    항목 설명

    OUTPUT

    출력 데이터셋의 DD 이름을 지정한다.

    INPUT

    입력 데이터셋의 DD 이름을 지정한다.

    OUT2

    OUT2가 지정된 경우 추출 조건에 맞지 않은 레코드는 OUT2에 지정된 DD 이름으로 출력된다. ddname에 분류용 데이터셋의 DD 이름을 지정한다.

  • EDIT

    명령어에 주어진 조건에 따라 레코드를 추출하고, 추출한 레코드 내의 항목을 편집하여 출력한다. 추출하지 않은 레코드에 대해서는 출력하지 않고 건너뛴다.

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

    EDIT OUTPUT,INPUT
    항목 설명

    OUTPUT

    출력 데이터셋의 DD 이름을 지정한다.

    INPUT

    입력 데이터셋의 DD 이름을 지정한다.

  • ALTER

    명령어에 주어진 조건에 따라 레코드를 추출, 그 내용에 명령어에 주어진 내용으로 변경하여 출력한다. 변경 대상 외의 레코드에 대해서는 그대로 출력하며, 변경 대상 레코드에 대해서는 변경 후의 내용을 인쇄할 수 있다.

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

    ALT[ER] OUTPUT,INPUT
    항목 설명

    OUTPUT

    출력 데이터셋의 DD 이름을 지정한다.

    INPUT

    입력 데이터셋의 DD 이름을 지정한다.

2.2.2. 조건 제어 명령어

  • KEY

    조건을 지정하는 명령어로 입출력 레코드 형식을 지정한다.

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

    KEY keypos,keylen,keyfmt[,keypos,keylen,keyfmt,...]
    항목 설명

    keypos

    키 필드의 시작 위치 지정한다.

    keylen

    키 필드의 길이를 지정한다.

    keyfmt

    키 필드의 형식을 지정한다. 현재는 X, P만 사용할 수 있다.

    • X : Character

    • 9 : Decimal

    • P : Packed Decimal

    • H : Hex Decimal

    • HL : Binary

  • K

    추출 조건을 지정하는 명령어로 레코드의 내용을 지정한다. 현재는 COPY와 ALTER 명령에서만 사용할 수 있다.

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

    KEY keynum,operator,value[,keynum,operator,value,...]
    항목 설명

    keynum

    KEY 문으로 설정된 키 번호를 지정한다.

    operator

    비교 연산자를 지정한다.

    • G 또는 > : 데이터 > value

    • L 또는 < : 데이터 < value

    • E 또는 = : 데이터 = value

    • NG 또는 N> : 데이터 <= value

    • NL 또는 N< : 데이터 >= value

    • NE 또는 N= : 데이터 != value

    value

    비교할 데이터를 지정한다. 작은따옴표(' ')로 묶여 있는 문자열이나 정수 형태의 값을 지정할 수 있다.

  • R

    추출 조건을 지정하는 명령어로 레코드의 수를 지정한다. 현재는 ALTER 기능 명령어만 사용할 수 있다.

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

    R startnum[,endnum]
    항목 설명

    startnum

    시작 레코드의 번호를 지정한다.

    endnum

    마지막 레코드의 번호를 지정한다. 데이터셋의 끝까지 처리할 EOF를 지정하고 지정하지 않으면 시작 레코드 한건만 처리된다.

  • ED

    편집 조건을 지정하는 명령어로 EDIT 기능 명령어만 사용한다.

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

    ED recvnum=sendnum
    항목 설명

    recvnum

    편집할 키 번호를 지정한다. KEY 문에 설정된 키 번호를 지정한다.

    sendnum

    편집할 내용을 담은 키 번호를 지정한다. KEY 문에 설정된 키 번호를 지정한다.

  • A

    ALTER 기능 명령어를 사용할 때 변경 항목을 지정한다.

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

    A keypos,keylen,keyfmt,value
    항목 설명

    keypos

    변경 항목의 시작 위치를 지정한다.

    keylen

    변경 항목의 길이를 지정한다.

    keyfmt

    변경 항목의 형식을 지정한다. KEY 명령어의 keyfmt와 같은 형식이다.

    value

    변경 내용을 지정한다. 작은따옴표(' ')로 묶여 있는 문자열이나 정수 형태의 값을 지정할 수 있다.

2.3. 사용예제

다음은 OPENFRAME.ADAPT.U01 데이터셋을 OPENFRAME.ADAPT.U11 데이터셋에 복사하는 예제이다. 레코드의 8번째 문자가 '4’이고 225번째 문자가 '2’인 레코드를 복사하고 그렇지 않으면 OPENFRAME.ADAPT.U10 데이터셋에 복사된다.

//JOB01    JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//COPY     EXEC PGM=ADAPT
//U01      DD DSN=OPENFRAME.ADAPT.U01,DISP=SHR
//U10      DD DSN=OPENFRAME.ADAPT.U10,DISP=SHR
//U11      DD DSN=OPENFRAME.ADAPT.U11,DISP=SHR
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
/      COPY    U11,U01,OUT2(U10)
/      KEY     8,1,X,225,1,X
/      K       1,E,'4'
/      K       2,E,'2'
/*

다음은 OPENFRAME.ADAPT.U01 데이터셋의 내용을 편집하여 OPENFRAME.ADAPT.U02 데이터셋에 저정하는 예제이다. 레코드에서 179번째 문자에서 시작되는 길이 3의 문자열을 147번째 문자에서 시작되는 길이 3의 문자열로 편집한다.

//JOB02    JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//COPY     EXEC PGM=ADAPT
//U01      DD DSN=OPENFRAME.ADAPT.U01,DISP=SHR
//U02      DD DSN=OPENFRAME.ADAPT.U02,DISP=SHR
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
/      EDIT    U02,U01
/      KEY     147,3,X,179,3,X
/      ED      2=1
/*

다음은 OPENFRAME.ADAPT.U01 데이터셋의 내용을 변경하여 OPENFRAME.ADAPT.U10 데이터셋에 저장하는 예제이다. 144번째 문자에서 시작되는 길이 6의 문자열이 '498830’이고 8번째 문자에 시작되는 길이 3의 문자열이 '100’인 레코드 경우 대상 레코드의 169번째 문자에서 시작되는 길이 5의 문자열을 '00100’으로 변경하고 179번째 문자에서 시작되는 길이 6의 문자열을 '001000’으로 변경한다.

144번째 문자에서 시작되는 길이 6의 문자열이 '498830’이고 8번째 문자에 시작되는 길이 3의 문자열이 '101’인 레코드의 경우 대상 레코드의 169번째 문자에서 시작되는 길이 5의 문자열을 '00200’으로 변경하고 179번째 문자에서 시작되는 길이 6의 문자열을 '002000’으로 변경한다.

//JOB03    JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//COPY     EXEC PGM=ADAPT
//U01      DD DSN=OPENFRAME.ADAPT.U01,DISP=SHR
//U10      DD DSN=OPENFRAME.ADAPT.U10,DISP=SHR
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSIN    DD *
/      ALTER   U10,U01
/      KEY     144,6,X,8,3,X
/      K       1,E,'498830',2,E,'100'
/      A       169,5,X,'00100'
/      A       179,6,X,'001000'
/      K       1,E,'498830',2,E,'101'
/      A       169,5,X,'00200'
/      A       179,6,X,'002000'
/*

2.4. 유의사항

ADAPT를 실행한 결과는 다음과 같다.

  • 정상적으로 실행한 경우

    코드 0을 반환하고 그 이외의 경우 코드 10을 반환한다.

  • 에러가 발생한 경우

    • 해당 에러 메시지는 SYSPRINT DD에 출력하고 에러 코드 8을 반환한다. 그 이외의 경우 에러 코드 50을 반환한다.

    • 일반 에러보다 더 심각한 에러가 발생한 경우 에러 코드 12를 반환하고 그 이외의 경우 에러 코드 50을 반환한다.

3. DSDIFF

데이터셋의 레코드별 차이점을 보여주는 유틸리티 프로그램이다.

OpenFrame 설치 후 또는 유틸리티, 라이브러리 등의 모듈 업데이트 후에 수행하는 검증 테스트로, 수행 결과로 생성된 데이터셋이 예상대로 구성되었는지 확인하는 데 사용할 수 있다.

3.1. DD 설정

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

항목 설명

SYSIN DD

비교 대상 데이터셋의 ddname 목록을 기술한다.

목록의 구분자로 콤마(,)를 사용한다. 예를 들어 'AA,BB,CC’는 AA와 BB 그리고 CC를 비교한다.

TARGET DD

비교할 데이터셋을 정의한다. 비교 데이터셋은 SYSIN DD에 기술한 ddname 목록에 포함되어야 한다.

3.2. 명령어 설정

SYSIN DD에 기술하는 데이터셋 리스트의 구문은 다음과 같다.

ddname,ddname[ddname,....]

이와 같이 SYSIN DD에 데이터셋 리스트를 기술하는 것 외에 설정해야 하는 명령어는 없다.

3.3. 사용예제

다음은 EXPECTED, INREC, SUM DD 세 개의 레코드를 비교하여 차이점을 보여주는 예이다.

//JOB01    JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//DSDIFF   EXEC PGM=DSDIFF,REGION=2M
//SYSIN    DD  *
EXPECTED,INREC,SUM
/*
//SYSOUT   DD SYSOUT=*
//EXPECTED DD  DSN=OFTEST.SORT.OUT01.EXPECTED,DISP=OLD
//INREC    DD  DSN=OFTEST.SORT.OUT01.INREC,DISP=OLD
//SUM      DD  DSN=OFTEST.SORT.OUT01.SUM,DISP=OLD

3.4. 유의사항

레코드 길이가 다르면 가장 짧은 레코드의 레코드 길이까지의 데이터가 모두 일치하더라도 서로 다른 레코드로 판단한다.

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

  • 정상적으로 실행한 경우

    Batch 애플리케이션에서 받은 코드를 반환한다.

  • 에러가 발생한 경우

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

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

    코드 설명

    4

    레코드에서 한 개 이상의 차이가 있을 경우에 해당한다.

    16

    SYSIN으로 주어진 ddname이 존재하지 않거나 데이터셋 I/O 에러 등의 OpenFrame 혹은 UNIX 에러를 의미한다.

4. EZTPA00

JCL에서 SYSIN으로 입력된 CA-Easytrieve Plus 스크립트를 실행시켜주는 유틸리티 프로그램이다.

스크립트를 실행하기 위해 외부 프로그램인 TmaxSoft 사의 ProTrieve를 사용하게 되며 외부 프로그램을 위한 각종 환경을 설정하게 된다. CA-Easytrieve Plus 스크립트를 통해 데이터셋 입출력, 데이터 가공 및 레포트 생성 등의 작업을 할 수 있다.

다음은 EZTPA00가 동작하는 방법이다. CA-Easytrieve Plus 스크립트가 ProTrieve에 전달되어 실행된다.

figure eztpa00 2
EZTAP00 동작

본 안내서에서는 CA-Easytrieve Plus 스크립트의 상세한 내용은 기술하지 않는다. 해당 내용은 ProTrieve의 안내서를 참고한다.

4.1. DD 설정

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

항목 설명

SYSIN DD

CA-Easytrieve Plus 스크립트 입력 데이터셋을 지정한다.

SYSPRINT DD

CA-Easytrieve Plus의 결과로 생긴 리포트나 DISPLAY로 기술된 메시지의 출력 데이터셋을 지정한다.

SYSOUT DD

CA-Easytrieve Plus 실행 중 EZTPA00, ProTrieve로부터 발생한 메시지의 출력 데이터셋을 지정한다.

anyname DD

CA-Easytrieve Plus 구문 중 FILE 처리에 사용되는 데이터셋을 지정한다. DD 이름은 CA-Easytrieve Plus 스크립트의 파일명과 같아야 한다.

4.2. 사용예제

다음은 EZTPA00을 사용하여 FILEA에서 FILEB로 복사하는 예제이다.

//SAMPLE   JOB  CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//EZPLUS   EXEC PGM=EZTPA00
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//FILEA    DD DSN=OPENFRAME.EZPLUS.FILEA,DISP=SHR
//FILEB    DD DSN=OPENFRAME.EZPLUS.FILEB,DISP=(NEW,CATLG),
//         DCB=(RECFM=FB,LRECL=1024,BLKSIZE=10240)
//SYSIN DD *
FILE FILEA
    RECA        1             1024  A
FILE FILEB
    RECB        1             1024  A
*
JOB INPUT FILEA
    MOVE FILEA TO FILEB
    PUT FILEB
/*

SYSOUT DD가 존재하지 않으면 유틸리티 실행 중 발생한 메시지가 SYSPRINT에 출력되어 원하는 SYSPRINT 출력 결과를 얻지못할 수도 있으므로 주의한다.

4.3. 관련 환경설정

EZTPA00을 구동하기 위해 OpenFrame 환경설정에 ezplus 서브젝트의 섹션들을 설정한다.

ezplus 서브젝트 환경설정 항목의 세부 내용은 OpenFrame Batch "환경설정 안내서"를 참고한다.

4.4. 유의사항

EZTPA00을 실행한 결과는 다음과 같다.

  • 정상적으로 실행한 경우

    외부 프로그램으로부터 받은 코드 0을 반환한다.

  • 에러가 발생한 경우

    반환코드 16을 반환한다. 에러에 대한 자세한 메시지는 SYSOUT DD에 출력된다.

5. ICETOOL

SORT 유틸리티 프로그램을 이용하여 1개의 JOB STEP에서 복수의 데이터셋을 다양한 방법으로 출력하는 유틸리티 프로그램이다. TOOLIN DD로 주어진 명령어에 따라 SORT 유틸리티 프로그램을 이용하여 데이터를 처리한다.

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

  • 정렬된 입력 데이터셋의 복사본을 생성한다.

  • 수정되었거나 수정되지 않은 입력 데이터셋의 복사본을 생성한다.

  • 수정되었거나 수정되지 않은 입력 데이터셋의 레코드 카운트를 출력한다.

  • 문자와 숫자 필드값 또는 유일한 값이 발생한 총 횟수 등의 다양한 기준으로 입력 데이터셋을 포함하고 있는 출력 데이터셋을 생성한다.

  • 서로 다른 포맷의 레코드 필드를 병합하여 하나 또는 복수의 레코드로 출력한다.

5.1. DD 설정

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

항목 설명

TOOLMSG

ICETOOL의 출력 메시지를 저장한다.

DFSMSG

ICETOOL이 SORT 프로그램을 내부적으로 사용하면서 출력되는 메시지를 저장한다.

TOOLIN

ICETOOL 명령어를 기술한다.

indd

ICETOOL의 입력 데이터셋을 기술한다. TOOLIN에서 FROM(indd)를 통해 indd를 사용하도록 지정한다.

outdd

ICETOOL의 COPY, SELECT, SORT 수행에서 사용할 출력 데이터셋을 기술한다. TOOLIN에서 TO(outdd)를 통해 outdd를 사용하도록 지정한다.

savedd

ICETOOL의 SELECT 수행에서 사용할 출력 데이터셋을 기술한다. TOOLIN에서 DISCARD(savedd)를 통해 savedd를 사용하도록 지정한다.

countdd

ICETOOL의 COUNT 수행에서 사용할 출력 데이터셋을 기술한다.

xxxxCNTL

ICETOOL에서 내부적으로 사용할 SORT 유틸리티 명령어를 기술한다. TOOLIN에서 USING xxxx를 통해 xxxxCNTL DD를 사용하도록 지정한다.

5.2. 명령어 설정

본 절에서는 ICETOOL에서 설정 가능한 명령어에 대해 설명한다.

  • COPY

    indd로 주어진 입력 데이터를 한 개 이상의 outdd로 복사한다. USING 절을 통해 xxxxCNTL을 사용하여 SORT 유틸리티를 구동할 수도 있다.

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

    COPY FROM(indd)
          TO(outdd,[outdd,...]) | USING(xxxx) | {TO(outdd,[outdd,....])
          USING(xxxx)} [VSAMTYPE(x)] [SERIAL]
    항목 설명

    FROM

    COPY 문을 수행할 입력 데이터셋을 지정한다.

    TO

    COPY 문을 수행한 후 저장할 출력 데이터셋을 지정한다.

    outdd에는 모두 동일한 결과가 저장된다. TO와 USING은 동시에 기술될 수 있으며, 둘 중 하나는 반드시 기술되어야 한다.

    USING

    COPY에서 사용할 SORT 유틸리티 명령어를 기술한다.

    USING이 있는 경우에는 반드시 xxxxCNTL DD를 기술해야 하며, TO가 없는 경우에는 xxxxCNTL dd에 OUTFIL로 출력 데이터셋을 지정해 주어야 한다.

    VSAMTYPE

    실제 기능은 하지 않으나 에러를 발생시키지 않도록 지원하고 있다.

    SERIAL

    실제 기능은 하지 않으나 에러를 발생시키지 않도록 지원하고 있다.

  • COUNT

    입력 데이터셋의 레코드 카운트를 출력한다. USING이 있는 경우에는 재편집된 뒤의 레코드 카운트를 출력한다.

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

    COUNT FROM(indd) [USING(xxxx)]
        [RC4] [EMPTY] [EQUAL(v)] [WRITE(countdd)] [TEXT('string')]
        [DIGITS(d)]
    항목 설명

    FROM

    COUNT 문을 수행할 입력 데이터셋을 지정한다.

    USING

    COUNT 문에서 사용할 SORT 유틸리티 명령어를 기술한다.

    RC4

    RC4가 명시되면 EMPTY, NOTEMPTY, HIGHER(x), LOWER(y), EQUAL(v), NOTEQUAL(w) 등의 조건을 충족하는 경우 RC=4를 리턴한다.

    OpenFrame에서는 앞의 조건들 중 EMPTY만 지원한다. (기본값: RC=12)

    EMPTY

    입력 데이터셋이 빈 데이터셋인 경우 RC=12(RC4가 명시된 경우에는 RC=4)를 리턴한다. 입력이 빈 데이터셋이 아닌 경우에는 RC=0을 리턴한다.

    EQUAL(v)

    COUNT 문의 결과 record 개수가 v개인 경우 RC=12(RC4가 명시된 경우에는 RC=4)를 리턴한다.

    WRITE(countdd)

    countdd를 지정한다. countdd는 레코드 카운트를 출력하는 데이터셋의 ddname을 의미한다. countdd DD의 포맷은 FB로만 지정이 가능하다.

    TEXT('string')

    countdd 데이터셋에 문자열을 출력한다. 레코드 카운트는 해당 문자열 뒤에 출력된다. TEXT는 WRITE가 있는 경우에만 사용할 수 있다.

    DIGITS(d)

    레코드 카운트가 몇자리 수로 출력될지 지정한다. DIGITS가 없는 경우에 기본값은 15이다.

  • DISPLAY

    indd로 주어진 입력 데이터를 지정된 값에 따라 출력한다.

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

    DISPLAY FROM(indd)
            LIST(listdd) ON(p,m,f)[ ON(p,m,f) ...]
            ON(p,m,f,E'pattern')[ ON(p,m,f,E'pattern') ...] ON(VLEN)
            ON(NUM) TITLE('string1') PAGE DATE(abcd) TIME(abc)
            BLANK HEADER('string1') [HEADER('string1') ...]
            LINES(n) COUNT('string') WIDTH(n) BETWEEN(n)
    항목 설명

    FROM

    입력 데이터셋을 지정한다.

    LIST

    출력될 리스트 데이터셋 이름을 기술한다.

    ON(p,m,f)

    DISPLAY 문이 적용될 필드를 정의한다. p Byte부터 m Byte만큼 f 포맷으로 DISPLAY 문을 적용한다.

    사용 가능한 f 포맷은 OpenFrame Batch "SORT 유틸리티 참조 안내서" "OUTFIL"의 "OUTREC | BUILD" 설명을 참고한다.

    ON(p,m,f,E’pattern')

    DISPLAY 문이 적용될 필드를 정의한다. p Byte부터 m Byte만큼 f 포맷으로 변환 후 'pattern’에 명시한 형태로 DISPLAY문을 적용한다.

    사용 가능한 f 포맷은 OpenFrame Batch "SORT 유틸리티 참조 안내서" "OUTFIL"의 "OUTREC | BUILD" 설명을 참고한다.

    ON(VLEN)

    입력 레코드가 가변길이 레코드(VB)인 경우 레코드 길이를 표시한다.

    ON(1,2,BI)와 같은 의미이다. VLEN 필드의 길이는 기본적으로 16Byte이다.

    ON(NUM)

    레코드 번호가 1부터 시작하여 각 레코드마다 1씩 증가한 값을 표시한다.

    TITLE('string1')

    타이틀 라인의 타이틀 문장(string1)을 출력한다. 타이틀 라인은 리스트 데이터셋의 첫 번째 라인에 출력된다.

    PAGE

    타이틀 라인에 현재 PAGE를 출력한다.

    DATE(abcd)

    타이틀 라인에 현재 날짜를 표시한다.

    • abc : M(month), D(date), Y(year) 또는 4의 조합으로 이루어지며 Y는 연도를 2자리로, 4는 연도를 4자리로 출력한다.

    • d : 구분자로 사용할 어떤 문자도 가능하다.

    TIME(abc)

    타이틀 라인에 현재 시간을 표시한다.

    • ab : 시간을 나타내며 12(12시간제) 또는 24(24시간제)로 표시한다.

    • c : 구분자로 사용할 어떤 문자도 가능하다.

    BLANK

    숫자 필드의 선행 제로(leading zeros)를 공백(space)으로 나타낸다.

    HEADER('string1')

    대응되는 ON 필드에 대해 제목을 출력한다. HEADER와 ON 필드는 기술된 순서에 따라 1대1로 대응된다.

    LINES(n)

    페이지당 줄 수를 나타낸다. (기본값: 58, n의 범위는 10 ~ 999)

    COUNT('string')

    'string’을 출력하며 그 뒤에 record의 개수를 출력한다.

    WIDTH(n)

    출력될 데이터셋의 행 길이 제한을 지정한다.

    BETWEEN(n)

    출력될 데이터셋의 열 공백의 개수를 지정한다. (기본값: 3, n의 범위는 0 ~ 50)

  • OCCUR(S)

    지정된 필드와 해당 필드가 나타나는 횟수를 리스트로 출력한다.

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

    OCCUR(S) FROM(indd)
          LIST(listdd) ON(p,m,f)[ ON(p,m,f) ...] ON(VLEN) ON(VALCNT) ON(VALCNT,Ndd)
          TITLE('string1') DATE(abcd) TIME(abc) BLANK HEADER('string1') [
          HEADER('string1') ...] NOHEADER LINES(n)
    항목 설명

    FROM

    입력 데이터셋 이름을 기술한다.

    LIST

    출력될 리스트 데이터셋 이름을 기술한다.

    ON(p,m,f)

    OCCUR 문이 적용될 필드를 정의한다. p Byte부터 m Byte만큼 f 포맷에 대해 OCCUR 문을 적용한다.

    ON(VLEN)

    입력 레코드가 가변길이 레코드(VB)인 경우 레코드 길이를 표시한다.

    ON(1,2,BI)와 같은 의미이다. VLEN 필드의 길이는 기본적으로 16Byte이다.

    ON(VALCNT)

    ON(p,m,f)에서 지정된 필드가 나타나는 횟수를 표시한다. VALCNT 필드의 길이는 기본적으로 15Bytes이다.

    ON(VALCNT,Ndd)

    ON(p,m,f)에서 지정된 필드가 나타나는 횟수를 표시한다. VALCNT 필드의 길이는 ddBytes이다.

    TITLE('string1')

    타이틀 라인의 타이틀 문장(string1)을 출력한다. 타이틀 라인은 리스트 데이터셋의 첫 번째 라인에 출력된다.

    DATE(abcd)

    타이틀 라인에 현재 날짜를 표시한다.

    • abc : M(month), D(date), Y(year) 또는 4의 조합으로 이루어지며 Y는 연도를 2자리로, 4는 연도를 4자리로 출력한다.

    • d : 구분자로 사용할 어떤 문자도 가능하다.

    TIME(abc)

    타이틀 라인에 현재 시간을 표시한다.

    • ab : 시간을 나타내며 12(12시간제) 또는 24(24시간제)로 표시한다.

    • c : 구분자로 사용할 어떤 문자도 가능하다.

    BLANK

    숫자 필드의 선행 제로(leading zeros)를 공백(space)으로 나타낸다.

    HEADER('string1')

    대응되는 ON 필드에 대해 제목을 출력한다. HEADER와 ON 필드는 기술된 순서에 따라 1대1로 대응된다.

    NOHEADER

    HEADER를 출력하지 않는 것을 지정한다.

    LINES(n)

    페이지당 줄 수를 나타낸다. (기본값: 58, n의 범위는 10 ~ 999)

  • SELECT

    indd로 주어진 입력 데이터를 주어진 조건에 따라 필터하여 outdd에 저장하거나 필터를 통과하지 못한 데이터를 savedd에 저장할 수 있다.

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

    SELECT FROM(indd) TO(outdd)
          | DISCARD(savedd) | {TO(outdd) DISCARD(savedd)}
          ON(p,m,f)[ ON(p,m,f)...]
          ALLDUPS | NODUPS | HIGHER(x) | LOWER(x) | EQUAL(x) | FIRST | LAST |
          FIRSTDUP | LASTDUP [VSAMTYPE(x)] [UZERO] [USING(xxxx)]
    항목 설명

    FROM

    입력 데이터셋 이름을 기술한다.

    TO

    필터된 레코드를 저장할 출력 데이터셋 이름을 기술한다.

    DISCARD

    필터 후 버려질 레코드를 저장할 데이터셋 이름을 기술한다.

    ON

    SELECT 문이 적용될 필드를 정의한다. p Byte부터 m Byte만큼 f 포맷에 대해 SELECT 문을 적용한다.

    ALLDUPS

    ON으로 지정된 필드의 값이 입력 데이터셋 내에서 중복되는 레코드만 저장한다.

    NODUPS

    ON으로 지정된 필드의 값이 입력 데이터셋 내에서 중복되지 않는 레코드만 저장한다.

    HIGHER

    ON으로 지정된 필드의 값이 입력 데이터셋 내에서 x번 초과로 나타나는 레코드만 저장한다.

    LOWER

    ON으로 지정된 필드의 값이 입력 데이터셋 내에서 x번 미만으로 나타나는 레코드만 저장한다.

    EQUAL

    ON으로 지정된 필드의 값이 입력 데이터셋 내에서 x번 나타나는 레코드만 저장한다.

    FIRST

    ON으로 지정된 필드의 값이 입력 데이터셋 내에서 유일한 레코드와 중복되는 레코드 중에서 위에서부터 첫 번째 레코드만 저장한다.

    LAST

    ON으로 지정된 필드의 값이 입력 데이터셋 내에서 유일한 레코드와 중복되는 레코드 중에서 위에서부터 마지막 레코드만 저장한다.

    FIRSTDUP

    ON으로 지정된 필드의 값이 입력 데이터셋 내에서 중복되는 레코드 중에서 위에서부터 첫 번째 레코드만 저장한다.

    LASTDUP

    ON으로 지정된 필드의 값이 입력 데이터셋 내에서 중복되는 레코드 중에서 위에서부터 마지막 레코드만 저장한다.

    VSAMTYPE

    실제 기능은 하지 않으나 에러를 발생시키지 않도록 지원하고 있다.

    UZERO

    실제 기능은 하지 않으나 에러를 발생시키지 않도록 지원하고 있다.

    USING

    SELECT 문에서 사용할 SORT 유틸리티 명령어를 기술한다.

  • SORT

    입력 데이터셋을 정렬하여 하나 이상의 출력 데이터셋으로 출력한다. 입력 데이터셋을 정렬 및 재편집하기 위해 SORT 유틸리티를 호출한다.

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

    SORT FROM(indd) USING(xxxx)
        [TO(outdd,[outdd,...])] [VSAMTYPE(x)] [SERIAL]
    항목 설명

    FROM

    SORT 문을 수행할 입력 데이터셋을 지정한다.

    USING

    SORT 문에서 사용할 SORT 유틸리티 명령어를 기술한다. SORT에서는 USING이 반드시 명시되어야 하며 xxxxCNTL DD 문은 SORT 명령문을 포함해야 한다.

    TO

    SORT 문을 수행한 후 저장할 출력 데이터셋을 지정한다. outdd에는 모두 동일한 결과가 저장된다.

    VSAMTYPE

    실제 기능은 하지 않으나 에러를 발생시키지 않도록 지원하고 있다.

    SERIAL

    실제 기능은 하지 않으나 에러를 발생시키지 않도록 지원하고 있다.

  • SPLICE

    베이스 레코드를 기준으로 하여 매칭되는 오버레이 레코드 필드로 덮어쓴다. 이 기능을 이용해 다른 형태의 여러 개의 입력 레코드들을 여러 정보를 가진 하나의 출력 레코드로 통합할 수 있다.

    ON으로 레코드 매칭을 검사하여 매칭되는 레코드 중 첫 번째 레코드는 베이스 레코드가 되고 다른 레코드들은 오버레이 레코드가 된다(옵션이 지정되지 않은 경우에는 마지막 레코드가 오버레이 레코드가 된다). 오버레이 레코드에 WITH로 지정된 필드가 베이스 레코드의 필드를 덮어쓴다. WITH 필드를 제외한 베이스 레코드의 나머지 필드들은 그대로 유지된다. 결과적으로 출력 레코드는 베이스 레코드와 오버레이 레코드의 조합으로 이루어진다.

    SPLICE FROM(indd) TO(outdd)
        ON(p,m,f)[ ON(p,m,f) ...] WITH(p,m)[ WITH(p,m) ...] [WITHALL] [WITHEACH]
       [KEEPNODUPS] [KEEPBASE][USING(xxxx)]
    항목 설명

    FROM

    입력 데이터셋 이름을 기술한다.

    TO

    통합된 레코드를 저장할 출력 데이터셋 이름을 기술한다.

    ON

    레코드 매칭이 적용될 필드를 정의한다.

    p Byte부터 m Byte만큼 f 포맷에 대해 매칭을 검토한다.

    WITH

    오버레이 레코드에서 지정한 필드의 위치와 길이만큼 베이스 레코드를 덮어쓴다.

    WITH를 여러 번 사용하여 복수 개의 필드를 덮어쓸 수 있다.

    WITHALL

    모든 오버레이 레코드에 대해 각각 베이스 레코드를 덮어쓴다.

    WITHALL이 없으면 마지막 오버레이 레코드만 베이스 레코드를 덮어쓴다.

    WITHEACH

    n번째 오버레이 레코드를 n번째 WITH의 베이스 레코드에 덮어쓴다.

    WITH의 개수보다 더 많은 OVERLAY 레코드가 있을 경우 레코드를 덮어쓰지 않는다.

    KEEPNODUPS

    매칭되지 않는 레코드들도 삭제되지 않고 출력되도록 한다.

    KEEPNODUPS가 명시되지 않으면 매칭되지 않는 레코드들은 삭제된다.

    KEEPBASE

    매칭되는 레코드들 중 BASE 데이터셋(FROM에 명시한 데이터셋)에 명시한 데이터셋의 레코드는 삭제되지 않고 출력되도록 한다.

    KEEPBASE가 명시되지 않으면 BASE 데이터셋에 명시한 매칭되는 레코드들은 삭제된다.

    USING

    SPLICE 문에서 사용할 SORT 유틸리티 명령어를 기술한다.

  • DATASORT

    FROM에 지정된 데이터셋을 TO에 지정된 데이터셋으로 복사한다. 데이터셋 맨 앞이나 맨 뒤의 레코드를 제외한 나머지 레코드들을 SORT 유틸리티에 전달할 수도 있다.

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

    DATASORT FROM(indd) TO(outdd) USING(xxxx)
          | [HEADER] | [FIRST] | [HEADER(u)] | [FIRST(u)]| [TRAILER] | [LAST] | [TRAILER(v)] | [LAST(v)] | [VSAMTYPE(x)]
    항목 설명

    FROM

    DATASORT 문을 수행할 입력 데이터셋을 지정한다.

    TO

    DATASORT 문을 수행한 후 저장할 출력 데이터셋을 지정한다.

    USING(xxxx)

    DATASORT에서 사용할 SORT 유틸리티 명령어를 기술한다.

    USING이 있는 경우에는 반드시 xxxxCNTL DD를 기술해야 한다.

    HEADER

    HEADER(1)과 같은 의미이다.

    FIRST

    HEADER(1)과 같은 의미이다.

    HEADER(u)

    데이터셋 맨 앞 u개의 레코드들은 SORT 유틸리티를 거치지 않고 직접 출력 데이터셋에 복사되고, 나머지 레코드들은 SORT 유틸리티에 전달된다.

    FIRST(u)

    HEADER(u)과 같은 의미이다.

    TRAILER

    TRAILER(1)과 같은 의미이다.

    LAST

    TRAILER(1)과 같은 의미이다.

    TRAILER(v)

    데이터셋 맨 뒤 v개의 레코드들은 SORT 유틸리티를 거치지 않고 직접 출력 데이터셋에 복사되고, 나머지 레코드들은 SORT 유틸리티에 전달된다.

    LAST(v)

    TRAILER(v)과 같은 의미이다.

    VSAMTYPE의 경우 실제 기능은 하지 않으나 에러를 발생시키지 않도록 지원하고 있다.

5.3. 사용예제

다음은 OFTEST.ICETOOL.IN00을 CPY1CNTL DD에 주어진 SORT 스크립트를 이용하여 OFTEST.ICETOOL.OUT00.COPY로 복사하는 예이다.

//JOB01    JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//ICECOPY  EXEC PGM=ICETOOL,REGION=2M
//ICEIN    DD DSN=OFTEST.ICETOOL.IN00,
//         DISP=(OLD,KEEP,KEEP),RECFM=FB,LRECL=80
//ICEOUT   DD DSN=OFTEST.ICETOOL.OUT00.COPY,
//         DISP=(NEW,CATLG,DELETE),RECFM=FB,LRECL=80
//TOOLMSG  DD SYSOUT=*
//DFSMSG   DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//TOOLIN   DD *
 COPY FROM(ICEIN) TO(ICEOUT) USING(CPY1)
/*
//CPY1CNTL DD *
 SORT FIELDS=COPY
/*

다음은 OFTEST.ICETOOL.IN00을 CPY1CNTL DD에 주어진 SORT 스크립트를 이용하여 재편집 후 레코드 카운트를 OFTEST.ICETOOL.OUT01.COUNT로 출력하는 예이다.

이때 레코드 카운트는 'OUTPUT RECORD COUNT = ' 뒤에 9자리의 수로 출력된다. 만약 조건을 만족하는 레코드가 존재하지 않으면 RC=4를 리턴하고 레코드가 존재하면 RC=0을 리턴한다.

//JOB02    JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//ICECOUNT EXEC PGM=ICETOOL,REGION=2M
//ICEIN    DD DSN=OFTEST.ICETOOL.IN00,
//         DISP=(OLD,KEEP,KEEP),RECFM=FB,LRECL=80
//CNTDD    DD DSN=OFTEST.ICETOOL.OUT01.COUNT,
//         DISP=(NEW,CATLG,DELETE),RECFM=FB,LRECL=80
//TOOLMSG  DD SYSOUT=*
//DFSMSG   DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//TOOLIN   DD *
 COUNT FROM(ICEIN) USING(CPY1) WRITE(CNTDD) -
 TEXT('OUTPUT RECORD COUNT = ') DIGITS(9) -
 EMPTY RC4
//CPY1CNTL DD *
 SORT FIELDS=COPY
 INCLUDE COND=(16,2,CH,EQ,C'08')
/*

다음은 OFTEST.ICETOOL.IN01을 CPY1CNTL DD에 주어진 SORT 스크립트를 이용하여 OFTEST.ICETOOL.OUT01.ICECPY1과 OFTEST.ICETOOL.OUT01.ICECPY2로 복사하는 예이다.

OFTEST.ICETOOL.OUT01.ICECPY2에서 레코드의 16번째 Byte부터 2Byte (16~17Byte)를 문자키로 전체 데이터셋에서 중복되지 않으면 OFTEST.ICETOOL.OUT01.ICETO로 저장하고, 중복되면 OFTEST.ICETOOL.OUT01.ICESAVE에 저장한다.

//JOB03    JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//ICECOPY  EXEC PGM=ICETOOL,REGION=2M
//ICEIN    DD DSN=OFTEST.ICETOOL.IN01,
//         DISP=(OLD,KEEP,KEEP),RECFM=FB,LRECL=80
//ICECPY1  DD DSN=OFTEST.ICETOOL.OUT01.ICECPY1,
//         DISP=(NEW,CATLG,DELETE),RECFM=FB,LRECL=80
//ICECPY2  DD DSN=OFTEST.ICETOOL.OUT01.ICECPY2,
//         DISP=(NEW,CATLG,DELETE),RECFM=FB,LRECL=80
//ICETO    DD DSN=OFTEST.ICETOOL.OUT01.ICETO,
//         DISP=(NEW,CATLG,DELETE),RECFM=FB,LRECL=80
//ICESAVE  DD   DSN=OFTEST.ICETOOL.OUT01.ICESAVE,
//         DISP=(NEW,CATLG,DELETE),RECFM=FB,LRECL=80
//TOOLMSG  DD SYSOUT=*
//DFSMSG   DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//TOOLIN   DD *
 COPY FROM(ICEIN) TO(ICECPY1,ICECPY2) USING(CPY1)
 SELECT FROM(ICECPY2) TO(ICETO) DISCARD(ICESAVE) ON(16,2,CH) NODUPS
/*
//CPY1CNTL DD *
 SORT FIELDS=COPY
/*

다음은 OFTEST.ICETOOL.IN01을 DISPLAY 명령어 형식에 맞게 OFTEST.ICETOOL.OUT01로 DISPLAY 하는 예이다.

//JOB04    JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//DISPLAY  EXEC PGM=ICETOOL,REGION=2M
//ICEIN    DD DSN=OFTEST.ICETOOL.IN01,
//         DISP=(OLD,KEEP,KEEP),RECFM=FB,LRECL=80
//ICEOUT   DD DSN=OFTEST.ICETOOL.OUT01,
//         DISP=(NEW,CATLG,DELETE),RECFM=FB,LRECL=80
//TOOLMSG  DD SYSOUT=*
//DFSMSG   DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//TOOLIN   DD *
   DISPLAY LINES(50) FROM(ICEIN) LIST(ICEOUT) -
   TITLE('TITLE') DATE(DM4.) TIME PAGE -
   HEADER('HEADER1') ON(10,3,CH) -
   BLANK -
   COUNT('COUNT')
/*

다음은 OFTEST.ICETOOL.IN01과 OFTEST.ICETOOL.IN02를 각각 CTL1CNTL DD와 CTL2CNTL DD를 이용하여 재편집한 후 OFTEST.ICETOOL.TEMP에 저장하고, 다시 TEMP를 입력으로 OFTEST.ICETOOL.OUT01.COMBINE으로 SPLICE하여 저장하는 예이다. 이때 CTL3CNTL DD로 OFTEST.ICETOOL.TEMP에서 15열이 '1’이 아닌 레코드들은 따로 OFTEST.ICETOOL.OUT01.FILTERED로 저장한다.

//JOB05    JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//SPLICE   EXEC PGM=ICETOOL,REGION=2M
//IN1      DD DSN=OFTEST.ICETOOL.IN01,DISP=(OLD,KEEP,KEEP)
//IN2      DD DSN=OFTEST.ICETOOL.IN02,DISP=(OLD,KEEP,KEEP)
//TEMP     DD DSN=OFTEST.ICETOOL.TEMP,DISP=(MOD,PASS)
//COMBINE  DD DSN=OFTEST.ICETOOL.OUT01.COMBINE,DISP=(NEW,CATLG,DELETE)
//FILTERED DD DSN=OFTEST.ICETOOL.OUT01.FILTERED,DISP=(NEW,CATLG,DELETE)
//TOOLMSG  DD SYSOUT=*
//DFSMSG   DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//TOOLIN   DD *
 COPY FROM(IN1) TO(TEMP) USING(CTL1)
 COPY FROM(IN2) TO(TEMP) USING(CTL2)
 SPLICE FROM(TEMP) TO(COMBINE) ON(5,5,ZD) WITH(15,17) USING(CTL3)
/*
//CTL1CNTL DD *
 SORT FIELDS=COPY
 OUTREC FIELDS=(1,14,31:X)
/*
//CTL2CNTL DD *
 SORT FIELDS=COPY
 OUTREC FIELDS=(5:1,5,15:7,15,30:33,2)
/*
//CTL3CNTL DD *
 OUTFIL FNAMES=FILTERED,OMIT=(15,1,CH,EQ,C'1')

다음은 OFTEST.ICETOOL.IN00의 맨 앞 2개의 레코드와 마지막 1개 레코드를 OFTEST.ICETOOL.OUT00.DATS에 먼저 복사한 후 나머지 레코드들을 DATSCNTL DD에 주어진 SORT 스크립트를 이용하여 정렬해 OFTEST.ICETOOL.OUT00.DATS로 복사하는 예이다.

//JOB01    JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//ICECOPY  EXEC PGM=ICETOOL,REGION=2M
//ICEIN    DD DSN=OFTEST.ICETOOL.IN00,
//         DISP=(OLD,KEEP,KEEP),RECFM=FB,LRECL=80
//ICEOUT   DD DSN=OFTEST.ICETOOL.OUT00.DATS,
//         DISP=(NEW,CATLG,DELETE),RECFM=FB,LRECL=80
//TOOLMSG  DD SYSOUT=*
//DFSMSG   DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//TOOLIN   DD *
 DATASORT FROM(ICEIN) TO(ICEOUT) HEADER(2) TRAILER USING(DATS)
/*
//DATSCNTL DD *
 SORT FIELDS=(1,8,CH,A)
/*

5.4. 유의사항

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

  • 정상적으로 실행한 경우

    Batch 애플리케이션에서 받은 코드를 반환한다.

  • 에러가 발생한 경우

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

6. KDJBR14

JCL에 기술된 내용이 정상적으로 실행되는지 확인하기 위해 사용하는 테스트용 유틸리티 프로그램이다.

실제로 유틸리티가 수행하는 처리는 없다. 즉, 아무런 처리도 하지 않는 빈 프로그램을 JOB STEP에서 실행해 봄으로써 JCL이 올바로 작성이 되었는지, JOB 환경에서 처리되어야 하는 DD 문의 처리 및 데이터셋의 할당과 같은 일이 정상적으로 수행이 되고 있는지 알아보기 위한 용도로 사용될 수 있다. 혹은 데이터셋을 신규로 생성하거나 삭제하는 처리만 수행하는 목적의 JOB STEP인 경우에도 사용할 수 있다.

6.1. DD 설정

KDJBR14 유틸리티 프로그램에서 설정해야 할 DD는 없다.

6.2. 명령어 설정

KDJBR14 유틸리티 프로그램에서 따로 설정해야 하는 명령어는 없다.

6.3. 사용예제

다음은 JCL이 실행된 후에 DATASET1이 생성되고 DATASET2가 삭제되는 예이다.

//LISTPDS  JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//STEP01   EXEC PGM=KDJBR14
//NEW      DD DSNAME=DATASET1,DISP=(NEW,KEEP),
//            DCB=(RECFM=FB,LRECL=100,BLKSIZE=1000)
//DELETE   DD DSNAME=DATASET2,DISP=(OLD,DELETE)
//SYSPRINT DD SYSOUT=*
//SYSIN    DD DUMMY

6.4. 유의사항

KDJBR14 유틸리티 프로그램은 완료 코드 0을 반환하는 것 이외의 조치를 하지 않는다. 다만 JCL 런타임 파싱 에러나 DD 문의 데이터셋 할당 에러 등에 의해 JOB이 FLUSH 상태로 반환될 수 있다.

7. KEQEFT01

데이터베이스를 사용하는 Batch 애플리케이션을 JCL로 실행하려고 할 때 애플리케이션이 실행되기 전에 데이터베이스 시스템으로 접속해주는 유틸리티 프로그램이다.

데이터베이스를 사용하는 업무용 COBOL 애플리케이션의 소스에 데이터베이스 시스템 접속에 필요한 시스템 이름, 사용자 이름, 패스워드 등과 같은 정보를 코딩하지 않고 데이터베이스 시스템 접속에 필요한 모든 정보는 KEQEFT01 유틸리티 프로그램의 입력 스크립트에 지정한다.

KEQEFT01 유틸리티 프로그램에서 사용하는 TSS 스크립트의 PROGRAM 옵션에 정의된 PROGRAM은 Shared Object의 형태로 컴파일해야 한다. KEQEFT01 유틸리티 프로그램은 OpenFrame 데이터베이스 접속 유틸리티 프로그램으로서 TSS 명령어를 사용하여 Batch 작업을 처리할 수 있도록 한다.

OpenFrame에서 제공하는 KEQEFT01 유틸리티 프로그램은 Batch 애플리케이션(TSS 스크립트의 PROGRAM 옵션에 정의된 PROGRAM)을 실행시키기 위한 데이터베이스와의 접속 기능만을 제공하고 DB2 시스템 명령어는 무시된다.

Batch 애플리케이션을 컴파일하는 방법에 대해서는 OpenFrame "마이그레이션 안내서"를 참고한다.

7.1. DD 설정

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

항목 설명

SYSTSPRT DD

KEQEFT01 유틸리티 프로그램의 처리 결과나 에러 메시지가 출력된다. 단, SYSTSPRT DD가 준비되기 전에 발생하는 에러 메시지는 SYSOUT DD로 출력된다.

SYSTSIN DD

KEQEFT01 유틸리티 프로그램의 입력 스크립트를 지정해주는 DD이다.

7.2. 명령어 설정

본 절에서는 KEQEFT01 명령어에 대해 설명한다.

  • DSN

    TSS 명령어인 DSN은 새로운 DSN(DB2 Command Processor) 세션을 시작하는 명령어로 다음과 같은 서브 명령어가 존재한다.

    명령어 설명

    RUN

    사용자 애플리케이션을 실행한다.

    END

    데이터베이스 접속 종료하고 TSS로 복귀한다.

    현재 KEQEFT01 유틸리티의 DSN 명령어에서는 다음의 서브 명령어에 대해 에러를 발생시키지 않도록 형식적으로만 지원하고 있다.

    명령어 설명

    ABEND

    DSN 세션을 종료하고 ABEND 코드를 반환한다.

    BIND

    애플리케이션 패키지 또는 플랜을 생성한다.

    DCLGEN

    SQL 문장과 정의 테이블을 생성한다.

    FREE

    애플리케이션 패키지 또는 플랜을 삭제한다.

    REBIND

    기존 패키지 또는 플랜을 재생성한다.

    SPUFI

    SQL 파일을 입력으로 받아 SQL 프로세서를 실행한다.

    DSN 세션이 연결되어 있는 동안에는 데이터베이스 명령어와 주석을 입력할 수 있다. 데이터베이스 명령어는 하이픈(-)으로 시작하고 주석은 애스터리스크(*)로 시작한다.

    DSN 세션이 연결되어있는 동안 OpenFrame에서 사용할 수 있는 데이터베이스 명령어는 다음과 같다.

    명령어 설명

    DISPLAY

    데이터베이스에 대한 상태 정보를 출력한다.

    START

    지정된 데이터베이스를 사용한다.

    STOP

    지정된 데이터베이스를 사용하지 않는다.

    Mainframe에서 제공하는 데이터베이스 명령어는 많지만 그 중에서 자주 사용되는 몇몇 데이터베이스 명령어에 대해서는 OpenFrame에서 실제 기능은 하지 않으나 에러를 발생시키지 않도록 지원하고 있다.

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

    DSN [SYSTEM(DSN|subsystem-name)]
        [RETRY(0|integer)]
    항목 설명

    SYSTEM

    데이터베이스 서브 시스템의 이름을 지정한다.

    값을 지정하지 않은 경우 디폴트로 SYSTEM(DSN)을 사용하며 지정된 데이터베이스 서브 시스템 이름은 OpenFrame 환경설정에 ikjeft01 서브젝트, SYSTEM:{subsystem-name} 섹션의 DBTYPE, DBAUTH, DATABASE, INSTANCE, USERNAME, PASSWORD or ENPASSWD 키의 VALUE 항목이 설정되어 있어야 한다.

    RETRY

    데이터베이스 서브 시스템의 접속 시도 횟수를 지정한다.

    접속 시도는 매 30초마다 일어나며 값을 지정하지 않은 경우 디폴트로 RETRY(0)이 적용되어 최대 120번 접속을 시도한다.

  • RUN

    DSN 서브 명령어인 RUN은 SQL 문장을 포함하는 애플리케이션을 실행한다.

    RUN 서브 명령어 구문은 다음과 같다.

    RUN PROGRAM(program-name)
        [PLAN(plan-name)]
        [LIBRARY(library-name)]
        [PARMS(parameter-string)]
    RUN [LIBRARY(library-name)]
        [PARMS(parameter-string)]
    항목 설명

    PROGRAM

    실행하려고 하는 프로그램 이름을 지정한다.

    PLAN

    KEQEFT01 유틸리티에서는 해당 파라미터에 대해 에러를 발생시키지 않도록 지원하고 있다.

    LIBRARY

    애플리케이션이 들어 있는 PDS 데이터셋 이름을 지정한다. (약어: LIB)

    PARMS

    애플리케이션에 전달되어야 하는 파라미터 목록을 지정한다. (약어: PARM)

  • END

    DSN 서브 명령어인 END는 DSN 세션을 종료하고 TSS로 복귀한다.

    END 서브 명령어 구문은 다음과 같다.

    END

7.3. 사용예제

다음은 DSN 세션에 대한 예로 MYDB 시스템으로 접속을 실패할 경우 매 30초마다 최대 5번까지 접속을 시도한다.

DSN SYSTEM (MYDB) RETRY (5)

다음은 DSN 시스템으로 접속하여 'TEST.RUNLIB.LOAD' 라이브러리에 있는 COBTEST1 프로그램을 실행시키는 예이다.

DSN SYSTEM (DSN)
RUN PROGRAM (COBTEST1) LIB ('TEST.RUNLIB.LOAD')

다음은 DSN 시스템으로 접속하여 'TEST.RUNLIB.LOAD' 라이브러리에 있는 COBTEST2 프로그램을 실행시키고 COBTEST2 프로그램의 파라미터로 '1234567890’을 전달하는 예이다.

DSN SYSTEM (DSN)
RUN PROGRAM (COBTEST2) PLAN (COBTEST2) -
     LIB ('TEST.RUNLIB.LOAD') PARMS ('1234567890')

7.4. 관련 환경설정

데이터베이스의 시스템 이름과 데이터베이스 접속에 필요한 정보는 OpenFrame 환경설정의 ikjeft01 서브젝트에 기술한다. 자세한 내용은 OpenFrame Batch "환경설정 안내서"를 참고한다.

7.5. 유의사항

KEQEFT01 유틸리티 프로그램은 SYSTSIN DD에 TSS 스크립트를 지정해야 하며, 이때 TSS 스크립트 중 'PROGRAM' 옵션에 정의된 PROGRAM은 Shared Object 형식이어야 한다. 현재 KEQEFT01 유틸리티 프로그램은 셀스크립트나 실행 가능한 오브젝트는 지원이 되지 않는다.

DSN 명령어와 DSN 서브 명령어를 사용할 때에는 다음과 같은 파싱 규칙이 적용된다.

  • 한 명령어를 다음 라인에 계속해서 적을 때에는 현재 라인의 마지막에 하이픈(-)을 적어준다.

    다음은 여러 라인에 걸쳐 명령어를 사용한 DSN 서브 명령어의 예이다.

    RUN PROGRAM(TECA251) -
    PLAN(TECA251) -
    LIB('MI.PROG.CLINK') -
    PARM('2')

KEQEFT01 유틸리티 프로그램이 Batch 애플리케이션(TSS 스크립트의 PROGRAM 옵션에 정의된 PROGRAM)을 실행한 결과는 다음과 같다.

  • 정상적으로 실행한 경우

    애플리케이션에서 받은 코드를 반환한다.

  • 에러가 발생한 경우

    해당 에러 메시지를 SYSTSPRT DD에 출력하고 각 에러에 해당하는 코드를 반환한다. 단, SYSTSPRT DD가 준비되기 전에 발생한 에러 메시지는 SYSOUT DD에 출력한다.

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

    코드 설명

    12

    Unrecoverable 유형의 에러로 다음의 경우에 해당한다.

    • 데이터셋 인증관련 준비과정에 실패한 경우

    • SYSTSIN DD가 제공되지 않은 경우

    • SYSTSPRT DD가 제공되지 않은 경우

    • SYSTSIN DD의 파일을 찾지 못한 경우

    • 지원하지 않는 SYSTSIN DD의 바이너리 형식인 경우

    • SYSTSIN DD 스크립트 파싱 에러가 발생한 경우

    • 적합하지 않은 TSS 명령어가 사용된 경우

    • RUN 명령에 PROGRAM이 기술되지 않은 경우

    • RUN 명령에 기술된 PROGRAM을 찾지 못한 경우

    • 실행시켜야 할 애플리케이션을 찾지 못한 경우

    • 지원하지 않는 애플리케이션 바이너리 형식

    • 데이터베이스 접속에 실패한 경우

    • 동적 메모리 LOAD(dlopen)에 실패한 경우

    • 엔트리 포인트 검색(dlsym)에 실패한 경우

    16

    시스템 관련 에러(System Fault)로 다음의 경우에 해당한다.

    • OpenFrame 시스템 라이브러리 초기화에 실패한 경우

    • SYSTSPRT DD를 열지 못한 경우

    • SYSTSIN DD의 바이너리 형식 체크에서 에러가 발생한 경우

    • SYSTSIN DD를 열지 못한 경우

    • Temporary file을 생성하지 못한 경우

    • SYSTSIN DD에서 읽기 에러가 발생한 경우

    • 애플리케이션의 바이너리 형식 체크에서 에러가 발생한 경우

    • 데이터베이스 시스템 설정 읽기 에러

    • 프로세스 분기(fork)에 실패한 경우

    • I/O 리다이렉트에 실패한 경우