기타 유틸리티

본 장에서는 사용자의 편의를 위해 제공되는 기타 유틸리티에 대해 기술한다.

1. 개요

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

  • Batch

    프로그램명 설명

    ADAPT

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

    DSDIFF

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

    EZTPA00

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

    FTP

    Batch JOB에서 데이터 셋을 리모트 호스트(Remote Host)에 전송하거나 리모트 호스트로부터 데이터를 전송받아 데이터 셋으로 저장하는 유틸리티 프로그램이다.

    ICETOOL

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

    IEFBR14

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

    IKJEFT01

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

    ISRSUPC

    2개의 데이터 셋에 대한 비교 또는 하나의 데이터 셋 내의 특정 문자열을 검색하는 유틸리티 프로그램이다.

    PGMRTS00

    Shared Object로 컴파일된 Batch 애플리케이션을 JCL로 실행시키려고 할 때 OpenFrame/Batch 엔진 모듈인 JCL Runner에 의해 간접적으로 실행되는 실행 환경 제어 유틸리티 프로그램이다.

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를 통해 다음의 순서로 명령어를 기술할 수 있고, 여러 개를 기술할 수 있다. 각 명령어의 사용법은 각 절의 설명을 참고한다.

  1. 기능 제어 명령어 : COPY, EDIT, ALTER

  2. 조건 제어 명령어 : KEY, K, R, ED, A

다음은 명령어를 기술할 때의 제한 조건이다.

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

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

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

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 이름을 지정한다.

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. FTP

Batch JOB에서 데이터셋을 리모트 호스트(Remote Host)에 전송하거나 리모트 호스트로부터 데이터를 전송받아 데이터셋으로 저장하는 유틸리티 프로그램이다.

5.1. DD 설정

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

항목 설명

INPUT DD 또는

SYSIN DD

FTP 유틸리티 컨트롤문을 지정한다.

SYSPRINT DD

메시지 출력을 위한 출력 데이터셋을 지정한다.

OUTPUT DD

Unix/Linux FTP 프로그램에서 발생하는 메시지 출력을 위한 출력 데이터셋을 지정한다.

OUTPUT DD를 기술하면 Unix/Linux FTP 프로그램을 실행하면서 발생하는 메시지들은 OUTPUT DD에 출력하고, FTP 유틸리티에서 발생하는 메시지들은 SYSPRINT DD에 출력한다.

OUTPUT DD를 기술하지 않으면 모든 메시지들은 SYSPRINT DD에 출력한다.

5.2. 명령어 설정

FTP를 실행하기 위해서는 JCL의 EXEC 구문에 다음과 같이 지정한다.

//STEP  EXEC  PGM=FTP

INPUT DD 또는 SYSIN DD에 다음 항목을 이용하여 FTP 컨트롤문을 기술한다.

항목 설명

connect_ip

INPUT DD의 첫 부분에 FTP 서버 연결을 위한 IP를 설정하며 FTP 연결을 위한 필수 항목이다.

user_id password

INPUT DD의 connect_ip 다음에 반드시 FTP 서버 인증을 위한 사용자 ID와 비밀번호를 기술해야 하며 FTP 연결을 위한 필수 항목이다.

KSC5601

(NOTYPE|BIN|ASC)

바이너리 형식이나 ASCII 형식으로 파일을 전송하기 위해 포맷을 지정한다.

SJISKANJI

(NOTYPE|BIN|ASC)

바이너리 형식이나 ASCII 형식으로 파일을 전송하기 위해 포맷을 지정한다.

BINARY|BIN

데이터 전송 형식을 바이너리로 변경한다.

ASCII|ASC

데이터 전송 형식을 ASCII로 변경한다.

STAT

리모트 호스트의 현재 상태를 표시한다.

OpenFrame 환경설정에 ftp 서브젝트, OPTION 섹션의 SECURE_FTP 키의 VALUE 항목이 YES로 설정되어 있는 경우 해당 항목은 지원하지 않는다.

CLOSE

리모트 호스트와 접속을 끊는다.

DIR

리모트 호스트의 현재 디렉터리 정보를 조회한다.

QUIT

FTP 프로그램을 종료한다.

LS

리모트 호스트의 현재 디렉터리 정보를 조회한다.

