JCL-조건부 처리

작업 항목 시스템은 두 가지 접근 방식을 사용하여 JCL에서 조건부 처리를 수행합니다. 작업이 완료되면 실행 상태에 따라 반환 코드가 설정됩니다. 리턴 코드는 0 (성공적인 실행)에서 4095 (0이 아닌 경우 오류 상태를 표시 함) 사이의 숫자 일 수 있습니다. 가장 일반적인 기존 값은 다음과 같습니다.

  • 0 = 정상-모두 정상

  • 4 = 경고-사소한 오류 또는 문제.

  • 8 = 오류-심각한 오류 또는 문제.

  • 12 = 심각한 오류-중대한 오류 또는 문제, 결과를 신뢰할 수 없습니다.

  • 16 = 터미널 오류-매우 심각한 문제, 결과를 사용하지 마십시오.

작업 단계 실행은 다음을 사용하여 이전 단계의 반환 코드를 기반으로 제어 할 수 있습니다. COND 매개 변수 및 IF-THEN-ELSE 이 튜토리얼에서 설명했습니다.

COND 매개 변수

COND매개 변수는 JCL의 JOB 또는 EXEC 문에 코딩 될 수 있습니다. 이전 작업 단계의 리턴 코드에 대한 테스트입니다. 테스트가 참으로 평가되면 현재 작업 단계 실행이 무시됩니다. 바이 패스는 비정상 종료가 아니라 작업 단계를 생략하는 것입니다. 단일 테스트에는 최대 8 개의 조건이 결합 될 수 있습니다.

통사론

다음은 JCL COND 매개 변수의 기본 구문입니다.

COND=(rc,logical-operator)
or
COND=(rc,logical-operator,stepname)
or
COND=EVEN
or 
COND=ONLY

다음은 사용 된 매개 변수에 대한 설명입니다.

  • rc : 이것은 리턴 코드입니다.

  • logical-operator : GT (크거나 같음), GE (크거나 같음), EQ (같음), LT (작음), LE (작거나 같음) 또는 NE (같지 않음) 일 수 있습니다.

  • stepname : 테스트에서 리턴 코드가 사용되는 작업 단계입니다.

마지막 두 조건 (a) COND = EVEN 및 (b) COND = ONLY는이 자습서 아래에 설명되어 있습니다.

COND는 JOB 문 또는 EXEC 문 내에서 코딩 할 수 있으며 두 경우 모두 아래에 설명 된대로 다르게 작동합니다.

JOB 문 내부의 COND

COND가 JOB 문에 코딩되면 모든 작업 단계에 대해 조건이 테스트됩니다. 특정 작업 단계에서 조건이 참이면 다음 작업 단계와 함께 무시됩니다. 다음은 그 예입니다.

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID,COND=(5,LE)
//*
//STEP10 EXEC PGM=FIRSTP  
//* STEP10 executes without any test being performed.

//STEP20 EXEC PGM=SECONDP 
//* STEP20 is bypassed, if RC of STEP10 is 5 or above. //* Say STEP10 ends with RC4 and hence test is false. //* So STEP20 executes and lets say it ends with RC16.

//STEP30 EXEC PGM=SORT
//* STEP30 is bypassed since 5 <= 16.

EXEC 문 내부의 COND

COND가 작업 단계의 EXEC 문에 코딩되고 참인 경우 해당 작업 단계 만 무시되고 다음 작업 단계부터 실행이 계속됩니다.

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.

//STP02 EXEC PGM=MYCOBB,COND=(0,EQ,STP01)
//* In STP02, condition evaluates to TRUE and step bypassed.

//STP03 EXEC PGM=IEBGENER,COND=((10,LT,STP01),(10,GT,STP02))
//* In STP03, first condition fails and hence STP03 executes. //* Since STP02 is bypassed, the condition (10,GT,STP02) in //* STP03 is not tested.

COND = 짝수

COND = EVEN이 코딩되면 이전 단계가 비정상적으로 종료 되더라도 현재 작업 단계가 실행됩니다. 다른 RC 조건이 COND = EVEN과 함께 코딩 된 경우 RC 조건이 참이 아닌 경우 작업 단계가 실행됩니다.

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.

//STP02 EXEC PGM=MYCOBB,COND=(0,EQ,STP01)
//* In STP02, condition evaluates to TRUE and step bypassed.

