기타 유틸리티
본 장에서는 사용자의 편의를 위해 제공되는 기타 유틸리티에 대해 기술한다.
1. 개요
다음은 기타 유틸리티 목록이다. 각 유틸리티에 대한 설명은 해당 절에서 자세하게 기술한다.
-
Batch
프로그램명 설명 업무처리 등에 쓰이는 데이터 셋을 간단한 명령어를 사용함으로써 자유롭게 조작하는 유틸리티 프로그램이다.
데이터 셋의 레코드별 차이점을 보여주는 유틸리티 프로그램이다.
JCL에서 SYSIN으로 입력된 CA-Easytrieve Plus 스크립트를 실행시켜주는 유틸리티 프로그램이다.
Batch JOB에서 데이터 셋을 리모트 호스트(Remote Host)에 전송하거나 리모트 호스트로부터 데이터를 전송받아 데이터 셋으로 저장하는 유틸리티 프로그램이다.
SORT 유틸리티 프로그램을 이용하여 1개의 JOB STEP에서 복수의 데이터 셋을 다양한 방법으로 출력하는 유틸리티 프로그램이다.
JCL에 기술된 내용이 정상적으로 실행되는지 확인하는 테스트용 유틸리티 프로그램이다.
데이터베이스를 사용하는 Batch 애플리케이션을 JCL로 실행하려고 할 때 애플리케이션이 실행되기 전에 데이터베이스 시스템으로 접속해주는 유틸리티 프로그램이다.
2개의 데이터 셋에 대한 비교 또는 하나의 데이터 셋 내의 특정 문자열을 검색하는 유틸리티 프로그램이다.
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를 통해 다음의 순서로 명령어를 기술할 수 있고, 여러 개를 기술할 수 있다. 각 명령어의 사용법은 각 절의 설명을 참고한다.
다음은 명령어를 기술할 때의 제한 조건이다.
-
명령어의 시작은 공백 또는 문자(/)로 시작하여야 한다.
-
명령어는 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만 사용할 수 있다.
|
K
추출 조건을 지정하는 명령어로 레코드의 내용을 지정한다. 현재는 COPY와 ALTER 명령에서만 사용할 수 있다.
K 명령어의 구문은 다음과 같다.
KEY keynum,operator,value[,keynum,operator,value,...]
항목 | 설명 |
---|---|
keynum |
KEY 문으로 설정된 키 번호를 지정한다. |
operator |
비교 연산자를 지정한다.
|
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' /*
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에 전달되어 실행된다.
본 안내서에서는 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 출력 결과를 얻지못할 수도 있으므로 주의한다.
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 옵션 유무에 따라 동작이 다르다.
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이 결정된다).
|
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) |
타이틀 라인에 현재 날짜를 표시한다.
|
TIME(abc) |
타이틀 라인에 현재 시간을 표시한다.
|
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) |
타이틀 라인에 현재 날짜를 표시한다.
|
TIME(abc) |
타이틀 라인에 현재 시간을 표시한다.
|
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) /*
7. IEFBR14
JCL에 기술된 내용이 정상적으로 실행되는지 확인하는 테스트용 유틸리티 프로그램이다. 실제로 유틸리티 내부적으로 하는 작업은 없다.
JCL이 전송된 이후에 JOB 큐에서 JOB이 정상적으로 실행되고, tjclrun이 기동되어 JCL에 기술된 DD에 데이터셋 할당이 이루어진 후 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
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) 세션을 시작하는 명령어로 다음과 같은 서브 명령어가 존재한다.
명령어 | 설명 |
---|---|
사용자 애플리케이션을 실행한다. |
|
데이터베이스 접속을 종료하고 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 서브젝트에 기술한다.
|
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 중 선택할 수 있다.
|
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 유틸리티 프로그램의 동작방법이다.
-
JCL Runner는 실행시키려는 애플리케이션의 바이너리 형식을 검사한다.
-
애플리케이션의 바이너리 형식이 Shared Object인 경우 JCL Runner는 PGMRTS00 유틸리티 프로그램을 실행하고 애플리케이션을 동적으로 실행시킨다.
-
애플리케이션의 바이너리 형식이 Shared Object가 아닌 경우 JCL Runner는 PGMRTS00 유틸리티 프로그램을 통하지 않고 바로 애플리케이션을 실행시킨다.
10.1. DD 설정
PGMRTS00 유틸리티 프로그램에서 단독으로 사용하는 DD 설정은 없으며 최종적으로 실행되는 Batch 애플리케이션에서 필요로 하는 DD를 자동으로 설정해준다.
10.4. 관련 환경설정
JCL Runner의 PGMRTS00 유틸리티 프로그램에 대한 내용은 tjclrun 서브젝트에서 설정을 할 수 있다. Shared Object로 만들어진 Batch 애플리케이션을 JCL에서 직접 실행할 수 있도록 하기 위해서는 OpenFrame 환경설정의 tjclrun 서브젝트, PGM 섹션의 USE_PGMRTS00 키의 VALUE 항목을 YES로 설정한다.
|
10.5. 유의사항
PGMRTS00 유틸리티 프로그램이 Batch 애플리케이션을 실행한 결과는 다음과 같다.
-
정상적으로 실행한 경우
Batch 애플리케이션에서 받은 코드를 반환한다.
-
에러가 발생한 경우
해당 에러 메시지를 SYSPRINT DD에 출력하고 에러에 해당하는 코드를 반환한다.
PGMRTS00 유틸리티 프로그램에서 발생할 수 있는 에러 코드는 다음과 같다.
코드 설명 12
Unrecoverable 형태의 에러로 다음의 경우가 해당된다.
-
데이터셋 인증관련 준비과정 실패
-
프로그램 파라미터 개수 지정 에러
-
실행시켜야 할 애플리케이션을 찾지 못하는 에러
-
지원하지 않는 애플리케이션 바이너리 형식
-
동적 메모리 LOAD(dlopen) 실패
-
엔트리 포인트 검색(dlsym) 실패
16
시스템과 관련된 에러로 다음의 경우가 해당된다.
-
OpenFrame 시스템 라이브러리 초기화 실패
-
애플리케이션의 바이너리 형식 체크 에러
-
프로세스 분기(fork) 실패
-
I/O 리다이렉트 실패
-