소개
본 장에서는 SORT 유틸리티 명령어의 기능, 목록에 대해 기술한다.
1. 개요
SORT는 입력 데이터셋(SORTIN, SORTINnn)을 주어진 명령에 따라 정렬, 병합, 복사, 필터링, 재편집, 합산 등을 수행하여 출력 데이터셋(SORTOUT, OUTFIL 데이터셋)을 생성하는 IBM Mainframe의 DFSORT에 대응하는 유틸리티 프로그램이다. 이 유틸리티는 3rd Party SORT 솔루션으로 TmaxSoft의 ProSort를 지원하여 동작한다.
2. 유틸리티 기능
다음은 SORT 유틸리티의 주요 기능이다.
구분 | 설명 |
---|---|
SORT |
정렬을 수행하기 위한 입력 데이터셋의 레코드를 주어진 키에 따라 오름차순 혹은 내림차순으로 정렬하여 출력 데이터셋으로 출력한다. |
MERGE |
SORTINnn에 주어진 입력 데이터셋에 대하여 병합 기능을 수행하기 위해 주어진 키로 이미 정렬된 2개 이상의 입력 데이터셋을 하나의 정렬된 출력 데이터셋으로 병합하여 출력한다. |
COPY |
복사를 수행하기 위하여 입력 데이터셋의 모든 레코드를 출력 데이터셋으로 복사한다. |
입력 데이터셋이 TSAM 데이터셋일 때 SORT 유틸리티의 주요 기능 수행 시 processing 방법은 아래 사항 중 먼저 매칭이 되는 것으로 결정한다.
-
RECORD TYPE=[F|V]을 수행할 경우 [F|V]로 결정한다.
-
SORTOUT DD에 지정한 데이터셋의 RECFM이 확정된 경우 RECFM으로 결정한다.
-
OUTFIL DD에 지정한 데이터셋의 RECFM이 확정된 경우 RECFM으로 결정한다.
-
SORTIN이 TSAM, SORTOUT이 TSAM일 경우 V type으로 결정한다.
다음은 주요 기능 이외에 SORT 유틸리티로 수행할 수 있는 기능이다.
-
입력 레코드 필터링(Conditional Input Filtering)
입력 레코드 재편집(Input Record Reformatting)을 수행하기 전에 INCLUDE, OMIT, SKIPREC, STOPAFT으로 주어진 조건을 만족하는 입력 레코드만을 포함하거나 제외하는 방법으로 필터링할 수 있다.
-
입력 레코드 재편집(Input Record Reformatting)
SORT/MERGE/COPY를 수행하기 전에 INREC으로 입력 레코드 필터를 통과한 레코드를 주어진 형식에 따라 재편집한다. 이러한 과정을 통해 입력 레코드에서 불필요한 필드를 제거하여 실제로 SORT/MERGE/COPY를 수행할 때 성능을 향상시킬 수 있다.
-
필드 합산(Field Summation)
SORT/MERGE를 수행하면서 키 값이 일치한다고 판명된 하나 이상의 레코드에 대해 SUM을 이용하여 주어진 필드의 값을 모두 더한다. 옵션으로 EQUALS가 설정되어 있으면 필드의 값을 모두 더한 후 키 값이 동일한 레코드들 중 첫 번째 레코드만 SORTOUT으로 지정된 출력 데이터셋으로 출력된다.
-
출력 레코드 재편집(Output Record Reformatting)
SORT/MERGE/COPY를 수행한 후 OUTREC을 이용하여 주어진 형식에 따라 레코드를 재편집한다. 재편집한 레코드가 SORTOUT으로 출력되거나 OUTFIL의 입력 레코드가 된다.
-
출력 레코드 복사(Output Duplication)
OUTFIL을 이용하여 SORTOUT으로 쓰여질 레코드를 입력 레코드로 하여 여러 개의 OUTFIL DD로 출력하는 역할을 한다. 입력 레코드 필터링과 출력 레코드 재편집 과정이 이 단계에서 다시 적용될 수 있다.
3. SORT 제어문
본 절에서는 SORT 제어문에 대해 설명한다.
3.1. 작업 제어문
작업 제어문은 크게 JOB 문, EXEC 문, DD 문, /* 문 등으로 이루어져 있다.
-
JOB 문
작업의 선두에 위치하는 제어문이며, 작업의 시작을 알림과 동시에 그 작업의 성격을 정의한다.
기술 방법의 예는 다음과 같다.
//SORT00 JOB CLASS=A,MSGCLASS=X,MSGLEVEL=(1,1)
-
EXEC 문
하나의 JOB은 여러 개의 STEP으로 이루어져 있으며, EXEC 문은 JOB STEP의 선두에 위치한다. 프로그램의 명칭 및 프로그램에 전달할 파라미터 등을 지정한다.
기술 방법의 예는 다음과 같다.
//SORT EXEC PGM=SORT,REGION=2M
SORT에서 사용할 수 있는 파라미터는 다음과 같다.
항목 설명 'JPn"string"'
SORT script 내에서 JPn으로 지정된 부분을 string으로 치환한다.
VLTESTI=n
INCLUDE나 OMIT 연산에서 지정된 필드가 입력 레코드에 없거나 일부만 존재하는 경우의 동작을 정의한다.
-
VLTESTI=0 : INCLUDE나 OMIT 연산에서 지정된 모든 필드들의 전체 범위가 입력 레코드에 존재해야 한다. 그렇지 않으면 에러를 발생시킨다. VLTESTI 파라미터가 지정되지 않은 경우엔 마치 VLTESTI=0으로 지정된 것처럼 동작한다.
-
VLTESTI=1 : INCLUDE 연산의 경우 지정된 필드가 입력 레코드에 없거나 일부만 존재하면 해당 레코드를 출력하지 않는다. OMIT 연산의 경우 지정된 필드가 입력 레코드에 없거나 일부만 존재하면 해당 레코드를 출력한다.
-
VLTESTI=2 : INCLUDE나 OMIT 연산에서 지정된 필드가 입력 레코드에 없거나 일부만 존재하면 관계식을 '거짓’으로 판단한다.
-
-
DD 문
SORT를 실행할 때 사용하게 되는 데이터셋의 명칭, 속성 등을 다음 항목을 통해 지정한다.
항목 설명 SYSIN
SORT의 제어문을 입력하기 위한 데이터셋이다. 일반적으로 DD *로 시스템 입력 스트림을 이용한다.
SYSOUT
제어문의 리스팅 및 메시지를 출력하기 위한 데이터셋이다. 일반적으로 시스템의 출력 스트림을 이용한다.
SORTIN
SORT/COPY 처리의 입력 데이터셋이다.
SORTINnn
MERGE 처리의 입력 데이터셋이다. 데이터셋의 이름은 반드시 SORTIN01부터 순서대로 정의할 필요는 없으나, 같은 번호를 중복하여 사용할 수는 없다.
또한, MERGE 처리에서 입력 데이터셋들은 아래의 조건을 만족해야 한다.
-
레코드 형식(RECFM)은 같은 형식으로 통일돼야 한다.
-
레코드 형식(RECFM)이 고정길이(FB)인 경우 레코드 길이(LRECL)도 통일돼야 한다.
-
입력 데이터셋들은 MERGE 명령어의 FIELDS 오퍼랜드에 지정된 키 필드 조건으로 미리 정렬이 되어있어야 한다.
SORTWKnn
SORT 처리 중에 작업용 영역으로 사용하는 데이터셋이다.
SORTOUT
SORT/MERGE/COPY 처리 결과를 출력하는 데이터셋이다.
JCL에서 SORTOUT을 새로 생성할 때, 레코드 형식(RECFM)이 지정되어 있지 않으면 SORTIN 또는 SORTINnn이 고정길이(FB)이면 SORTOUT도 고정길이, SORTIN 또는 SORTINnn이 가변길이(VB)이면 SORTOUT도 가변길이로 생성된다. 입력이 NVSM인 레코드를 VSAM 레코드로 출력하거나, VSAM 레코드를 NVSM 레코드로 출력하는 것도 가능하다.
SORTOFxx
OUTFIL로 레코드를 재편집할 때 복수의 출력 데이터셋으로 출력할 때의 데이터셋이다. xx는 1문자 혹은 2문자로 구성된 임의의 영문자나 숫자이다.
SYMNAMES
심볼을 치환하는 경우 참조되는 데이터셋이다.
-
레코드 형식
심볼 이름,필드의 시작 위치,필드의 길이,필드의 포맷
JNFnCNTL
JOIN을 수행할 때 subtaskn의 control statement이다. JOIN 수행 이전에 수행할 SORT statement를 명시한다. n은 1 또는 2이다.
-
-
/* 문
SYSIN 데이터셋의 종료를 지정한다. SORT 제어문의 END를 사용하여 종료를 지정할 수도 있다.
3.2. 데이터셋 정의
다음은 데이터셋 정의에 일반적으로 필요한 오퍼랜드이다.
데이터셋 | DCB | DISP | DSN | LABEL | SPACE | UNIT | VOL | AMP |
---|---|---|---|---|---|---|---|---|
SORTIN |
1 |
○ |
○ |
2 |
Ⅹ |
3 |
3 |
7 |
SORTINnn |
1 |
○ |
○ |
2 |
5 |
3 |
3 |
7 |
SORTOUT |
1 |
○ |
4 |
2 |
5 |
3 |
6 |
7 |
SORTOFxx |
1 |
○ |
4 |
2 |
5 |
3 |
6 |
7 |
SORTWKnn |
Ⅹ |
4 |
4 |
Ⅹ |
5 |
3 |
6 |
Ⅹ |
SYMNAMES |
1 |
○ |
○ |
2 |
Ⅹ |
3 |
3 |
Ⅹ |
JNFnCNTL |
1 |
4 |
4 |
2 |
5 |
3 |
3 |
7 |
-
○ : 반드시 지정해야 한다.
-
Ⅹ : 지정하지 않아도 된다.
-
1 : 경우에 따라 지정할 필요가 있다.
-
2 : 디스크 상에서는 불필요하다.
-
3 : 현재 JOB STEP 이전에 작성 및 카탈로깅되어 있다면 필요 없으나 그렇지 않다면 지정해야 한다.
-
4 : 임시 데이터셋이 아니라면 지정해야 한다.
-
5 : 직접 액세스 장치 상에 작성하는 경우에는 지정해야 한다.
-
6 : 임시 데이터셋인 경우, 현재 STEP 이전에 작성되고 카탈로깅된 경우, 동일 JOB 내의 다른 STEP으로부터 전달받은 경우를 제외하고는 지정해야 한다.
-
7 : VSAM 데이터셋의 경우에는 지정할 수 있으나 다른 경우에는 필요하지 않다.
DCB 오퍼랜드의 서브 파라미터
입출력 데이터셋이 VSAM 데이터셋이 아닌 경우, 레코드 형식(RECFM), 레코드 길이(LRECL), 블록 크기(BLKSIZE)의 정보를 지정해 주어야 한다.
항목 | 설명 |
---|---|
레코드 형식(RECFM) |
데이터셋에 기록되어 있는 레코드의 형식을 지정한다. |
레코드 길이(LRECL) |
데이터셋에 기록되어 있는 레코드의 논리적인 최대 길이를 Byte로 지정한다. |
블록 크기(BLKSIZE) |
데이터셋에 기록되어 있는 레코드의 물리적인 최대 길이를 Byte로 지정한다. |
위의 정보의 지정은 다음 순서에 따라 결정된다.
-
RECFM, LRECL, BLKSIZE가 DD 문의 DCB 오퍼랜드로 지정되어 있으면 그 정보를 사용하고 다른 정보는 무시한다.
-
입력 데이터셋의 경우 DCB 오퍼랜드가 지정되어 있지 않다면 에러가 발생한다. 단, 기존에 이미 데이터셋이 존재하는 경우에는 기존의 정보를 사용한다. 출력 데이터셋의 경우에 DCB 오퍼랜드의 지정이 없다면 다음 순서로 지정된다.
-
OUTREC에서 지정된 정보를 오버라이드하여 사용한다.
-
RECORD를 통해 지정된 정보를 오버라이드하여 사용한다.
-
INREC에서 지정된 정보를 오버라이드하여 사용한다.
-
입력 데이터셋에서 지정된 정보를 오버라이드하여 사용한다.
-
4. General Coding Rules
다음은 SORT 명령문을 작성하기 위한 문법을 설명한다.
구분 | 설명 |
---|---|
LabelField |
라벨 필드는 생략되거나 필요에 의해 사용될 수 있으며 행의 첫 번째 열에서 시작한다. 단, 공백이나 '*'은 첫 번째 열에 사용할 수 없다. 라벨은 1-70열까지 쓸 수 있으며 공백이 나타나면 끝난다. |
Operation Field |
SORT, MERGE 등 프로그램이 수행할 명령을 명시한다. 첫 번째 행 2-71열 사이에서 작성될 수 있다. |
Operand Field |
오퍼랜드 필드는 콤마(,)로 이어질 수 있으며, 오퍼레이션 필드와 최소한 하나 이상의 공백 문자 뒤에 위치한다. 오퍼랜드 필드 내에서는 공백이 허용되지 않는다. |
Remark Field |
주석문과 같은 어떤 내용이라도 작성할 수 있으며, 이는 프로그램이 동작하는 경우에는 무시된다. 오퍼랜드 필드 뒤 하나 이상의 공백 문자 다음에 위치한다. |
Continuation Column (72) |
72열은 Continuation Column이다. 이 열에 공백이 아닌 문자가 위치하면 현재의 문장이 다음 행으로 이어지는 것을 의미한다. 하지만 오퍼랜드 필드가 콤마로 끝났을 경우에는 다음 행을 오퍼랜드의 continuation으로 읽는다. |
Columns 73 - 80 |
이 필드는 자유롭게 사용할 수 있다. 프로그램에서는 읽지 않는다. |
Continuation Lines |
Continuation Lines은 선행하는 행의 논리적인 확장이다. 이는 오퍼랜드의 연속일 수도 있고, 주석문의 연속일 수도 있다.
|
첫 번째 열이 '*'로 시작되면 이 행은 주석문으로 간주된다. 만약, 명령문 내부에 공백 라인이 있는 경우 프로그램에서는 이를 무시한다. 따라서 공백 라인은 continuation에 영향을 미치지 않는다. |