유틸리티 정렬 - AWS 메인프레임 현대화

AWS Mainframe Modernization Service(관리형 런타임 환경 환경 환경)는 더 이상 신규 고객에게 공개되지 않습니다. AWS Mainframe Modernization Service(관리형 런타임 환경 환경)와 유사한 기능의 경우 AWS Mainframe Modernization Service(자체 관리형 환경)를 살펴보세요. 기존 고객은 정상적으로 서비스를 계속 이용할 수 있습니다. 자세한 내용은 AWS Mainframe Modernization 가용성 변경을 참조하세요.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

유틸리티 정렬

정렬 유틸리티는 참조에 유틸리티에 대한 특별한 의미가 있는 데이터 세트를 사용합니다. 따라서 현대화된 측의 모든 정렬 유틸리티는 groovy 스크립트에서 동일한 호출 패턴을 공유합니다.

mpr.withFileConfigurations(<FILE CONFIGURATIONS DETAILS>...) .withParameters(params) .runProgram("<SORT UTILITY ALIAS>")

여기서 mprMainProgramRunner 인스턴스입니다(이 페이지의 스크립트 호출 프로그램 섹션 참조). 정렬 유틸리티 별칭은 아래 섹션에 나와 있습니다.

JCL 스크립트의 DD (데이터 세트 정의) 항목은 mpr.withFileConfigurations() 메서드에 대한 인수 역할을 하는 파일 구성의 세부 정보에서 항목으로 현대화됩니다. 해당 개념에 대한 그림은 아래 샘플을 참조하세요.

SORT/SYNCSORT/ICEMAN

용도

이 프로그램은 제공된 기준에 따라 데이터 세트에서 데이터를 sort/merge/copy하는 데 사용되는 다양한 메인프레임 SORT 유틸리티를 에뮬레이션합니다. 다음 프로그램 별칭을 사용할 수 있습니다(및 해당 레거시 정렬 유틸리티 이름과 일치).

  • SORT

  • SYNCSORT

  • ICEMAN

제어 카드 및 레거시 정렬 유틸리티 기능에 있는 SORT/MERGE 명령에 대한 세부 정보는 여기에 제공되지 않지만 기존 관련 레거시 플랫폼 설명서에서 가져와야 합니다.

서명

프로그램은 인수를 취하지 않지만 대신 특정 데이터 세트 참조에 의존합니다.

  • SYSIN 데이터 세트('컨트롤 카드'라고도 함)에는 정렬/병합 컨트롤 문이 있습니다.

  • 선택적 SYMNAMES 데이터 세트는 SYSIN 콘텐츠에 변수 대체 지시문을 포함합니다.

  • 선택적 SORTXDUP 또는 SORTXSUM 데이터 세트를 사용하여 중복 레코드를 저장할 수 있습니다.

  • 처리할 SORTIN 또는 SORTDBIN 보관 레코드가 접두사로 붙은 데이터 세트(입력)

  • SORTOUT 데이터 세트에는 프로그램의 결과가 들어 있습니다(출력).

  • 일부 레거시 작업 스크립트에서 발견된 SORT WORK 데이터 세트에 대한 SORTWK 정의는 무시됩니다(현대화된 호출에서는 표시되지 않음). 정렬 작업 데이터 세트는 항상 최신 환경에서 동적으로 할당됩니다.

  • DD가 SORTJN (접두사)로 시작하는 두 데이터 세트에는 조인 키 명령(정렬 프로세스 중에 데이터 세트를 조인하는 데 사용됨)과 관련된 레코드가 포함됩니다.

예를 들어 다음 조인 키 명령을 고려합니다.

JOINKEYS FILE=F1,FIELDS=(13,5,A) JOINKEYS FILE=F2,FIELDS=(24,5,A)

여기서 조인 키는 길이가 5이며 다음과 같이 시작됩니다.

  • 데이터 세트의 레코드에 대한 위치 13SORTJNF1(SORTJN접두사 및 파일 연결F1)

  • 데이터 세트의 레코드에 대한 위치 24SORTJNF2(SORTJN접두사 및 파일 연결F2)