//STP03 EXEC PGM=IEBGENER,COND=((10,LT,STP01),EVEN)
//* In STP03, condition (10,LT,STP01) evaluates to true, //* hence the step is bypassed.

COND = ONLY

COND = ONLY가 코딩되면 이전 단계가 비정상적으로 종료되는 경우에만 현재 작업 단계가 실행됩니다. 다른 RC 조건이 COND = ONLY와 함께 코딩 된 경우 RC 조건이 참이 아니고 이전 작업 단계가 비정상적으로 실패하면 작업 단계가 실행됩니다.

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.

//STP02 EXEC PGM=MYCOBB,COND=(4,EQ,STP01)
//* In STP02, condition evaluates to FALSE, step is executed //* and assume the step abends.

//STP03 EXEC PGM=IEBGENER,COND=((0,EQ,STP01),ONLY)
//* In STP03, though the STP02 abends, the condition //* (0,EQ,STP01) is met. Hence STP03 is bypassed.

IF-THEN-ELSE 구성

작업 처리를 제어하는 ​​또 다른 접근 방식은 IF-THEN-ELSE 구문을 사용하는 것입니다. 이는 더 많은 유연성과 사용자 친화적 인 조건부 처리 방법을 제공합니다.

통사론

다음은 JCL IF-THEN-ELSE 구성의 기본 구문입니다.

//name IF condition THEN
list of statements //* action to be taken when condition is true
//name ELSE 
list of statements //* action to be taken when condition is false
//name ENDIF

다음은 위의 IF-THEN-ELSE 구문에서 사용 된 용어에 대한 설명입니다.

  • name : 이것은 선택 사항이며 이름은 알파벳, #, $ 또는 @로 시작하는 1-8 자의 영숫자를 가질 수 있습니다.

  • Condition : 조건의 형식은 다음과 같습니다. KEYWORD OPERATOR VALUE, 어디 KEYWORDSRC (반환 코드), ABENDCC (시스템 또는 사용자 완료 코드), ABEND, RUN (단계 시작 실행)이 될 수 있습니다. 안OPERATOR 논리 연산자 (AND (&), OR (|)) 또는 관계 연산자 (<, <=,>,> =, <>) 일 수 있습니다.

다음은 IF-THEN-ELSE의 사용법을 보여주는 간단한 예입니다.

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//PRC1   PROC
//PST1	   EXEC PGM=SORT
//PST2	   EXEC PGM=IEBGENER
//       PEND
//STP01  EXEC PGM=SORT 
//IF1    IF STP01.RC = 0 THEN
//STP02     EXEC PGM=MYCOBB1,PARM=123
//       ENDIF
//IF2    IF STP01.RUN THEN
//STP03a    EXEC PGM=IEBGENER
//STP03b    EXEC PGM=SORT
//       ENDIF
//IF3    IF STP03b.!ABEND THEN
//STP04     EXEC PGM=MYCOBB1,PARM=456
//       ELSE
//       ENDIF
//IF4    IF (STP01.RC = 0 & STP02.RC <= 4) THEN
//STP05     EXEC PROC=PRC1
//       ENDIF
//IF5    IF STP05.PRC1.PST1.ABEND THEN
//STP06     EXEC PGM=MYABD
//       ELSE
//STP07     EXEC PGM=SORT
//       ENDIF

좀 더 자세히 이해하기 위해 위의 프로그램을 살펴 보겠습니다.

  • STP01의 리턴 코드는 IF1에서 테스트됩니다. 0이면 STP02가 실행됩니다. 그렇지 않으면 다음 IF 문 (IF2)으로 처리됩니다.

  • IF2에서 STP01이 실행을 시작하면 STP03a와 STP03b가 실행됩니다.

  • IF3에서 STP03b가 ABEND가 아니면 STP04가 실행됩니다. ELSE에는 문이 없습니다. NULL ELSE 문이라고합니다.

  • IF4에서 STP01.RC = 0이고 STP02.RC <= 4가 TRUE이면 STP05가 실행됩니다.

  • IF5에서 작업 단계 STP05 ABEND에서 PROC PRC1의 proc-step PST1이 실행되면 STP06이 실행됩니다. 그렇지 않으면 STP07이 실행됩니다.

  • IF4가 거짓으로 평가되면 STP05가 실행되지 않습니다. 이 경우 IF5는 테스트되지 않고 단계 STP06, STP07은 실행되지 않습니다.