PWD

리모트 호스트의 현재 디렉터리를 표시한다.

LOCSITE

RECFM, LRECL, BLKSIZE 등을 추가로 지정하여 로컬 호스트에서 작성된 데이터셋의 레코드 형식 및 레코드 길이를 변경한다.

QUOTE

리모트 호스트에 임의의 ftp 명령어를 전송한다.

CD

리모트 호스트의 디렉터리를 변경한다.

LCD

로컬 호스트(Local Host)의 디렉터리를 변경한다.

DELETE|ERASE

리모트 호스트의 파일을 삭제한다.

RENAME|REN

리모트 호스트의 파일 이름을 변경한다.

RMDIR

리모트 호스트의 디렉터리를 삭제한다.

MKDIR

리모트 호스트의 디렉터리를 생성한다.

SET MAXCC

에러가 발생하였을 경우 반환코드를 지정하는 데 사용한다.

PUT

로컬 호스트의 파일 또는 데이터셋을 리모트 호스트에 전송한다. 데이터셋 전송의 경우 single quotation 안에 데이터셋 이름을 기술한다.

GET(REPLACE)

리모트 호스트에 있는 파일을 로컬 호스트로 전송한다.

데이터셋 전송의 경우 single quotation 안에 데이터셋 이름을 기술한다. 데이터 전송 형식은 기본적으로 BINARY 모드이며, 이 경우 OpenFrame에서는 별다른 처리를 수행하지 않지만 데이터 전송 형식이 ASCII 모드일 경우 GET한 파일을 개행 단위로 읽어 데이터셋에 쓴다.

전송하려는 파일이 로컬 호스트에 있을 때, REPLACE 옵션 유무에 따라 동작이 다르다.

  • REPLACE 옵션이 지정되어 있으면 경고 메시지를 출력하고 해당 파일을 덮어 쓴다.

  • REPLACE 옵션이 지정되어 있지 않으면 에러가 발생한다.

OpenFrame 환경설정에 ftp 서브젝트, OPTION 섹션의 SECURE_FTP 키의 VALUE 항목이 YES로 설정되어 있는 경우 REPLACE 옵션은 지원하지 않는다.

OpenFrame 환경설정에 ftp 서브젝트, OPTION 섹션의 FTP_HANDLE_DATASET 키의 VALUE 항목 값에 따라 추가적인 동작 처리가 있으므로 해당 설정을 참고한다.

APPEND

리모트 호스트에 이미 존재하는 파일에 추가적으로 데이터를 추가한다. 단, 리모트 호스트에 지정한 파일이 존재하지 않으면 신규로 생성된다.

OpenFrame 환경설정에 ftp 서브젝트, OPTION 섹션의 SECURE_FTP 키의 VALUE 항목이 YES로 설정되어 있는 경우 해당 항목은 지원하지 않는다.

//DD:ddname

전송 데이터셋을 지정할 때 single quotation 안에 데이터셋 이름을 기술하지 않고 '//DD:'를 기술한 뒤에 ddname을 기술한다. 이 경우 해당 스텝 안에서 JCL의 DD 문의 데이터셋을 사용한다.

SENDSITE

실제 기능은 하지 않으나 에러를 발생시키지 않도록 지원하는 컨트롤 문이다.

MDELETE

여러 개의 리모트 호스트의 파일을 삭제한다.

PROMPT

interactive 또는 noninteractive 모드를 설정한다.

OpenFrame 환경설정에 ftp 서브젝트, OPTION 섹션의 SECURE_FTP 키의 VALUE 항목이 YES로 설정되어 있는 경우 해당 항목은 지원하지 않는다.

TYPE(I|i|A|a)

데이터 전송형식을 지정한다(해당 명령어를 사용하지 않는 경우 Unix/Linux FTP 모드에 의해서 Default Type이 결정된다).

  • I|i : 데이터 전송형식을 바이너리로 설정한다.

  • A|a : 데이터 전송형식을 ASCII로 설정한다.

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

5.3. 사용예제

다음은 127.0.0.1 FTP 서버에 연결하여 home/ftptest/temp 디렉터리로 FTPTEST01.txt 파일을 업로드하는 예이다.