검사/오류 처리

  • 입력 파일(SORTIN)에 SHR 처리가 있지만 찾을 수 없는 경우 오류 메시지가 로깅되고 프로그램 반환 코드가 1로 설정되며 프로그램 실행이 중지됩니다(정렬이 발생하지 않고 출력이 생성되지 않음).

다음과 같은 경우 전용 메시지가 RuntimeException 표시됩니다.

  • 프로그램 호출에 데이터베이스에 대한 연결이 필요하지만(SORTDBIN데이터 세트가 사용되는 경우가 아님SORTIN) 유효한 데이터 소스를 찾을 수 없는 경우

  • 출력 파일(SORTOUT)이 제대로 정의되지 않은 경우

  • 제어 카드에 있는 명령을 이해할 수 없거나 지원되지 않는 경우

  • SORT JOINKEYS 사례에 대해 정확히 두 개의 입력 파일이 제공되지 않는 경우

샘플 사용량

MERGE 샘플

다음은 작업 스크립트 조각에서 ICEMAN 호출하는 샘플입니다.

제어 카드는 인라인이며 입력 파일의 필드를 병합하는 명령입니다(SYSIN항목 참조).

//* //PASOSO03 EXEC PGM=ICEMAN,REGION=0M //SORTIN01 DD DSN=input(input809a.data),DISP=SHR,LRECL=10 //SORTIN02 DD DSN=input(input809b.data),DISP=SHR,LRECL=10 //SORTOUT DD DSN=output(out809.txt),DISP=(,PASS),LRECL=10 //SORTWK01 DD SPACE=(281,(156300,156300),RLSE),AVGREC=U //SORTWK02 DD SPACE=(281,(156300,156300),RLSE),AVGREC=U //SYSIN DD * MERGE FIELDS=(1,6,PD,A,7,2,CH,A) END /*

또한 일치하는 현대화된 Groovy 스크립트 조각 -- 이미 언급했듯이 현대화 프로세스 중에는 SORTWK 항목이 고려되지 않으며 인라인 컨트롤 카드가 레거시 컨트롤 카드 콘텐츠와 정확히 일치한다는 점에 유의하세요.

// STEP PASOSO03 - PGM - ICEMAN*************************************************** def stepPASOSO03(Object shell, Map params, Map programResults){ shell.with { if (checkValidProgramResults(programResults)) { return execStep("PASOSO03", "ICEMAN", programResults, { mpr .withFileConfigurations(new FileConfigurationUtils() .withJobContext(jobContext) .fileSystem("SORTIN01") .path("input(input809a.data)").recordSize(10) .disposition("SHR") .build() .fileSystem("SORTIN02") .path("input(input809b.data)").recordSize(10) .disposition("SHR") .build() .fileSystem("SORTOUT") .path("output(out809.txt)").recordSize(10) .normalTermination("PASS") .build() .fileSystem("SYSIN") .stream( """ MERGE FIELDS=(1,6,PD,A,7,2,CH,A) END """, getEncoding()) .build() .getFileConfigurations()) .withParameters(params) .runProgram("ICEMAN") }) } } }

단순 SORT 샘플

Carddemo 샘플 애플리케이션에서 선택한 인라인 제어 카드가 있는 간단한 레거시 SORT 단계(작업 스크립트 코드 조각):

//********************************************************************* //* CREATE COPY OF TRANSACT FILE WITH CARD NUMBER AND TRAN ID AS KEY //********************************************************************* //STEP010 EXEC PGM=SORT //SORTIN DD DISP=SHR,DSN=AWS.M2.CARDDEMO.TRANSACT.VSAM.KSDS //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SORTOUT DD DSN=AWS.M2.CARDDEMO.TRXFL.SEQ, // DISP=(NEW,CATLG,DELETE),UNIT=SYSDA, // DCB=(LRECL=350,BLKSIZE=3500,RECFM=FB), // SPACE=(CYL,(1,1),RLSE) //SYSIN DD * SORT FIELDS=(263,16,CH,A,1,16,CH,A) OUTREC FIELDS=(1:263,16,17:1,262,279:279,50) /*