IF-THEN-ELSE는 사용자가 작업을 취소하거나 작업 시간이 만료되거나 데이터 세트가 우회 된 단계를 역 참조하는 경우와 같이 작업이 비정상적으로 종료 된 경우 실행되지 않습니다.

체크 포인트 설정

다음을 사용하여 JCL 프로그램 내에서 체크 포인트 데이터 세트를 설정할 수 있습니다. SYSCKEOV, 이것은 DD 문입니다.

CHKPTDD 문에서 다중 볼륨 QSAM 데이터 세트에 대해 코딩 된 매개 변수입니다. CHKPT가 CHKPT = EOV로 코딩되면 입력 / 출력 다중 볼륨 데이터 세트의 각 볼륨 끝에있는 SYSCKEOV 문에 지정된 데이터 세트에 체크 포인트가 기록됩니다.

//CHKSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01     EXEC PGM=MYCOBB
//SYSCKEOV  DD DSNAME=SAMPLE.CHK,DISP=MOD
//IN1       DD DSN=SAMPLE.IN,DISP=SHR
//OUT1      DD DSN=SAMPLE.OUT,DISP=(,CATLG,CATLG)
//          CHKPT=EOV,LRECL=80,RECFM=FB

위의 예에서 체크 포인트는 출력 데이터 세트 SAMPLE.OUT의 각 볼륨 끝에있는 데이터 세트 SAMPLE.CHK에 기록됩니다.

처리 재시작

자동으로 처리를 다시 시작할 수 있습니다. RD parameter 또는 사용 설명서 RESTART parameter.

RD parameter JOB 또는 EXEC 문에 코딩되어 있으며 자동화 된 JOB / STEP 다시 시작에 도움이되며 R, RNC, NR 또는 NC의 네 가지 값 중 하나를 보유 할 수 있습니다.

  • RD=R 자동 재시작을 허용하고 DD 문의 CHKPT 매개 변수에 코딩 된 체크 포인트를 고려합니다.

  • RD=RNC 자동 재시작을 허용하지만 CHKPT 매개 변수를 대체 (무시)합니다.

  • RD=NR작업 / 단계를 자동으로 다시 시작할 수 없음을 지정합니다. 그러나 RESTART 매개 변수를 사용하여 수동으로 다시 시작하면 CHKPT 매개 변수 (있는 경우)가 고려됩니다.

  • RD=NC 자동 재시작 및 체크 포인트 처리를 허용하지 않습니다.

특정 이상 종료 코드에 대해서만 자동 재시작을 수행해야하는 요구 사항이있는 경우 다음에서 지정할 수 있습니다. SCHEDxx IBM 시스템 parmlib 라이브러리의 구성원입니다.

RESTART parameterJOB 또는 EXEC 문에 코딩되어 있으며 작업 실패 후 JOB / STEP을 수동으로 다시 시작하는 데 도움이됩니다. RESTART는 SYSCKEOV DD 문에 코딩 된 데이터 세트에 기록 된 체크 포인트 인 checkid와 함께 사용할 수 있습니다. checkid가 코딩 될 때 SYSCHK DD 문은 JOBLIB 문 (있는 경우) 뒤에 체크 포인트 데이터 세트를 참조하도록 코딩되어야하고, 그렇지 않으면 JOB 문 뒤에 있어야합니다.

//CHKSAMP JOB CLASS=6,NOTIFY=&SYSUID,RESTART=(STP01,chk5)
//*
//SYSCHK    DD DSN=SAMPLE.CHK,DISP=OLD
//STP01     EXEC PGM=MYCOBB
//*SYSCKEOV	DD DSNAME=SAMPLE.CHK,DISP=MOD
//IN1       DD DSN=SAMPLE.IN,DISP=SHR
//OUT1      DD DSN=SAMPLE.OUT,DISP=(,CATLG,CATLG)
//          CHKPT=EOV,LRECL=80,RECFM=FB

위의 예에서 chk5는 checkid입니다. 즉, STP01은 checkpoint5에서 다시 시작됩니다. 체크 포인트 설정 섹션에서 설명한 이전 프로그램에서 SYSCHK 문이 추가되고 SYSCKEOV 문이 주석 처리되어 있습니다.