//FTP01    JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//PMFTP    EXEC PGM=FTP,PARM='(EXIT'
//INPUT    DD *
  127.0.0.1
 ftptest ftptest
 KSC5601 (NOTYPE
 CD /home/ftptest/temp/
 PUT 'FTPTEST01'   /home/ftptest/temp/FTPTEST01.TXT
 QUIT
/*
//SYSPRINT DD SYSOUT=*
/*

다음은 127.0.0.1 FTP 서버에 연결하여 /home/ftptest/temp 디렉터리의 FTPTEST02.TXT 파일을 로컬 호스트의 OFTEST.FTP.GET01 데이터셋으로 다운로드하는 예이다.

//FTP02    JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//PMFTP    EXEC PGM=FTP
//DD1      DD DSN=OFTEST.FTP.GET01,DISP=(NEW,CATLG,DELETE),DCB=(RECFM=FB,LRECL=80)
//INPUT    DD *
  127.0.0.1
 ftptest ftptest
 KSC5601 (NOTYPE
 GET /home/ftptest/temp/FTPTEST02.TXT //DD:DD1
 QUIT
/*
//SYSPRINT DD SYSOUT=*
/*

5.4. 관련 환경설정

FTP 프로그램은 임시 파일의 위치를 지정하거나 FTP 서버로부터의 에러 코드를 판별하기 위해 ftp 서브젝트와 ofsys 서브젝트의 정보를 이용한다. 또한 권한 인증 여부를 판별하기 위해 ds 서브젝트의 정보를 이용한다.

FTP는 GET 명령어를 수행할 때 GET 명령어에 타겟 데이터셋의 경로가 없는 경우 ofsys 서브젝트의 임시 디렉터리 경로에 해당 파일을 다운로드한다. 그리고 FTP 유틸리티 수행 중에 생기는 임시 파일들을 생성하는 디렉터리로 ftp 서브젝트의 디렉터리 정보를 이용한다.

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

6. ICETOOL

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

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

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

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

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

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

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

6.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를 사용하도록 지정한다.

6.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의 경우 실제 기능은 하지 않으나 에러를 발생시키지 않도록 지원하고 있다.

6.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)
/*

6.4. 유의사항

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

  • 정상적으로 실행한 경우

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

  • 에러가 발생한 경우

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

7. IEFBR14

JCL에 기술된 내용이 정상적으로 실행되는지 확인하는 테스트용 유틸리티 프로그램이다. 실제로 유틸리티 내부적으로 하는 작업은 없다.

JCL이 전송된 이후에 JOB 큐에서 JOB이 정상적으로 실행되고, tjclrun이 기동되어 JCL에 기술된 DD에 데이터셋 할당이 이루어진 후 IEFBR14 유틸리티 프로그램이 정상적으로 실행되는지 확인할 수 있다.

7.1. DD 설정

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

7.2. 명령어 설정

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

7.3. 사용예제

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

//LISTPDS  JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//STEP01   EXEC PGM=IEFBR14
//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

7.4. 유의사항

IEFBR14 유틸리티 프로그램이 Batch 애플리케이션을 실행한 후 Batch 애플리케이션에서 받은 코드를 반환한다.

8. IKJEFT01

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

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

IKJEFT01 유틸리티 프로그램에서 사용하는 TSO 스크립트의 PROGRAM 옵션에 정의된 PROGRAM은 Shared Object의 형태로 컴파일해야 한다.

Mainframe에서는 TSO Attachment Facility를 사용하여 DB2와 접속한 후 DB2 애플리케이션을 실행시킨다. TSO Attachment Facility는 TSO 터미널이나 Batch 프로그램에서 DB2에 접근할 수 있도록 해주는 DB2 모듈이다. IKJEFT01 유틸리티 프로그램은 OpenFrame 데이터베이스 접속 유틸리티 프로그램으로서 TSO 명령어를 사용하여 Batch 작업을 처리할 수 있도록 한다.

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

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

8.1. DD 설정

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

항목 설명

SYSTSPRT DD

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

SYSTSIN DD

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

8.2. PARM 기능

IKJEFT01 유틸리티는 PARM 문을 통해 TSO 커맨드를 실행할 수 있다. PARM 문에 실행시킬 TSO 커맨드를 입력하며, 작은따옴표로 감싸주어야 한다. 또한, 실행시킬 TSO 커맨드의 오퍼랜드는 작은따옴표 2개로 감싸 표기한다. 입력할 수 있는 TSO 커맨드의 총 길이는 100자로 제한되어 있다.

다음은 PARM 문을 통해 CLIST를 실행하고, 필요한 매개변수를 전달하는 JCL 예제이다.

//PARMEXAM JOB
//STEP010  EXEC PGM=IKJEFT01,
//         PARM='EXEC ''SYS1.TSOLIB(CLIST01)'' ''FIRST'' ''SECOND'''
//SYSTSIN  DD DUMMY
//SYSTSPRT DD DUMMY
//SYSOUT   DD SYSOUT=*

다음은 상기 예제에서 실행될 CLIST의 예제이다.

PROC 2 ARG01 ARG02
WRITE &ARG01 MESSAGE
WRITE &ARG02 MESSAGE

다음은 해당 JCL의 실행 결과물 중 SYSOUT의 내용이다.

FIRST MESSAGE
SECOND MESSAGE

8.3. 명령어 설정

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

DSN

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

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

SYSTEM

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

값을 지정하지 않은 경우 디폴트로 SYSTEM(DSN)을 사용하며 지정된 데이터베이스 서브 시스템 이름은 환경설정 테이블의 ikjeft01 서브젝트, SYSTEM:{system} 섹션의 하위 키들의 VALUE 항목이 설정되어 있어야 한다. 자세한 내용은 OpenFrame Batch "환경설정 안내서"를 참고한다.

RETRY

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

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

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

명령어 설명

RUN

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

END

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

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

명령어 설명

ABEND

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

BIND

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

DCLGEN

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

FREE

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

REBIND

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

SPUFI

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

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

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

명령어 설명

DISPLAY

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

START

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

STOP

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

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

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

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

LIBRARY

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

PARMS

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

END

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

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

END

8.4. 사용예제

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

8.5. 관련 환경설정

데이터베이스의 시스템 이름과 데이터베이스 접속에 필요한 정보는 OpenFrame 환경설정의 ikjeft01 서브젝트에 기술한다.

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

  2. 유사한 유틸리티 프로그램으로는 PGMRTS00(Runtime Environment Control Program)과 DFSRRC00(HiDB Region Control Program)이 있다.

8.6. 유의사항

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

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

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

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

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

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

  • 정상적으로 실행한 경우

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

  • 에러가 발생한 경우

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

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

    코드 설명

    12

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    16

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

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

    • SYSTSPRT DD를 열지 못한 경우

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

    • SYSTSIN DD를 열지 못한 경우

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

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

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

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

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

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

9. ISRSUPC

2개의 데이터셋에 대한 비교 또는 하나의 데이터셋 내의 특정 문자열을 검색하는 유틸리티 프로그램이다. PARM에 설정된 process option과 SYSIN에 기술된 process statement에 따라서 다양한 기능을 제공한다.

9.1. DD 설정

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

항목 설명

OLDDD DD

비교할 입력 데이터셋을 기술한다. 한 데이터셋 내의 특정 문자열을 검색할 때는 해당 DD는 사용되지 않는다.

NEWDD DD

비교할 입력 데이터셋을 기술한다.

OUTDD DD

ISRSUPC의 출력을 저장한다(OUTDD에는 SYSOUT이나 Non-VSAM 데이터셋만 지원한다).

SYSIN DD

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

SYSPRINT DD 또는 SYSOUT DD

ISRSUPC을 수행하는 중 발생한 에러 메시지가 출력된다.

9.2. PARM에 기술하는 옵션

JCL의 EXEC 문의 PARM 구문에 다음의 옵션들을 사용할 수 있다.

항목 설명

ANYC

두 데이터셋을 비교할 때 또는 한 데이터셋 내의 문자열을 검색할 때 알파벳의 대소문자를 구분하지 않는다.

DELTA 또는 DELTAL

데이터셋 비교 결과를 출력할 때 비교 결과가 서로 다른 라인만 OUTDD에 출력한다. 현재 DELTA 또는 DELTAL만 지원하고 있다.

LINECMP

데이터셋을 비교할 때 라인 단위로 비교한다. 현재 LINECMP만 지원하고 있다.

SRCHCMP

한 데이터셋 내의 특정 문자열을 검색한다.

9.3. 명령어 설정

본 절에서는 SYSIN DD를 통해 설정할 수 있는 ISRSUPC 명령어에 대해서 설명한다.

CMPCOLM

데이터셋을 비교할 때 비교 대상이 되는 라인의 컬럼을 지정한다.

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

CMPCOLM start-colm[:stop-colm][,...]
항목 설명

start-colm

비교할 컬럼 범위의 시작 위치를 지정한다.

stop-colm

비교할 컬럼 범위의 마지막 위치를 지정한다. 생략하면 start-colm의 한 문자가 비교 대상이 된다.

SRCHFOR 또는 SRCHFORC

한 데이터셋 내의 특정 문자열을 검색할 때 검색 문자열을 지정하고, 검색 범위를 지정할 수 있다. 단, SRCHFORC의 경우 먼저의 SRCHFOR 또는 SRCOFORC 구문에서 문자열이 검색된 라인에서만 문자열 검색을 수행한다.

SRCHFOR 또는 SRCHFORC 명령어의 구문은 다음과 같다.

SRCHFOR 'string'[,srch-type][,start-colm[:stop-colm]]
SRCHFORC 'string'[,srch-type][,start-colm[:stop-colm]]
항목 설명

string

검색할 문자열을 지정한다.

srch-type

검색할 문자열의 타입을 지정한다. srch-type은 P,S,W 중 선택할 수 있다.

  • P : Prefix 지정이다. 검색할 문자열이 단어의 앞부분이면 검색된다.

    (예: 'test’를 검색하면 'test1', 'test-type', 'test’가 모두 검색된다.)

  • S : Suffix 지정이다. 검색할 문자열이 단어의 뒷부분이면 검색된다.

    (예: 'test’를 검색하면 'pretest', 'sample-test', 'test’가 모두 검색된다.)

  • W : Word 지정이다. 검색할 문자열이 완전한 단어일 때 검색된다.

    (예: 'test’를 검색하면 'test’만 검색된다.)

start-colm

검색 범위의 시작 위치를 지정한다.

stop-colm

검색 범위의 마지막 위치를 지정한다.

지정된 문자열의 모든 문자열이 아닌 한문자만 stop-colm 안에 있어도 검색된다. 만약 stop-colm이 70이고, 검색할 문자열 'test’의 t가 70 컬럼에 위치하고 있으면 이것도 검색된다.

9.4. 사용예제

다음은 OPENFRAME.ISRSUPC.OLD 데이터셋과 OPENFRAME.ISRSUPC.NEW 데이터셋을 비교하는 예제이다. 영문자의 대소문자는 구분없이 비교하고, 각각의 라인마다 3~40 컬럼까지 그리고 75 컬럼이 같은지 비교한다.

//JOB01    JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//DIFF     EXEC PGM=ISRSUPC,PARM='DELTA,LINECMP,ANYC'
//OLDDD    DD DSN=OFRAME.ISRSUPC.OLD,DISP=SHR
//NEWDD    DD DSN=OFRAME.ISRSUPC.NEW,DISP=SHR
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//OUTDD    DD SYSOUT=A
//SYSIN    DD *
 CMPCOLM 3:40,75
/*

다음은 OPENFRAME.ISRSUPC.NEW 데이터셋 내에서 1~72 컬럼 범위 내에서 'test’라는 문자열이 있는지 검색하는 예제이다. 단, 영문자의 대소문자는 구별하지 않는다.

//JOB02    JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
//SRCH     EXEC PGM=ISRSUPC,PARM='SRCHCMP,ANYC'
//NEWDD    DD DSN=OFRAME.ISRSUPC.NEW,DISP=SHR
//SYSOUT   DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//OUTDD    DD SYSOUT=A
//SYSIN    DD *
 SRCHFOR 'test',1:72
/*

9.5. 유의사항

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

  • 정상적으로 실행한 경우

    코드 설명

    0

    데이터셋을 비교했을 경우 다른 내용이 없고, 문자열을 검색했을 경우 검색된 문자열이 없음을 의미한다.

    1

    데이터셋을 비교했을 때 다른 내용이 있고, 문자열을 검색했을 경우 해당 문자열이 검색됨을 의미한다.

  • 에러가 발생한 경우

    해당 에러 메시지를 SYSPRINT DD 또는 SYSOUT DD에 출력한다. 따라서 에러가 발생했을 때의 에러 메시지를 확인하기 위해서는 JCL에 해당 DD를 설정한다.

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

    코드 설명

    8

    OLDDD 데이터셋을 처리할 때 에러가 발생한 경우이다.

    10

    SYSIN DD에 명령어 문법 에러가 발생한 경우이다.

    16

    NEWDD 데이터셋을 처리할 때 에러가 발생한 경우이다.

    24

    OUTDD 데이터셋을 처리할 때 에러가 발생한 경우이다.

    32

    메모리 에러가 발생한 경우이다. 주로 메모리 부족 에러이다.

10. PGMRTS00

Shared Object로 컴파일된 Batch 애플리케이션을 JCL로 실행시키려고 할 때 OpenFrame Batch 엔진 모듈인 JCL Runner에 의해 간접적으로 실행되는 실행 환경 제어 유틸리티 프로그램이다.

JCL의 EXEC 구문에서 PGM 파라미터 값으로 Shared Object로 컴파일된 Batch 애플리케이션을 지정할 경우 JCL Runner가 PGMRTS00 유틸리티 프로그램을 우선 실행시킨다. 실행된 PGMRTS00 유틸리티 프로그램은 Shared Object로 컴파일된 Batch 애플리케이션을 동적으로 메모리에 LOAD하여 엔트리 포인트를 찾아 호출한 후 애플리케이션을 실행시켜준다.

다음은 PGMRTS00 유틸리티 프로그램의 동작방법이다.

figure 5 1
PGMRTS00 동작 구조
  1. JCL Runner는 실행시키려는 애플리케이션의 바이너리 형식을 검사한다.

  2. 애플리케이션의 바이너리 형식이 Shared Object인 경우 JCL Runner는 PGMRTS00 유틸리티 프로그램을 실행하고 애플리케이션을 동적으로 실행시킨다.

  3. 애플리케이션의 바이너리 형식이 Shared Object가 아닌 경우 JCL Runner는 PGMRTS00 유틸리티 프로그램을 통하지 않고 바로 애플리케이션을 실행시킨다.

10.1. DD 설정

PGMRTS00 유틸리티 프로그램에서 단독으로 사용하는 DD 설정은 없으며 최종적으로 실행되는 Batch 애플리케이션에서 필요로 하는 DD를 자동으로 설정해준다.

10.2. 명령어 설정

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

10.3. 사용예제

사용자가 PGMRTS00 유틸리티 프로그램을 직접 JCL에 기술해서 사용하는 경우는 없다.

10.4. 관련 환경설정

JCL Runner의 PGMRTS00 유틸리티 프로그램에 대한 내용은 tjclrun 서브젝트에서 설정을 할 수 있다. Shared Object로 만들어진 Batch 애플리케이션을 JCL에서 직접 실행할 수 있도록 하기 위해서는 OpenFrame 환경설정의 tjclrun 서브젝트, PGM 섹션의 USE_PGMRTS00 키의 VALUE 항목을 YES로 설정한다.

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

  2. 유사한 유틸리티 프로그램으로는 IKJEFT01(TSO Terminal Monitoring Program)과 DFSRRC00(HiDB Region Control Program)이 있다.

10.5. 유의사항

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

  • 정상적으로 실행한 경우

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

  • 에러가 발생한 경우

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

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

    코드 설명

    12

    Unrecoverable 형태의 에러로 다음의 경우가 해당된다.

    • 데이터셋 인증관련 준비과정 실패

    • 프로그램 파라미터 개수 지정 에러

    • 실행시켜야 할 애플리케이션을 찾지 못하는 에러

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

    • 동적 메모리 LOAD(dlopen) 실패

    • 엔트리 포인트 검색(dlsym) 실패

    16

    시스템과 관련된 에러로 다음의 경우가 해당된다.

    • OpenFrame 시스템 라이브러리 초기화 실패

    • 애플리케이션의 바이너리 형식 체크 에러

    • 프로세스 분기(fork) 실패

    • I/O 리다이렉트 실패