및 일치하는 현대화된 groovy 스크립트 조각:

// STEP STEP010 - PGM - SORT****************************************************** def stepSTEP010(Object shell, Map params, Map programResults){ shell.with { if (checkValidProgramResults(programResults)) { return execStep("STEP010", "SORT", programResults, { mpr .withFileConfigurations(new FileConfigurationUtils() .withJobContext(jobContext) .bluesam("SORTIN") .dataset("AWS.M2.CARDDEMO.TRANSACT.VSAM.KSDS") .disposition("SHR") .build() .systemOut("SYSPRINT") .output("*") .build() .systemOut("SYSOUT") .output("*") .build() .fileSystem("SORTOUT") .path("AWS.M2.CARDDEMO.TRXFL.SEQ").recordSize(350) .disposition("NEW") .normalTermination("CATLG") .abnormalTermination("DELETE") .build() .fileSystem("SYSIN") .stream( """ SORT FIELDS=(263,16,CH,A,1,16,CH,A) OUTREC FIELDS=(1:263,16,17:1,262,279:279,50)""", getEncoding()) .build() .getFileConfigurations()) .withParameters(params) .runProgram("SORT") }) } } }

인라인 컨트롤 카드는 레거시 컨트롤 카드 콘텐츠를 수정하지 않고 "있는 그대로" 사용됩니다.

ICETOOL

용도

ICETOOL 유틸리티는 단일 작업 단계(데이터 조작, 정렬 및 분석)에서 데이터 세트에 대해 여러 작업을 수행하는 데 사용됩니다.

지원되는 코어 연산자는 다음과 같습니다.

  • COPY - 입력에서 출력 파일로 데이터를 복사합니다.

  • SORT - 지정된 정렬 카드/기준을 사용하여 데이터를 정렬합니다.

  • SELECT - 조건에 따라 특정 레코드를 필터링하고 선택합니다.

  • SPLICE - 여러 소스의 데이터를 병합/조인합니다.

  • COUNT - 지정된 기준을 충족하는 레코드 수를 계산합니다.

  • OCCUR - 데이터의 발생 패턴을 분석합니다.

SPLICE 운영자의 경우 유틸리티는 최적화된 성능을 보장하기 위해 데이터 청킹 전략을 기반으로 다중 스레드 접근 방식을 사용합니다.

연산자에 대한 세부 정보는 적절한 레거시 플랫폼 설명서에서 가져와야 합니다.

서명

ICETOOL 유틸리티는 파라미터를 사용하지 않지만 특정 데이터 세트에 의존합니다.

  • TOOLIN 데이터 세트에는 유틸리티에서 처리할 제어 문이 포함되어 있습니다.

  • TOOLMSG 현대화된 ICETOOL 유틸리티에서 현재 및 DFSMSG 데이터 세트를 사용하지 않음(무시됨)

  • IN는 입력 데이터 세트의 접두사입니다(처리할 레코드).

  • OUT는 출력 데이터 세트의 접두사입니다(처리로 인한 레코드).

  • 제어 카드의 제어 문에서 다른 데이터 세트를 참조할 수 있습니다.

검사/오류 처리

다음과 같은 경우 관련 메시지와 함께이 발생합니다RuntimeException.

  • 제어 문 중 하나에 사용된 연산자가 지원되지 않는 경우

  • 지원되지 않는 명령이 제공된 경우 모든 연산자에 대해

샘플 사용량

ICETOOL SORT 샘플

다음은 정렬 목적으로 ICETOOL을 사용하는 레거시 jcl 샘플입니다.

  • 각 SORT 연산자 제어 문은 USING 키워드를 통해 참조가 지정된 전용 제어 카드를 사용합니다.

  • 모든 컨트롤 카드는 정의 뒤에 정의TOOLIN되며 인라인으로 표시됩니다( SEL1CNTL 및 다음 *CNTL 항목 참조).

//SAMPLO52 EXEC PGM=ICETOOL,REGION=1024K //TOOLMSG DD SYSOUT=* //DFSMSG DD SYSOUT=* //IN1 DD DSN=input(input846a.data),DISP=SHR // DCB=(RECFM=F,LRECL=8) //IN2 DD DSN=input(input846b.data),DISP=SHR // DCB=(RECFM=F,LRECL=8) //OUT1 DD DSN=output(out846a.txt),DISP=(,CATLG) // DCB=(RECFM=F,LRECL=8) //OUT2 DD DSN=output(out846b.txt),DISP=(,CATLG) // DCB=(RECFM=V) //OUT3 DD DSN=output(out846c.txt),DISP=(,CATLG) // DCB=(RECFM=V) //TOOLIN DD * SORT FROM(IN1) TO(OUT1) USING(SEL1) SORT FROM(IN2) TO(OUT1) USING(SEL2) SORT FROM(IN1) TO(OUT2) USING(SEL3) SORT FROM(IN2) TO(OUT2) USING(SEL4) SORT FROM(IN1) TO(OUT3) USING(SEL5) SORT FROM(IN2) TO(OUT3) USING(SEL6) /* //SEL1CNTL DD * OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')) //* //SEL2CNTL DD * OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')) //* //SEL3CNTL DD * OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' ' //* //SEL4CNTL DD * OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' ' //* //SEL5CNTL DD * OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' ' //* //SEL6CNTL DD * OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,7,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' ' //*

현대화되면 일치하는 Groovy 스크립트 조각은 다음과 같습니다.

// STEP SAMPLO52 - PGM - ICETOOL************************************************** def stepSAMPLO52(Object shell, Map params, Map programResults){ shell.with { if (checkValidProgramResults(programResults)) { return execStep("SAMPLO52", "ICETOOL", programResults, { mpr .withFileConfigurations(new FileConfigurationUtils() .withJobContext(jobContext) .systemOut("TOOLMSG") .output("*") .build() .systemOut("DFSMSG") .output("*") .build() .fileSystem("IN1") .path("input(input846a.data)").recordSize(8) .disposition("SHR") .build() .fileSystem("IN2") .path("input(input846b.data)").recordSize(8) .disposition("SHR") .build() .fileSystem("OUT1") .path("output(out846a.txt)").recordSize(8) .normalTermination("CATLG") .build() .fileSystem("OUT2") .path("output(out846b.txt)").rdw(true) .normalTermination("CATLG") .build() .fileSystem("OUT3") .path("output(out846c.txt)").rdw(true) .normalTermination("CATLG") .build() .fileSystem("TOOLIN") .stream( """ SORT FROM(IN1) TO(OUT1) USING(SEL1) SORT FROM(IN2) TO(OUT1) USING(SEL2) SORT FROM(IN1) TO(OUT2) USING(SEL3) SORT FROM(IN2) TO(OUT2) USING(SEL4) SORT FROM(IN1) TO(OUT3) USING(SEL5) SORT FROM(IN2) TO(OUT3) USING(SEL6) """, getEncoding()) .build() .fileSystem("SEL1CNTL") .stream( """ OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')) """, getEncoding()) .build() .fileSystem("SEL2CNTL") .stream( """ OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*'))""", getEncoding()) .build() .fileSystem("SEL3CNTL") .stream( """ OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' '""", getEncoding()) .build() .fileSystem("SEL4CNTL") .stream( """ OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' '""", getEncoding()) .build() .fileSystem("SEL5CNTL") .stream( """ OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' '""", getEncoding()) .build() .fileSystem("SEL6CNTL") .stream( """ OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,7,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' '""", getEncoding()) .build() .getFileConfigurations()) .withParameters(params) .runProgram("ICETOOL") }) } } }

참고:

  • 인라인 컨트롤 카드는 "있는 그대로" 사용되며 레거시 컨트롤 카드에서 변환이 발생하지 않았습니다.

  • TOOLMSGDFSMSG는 현대화된 버전에서 정의되지만 런타임 시 무시됩니다.

  • 레거시 버전과 현대화된 버전 모두에서 제어 카드는 CNTL 접미사로 정의되지만 TOOLIN 데이터 세트의 명령에서 접미사 없이 참조됩니다. 예:에서 SORT FROM(IN1) TO(OUT1) USING(SEL1)SEL1CNTL 데이터 세트 정의를 USING(SEL1) 참조합니다.

ICETOOL COPY 샘플

다음은 COPY 연산자를 사용하는 또 다른 ICETOOL 샘플입니다. TOOLIN는 jcl 스크립트 조각에 인라인으로 표시됩니다.

//SAMPLO51 EXEC PGM=ICETOOL,REGION=1024K //TOOLMSG DD SYSOUT=* //DFSMSG DD SYSOUT=* //IN1 DD DSN=input(input831.data),DISP=SHR // DCB=(RECFM=F,LRECL=12) //OUT1 DD DSN=output(out831a.txt),DISP=OLD // DCB=(RECFM=F,LRECL=12) //OUT2 DD DSN=output(out831b.txt),DISP=OLD // DCB=(RECFM=F,LRECL=12) //TOOLIN DD * COPY FROM(IN1) TO(OUT1,OUT2) USING(SEL1) /* //SEL1CNTL DD * OPTION COPY OUTFIL INCLUDE=(7,2,CH,EQ,C'10') //*

다음은 현대화된 매칭 그루비 스크립트 조각입니다.

// STEP SAMPLO51 - PGM - ICETOOL************************************************** def stepSAMPLO51(Object shell, Map params, Map programResults){ shell.with { if (checkValidProgramResults(programResults)) { return execStep("SAMPLO51", "ICETOOL", programResults, { mpr .withFileConfigurations(new FileConfigurationUtils() .withJobContext(jobContext) .systemOut("TOOLMSG") .output("*") .build() .systemOut("DFSMSG") .output("*") .build() .fileSystem("IN1") .path("input(input831.data)").recordSize(12) .disposition("SHR") .build() .fileSystem("OUT1") .path("output(out831a.txt)").recordSize(12) .disposition("OLD") .build() .fileSystem("OUT2") .path("output(out831b.txt)").recordSize(12) .disposition("OLD") .build() .fileSystem("TOOLIN") .stream( """ COPY FROM(IN1) TO(OUT1,OUT2) USING(SEL1) COPY FROM(IN1) TO(OUT3,OUT4) COPY FROM(IN1) TO(OUT4) COPY FROM(IN1) TO(OUT5,OUT6) """, getEncoding()) .build() .fileSystem("SEL1CNTL") .stream( """ OPTION COPY OUTFIL INCLUDE=(7,2,CH,EQ,C'10')""", getEncoding()) .build() .getFileConfigurations()) .withParameters(params) .runProgram("ICETOOL") }) } } }

MFSORT

용도

이 유틸리티 프로그램은 Micro Focus 환경에서 발견되는 MFSORT라는 정렬 유틸리티의 동작을 모방하기 위한 것입니다(일반적으로 명령줄 또는 레거시 환경의 스크립트에서 호출됨).

내부적으로 프로그램은 실제 정렬 작업을 SORT/SYNCSORT/ICEMAN 유틸리티 프로그램에 위임합니다.

서명

다음 레거시 구문만 지원됩니다. mfsort take <control card>

직접 지침은를 로 호출합니다. mfsort <instructions>는 지원되지 않습니다.

인수를 취하지 않습니다. 인수 지시문은 MFSORT가 작동하는 명령TAKE이 포함된 로 참조되는 데이터 세트를 사용하여 에뮬레이션됩니다.

검사/오류 처리

  • TAKE 데이터 세트가 누락되었거나 유효하지 않은 경우이 발생합니다RuntimeException.

  • MFSORT에서 SORT로의 위임을 고려할 때 도 여기에 검사/오류 처리 적용됩니다.

샘플 사용량

다음 명령 호출은 샘플 MFSORT 사용량을 보여줍니다.

mfsort take TESTSRT1.CTL

다음은 현대화된 groovy 스크립트 조각과 일치합니다.

mpr.withFileConfigurations(new FileConfigurationUtils() .fileSystem("TAKE") .path("input(TESTSRT1.CTL)") .build() .getFileConfigurations()) .withArguments("input") // relative path for use and give files .runProgram("MFSORT");