Учебники

JCL — условная обработка

Система ввода заданий использует два подхода для выполнения условной обработки в JCL. Когда задание завершается, код возврата устанавливается в зависимости от состояния выполнения. Код возврата может быть числом от 0 (успешное выполнение) до 4095 (ненулевое значение показывает состояние ошибки). Наиболее распространенные общепринятые значения:

  • 0 = Нормально — все ОК

  • 4 = Предупреждение — мелкие ошибки или проблемы.

  • 8 = Ошибка — значительные ошибки или проблемы.

  • 12 = Серьезная ошибка — серьезные ошибки или проблемы, результаты не следует доверять.

  • 16 = Ошибка терминала — очень серьезные проблемы, не используйте результаты.

0 = Нормально — все ОК

4 = Предупреждение — мелкие ошибки или проблемы.

8 = Ошибка — значительные ошибки или проблемы.

12 = Серьезная ошибка — серьезные ошибки или проблемы, результаты не следует доверять.

16 = Ошибка терминала — очень серьезные проблемы, не используйте результаты.

Выполнением шага задания можно управлять на основе кода возврата предыдущего шага (-ов), используя параметр COND и конструкцию IF-THEN-ELSE , которая была объяснена в этом руководстве.

Параметр COND

Параметр COND может быть закодирован в операторе JOB или EXEC JCL. Это проверка кода возврата предыдущих этапов задания. Если тест оценивается как истинный, текущее выполнение шага задания игнорируется. Обход — это просто пропуск шага работы, а не ненормальное завершение. В одном тесте может быть не более восьми условий.

Синтаксис

Ниже приведен основной синтаксис параметра JCL COND:

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

Вот описание используемых параметров:

  • rc : это код возврата

  • логический оператор : это может быть GT (больше, чем), GE (больше или равно), EQ (равно), LT (меньше), LE (меньше или равно) или NE (не равно).

  • stepname : это шаг задания, код возврата которого используется в тесте.

rc : это код возврата

логический оператор : это может быть GT (больше, чем), GE (больше или равно), EQ (равно), LT (меньше), LE (меньше или равно) или NE (не равно).

stepname : это шаг задания, код возврата которого используется в тесте.

Последние два условия (a) COND = EVEN и (b) COND = ONLY, были объяснены ниже в этом руководстве.

COND может быть закодирован либо внутри инструкции JOB, либо в инструкции EXEC, и в обоих случаях он ведет себя по-разному, как объяснено ниже:

COND внутри оператора JOB

Когда 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.

COND внутри оператора EXEC

Когда 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 = ТОЛЬКО

Когда кодируется 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 Construct

Другой подход к управлению обработкой заданий — использование конструкций 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 буквенно-цифровых символов, начинающихся с алфавита, #, $ или @.

  • Условие : условие будет иметь формат: КЛЮЧЕВОЕ СЛОВО ОПЕРАТОРА , где КЛЮЧЕВЫМИ СЛОВАМИ могут быть RC (код возврата), ABENDCC (код завершения системы или пользователя), ABEND, RUN (выполнение запуска шага). ОПЕРАТОР может быть логическим оператором (И (&), ИЛИ (|)) или реляционным оператором (<, <=,>,> =, <>).

name : это необязательно, и имя может содержать от 1 до 8 буквенно-цифровых символов, начинающихся с алфавита, #, $ или @.

Условие : условие будет иметь формат: КЛЮЧЕВОЕ СЛОВО ОПЕРАТОРА , где КЛЮЧЕВЫМИ СЛОВАМИ могут быть RC (код возврата), ABENDCC (код завершения системы или пользователя), ABEND, RUN (выполнение запуска шага). ОПЕРАТОР может быть логическим оператором (И (&), ИЛИ (|)) или реляционным оператором (<, <=,>,> =, <>).

пример

Ниже приведен простой пример, показывающий использование 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, если шаг процесса PST1 в PROC PRC1 в шаге задания STP05 ABEND, выполняется STP06. Остальное STP07 выполнено.

  • Если значение IF4 равно false, STP05 не выполняется. В этом случае IF5 не проверяются, и шаги STP06, STP07 не выполняются.

Код возврата 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, если шаг процесса PST1 в PROC PRC1 в шаге задания STP05 ABEND, выполняется STP06. Остальное STP07 выполнено.

Если значение IF4 равно false, STP05 не выполняется. В этом случае IF5 не проверяются, и шаги STP06, STP07 не выполняются.

IF-THEN-ELSE не будет выполняться в случае ненормального завершения задания, такого как пользователь, отменяющий задание, истечение времени выполнения задания или набор данных, обратная ссылка на который пропускается.

Установка контрольных точек

Вы можете установить набор данных контрольных точек в вашей программе JCL, используя SYSCKEOV, который является оператором DD.

CHKPT — это параметр, закодированный для многотомных наборов данных QSAM в операторе DD. Когда 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.CHK в конце каждого тома выходного набора данных SAMPLE.OUT.

Перезапустить обработку

Вы можете возобновить обработку эфира автоматическим способом, используя параметр RD, или вручную, используя параметр RESTART .

Параметр RD кодируется в операторе JOB или EXEC, он помогает в автоматическом перезапуске JOB / STEP и может содержать одно из четырех значений: R, RNC, NR или NC.

  • RD = R разрешает автоматический перезапуск и рассматривает контрольную точку, закодированную в параметре CHKPT оператора DD.

  • RD = RNC разрешает автоматический перезапуск, но переопределяет (игнорирует) параметр CHKPT.

  • RD = NR указывает, что задание / шаг не может быть автоматически перезапущен. Но когда он перезапускается вручную с использованием параметра RESTART, будет учитываться параметр CHKPT (если есть).

  • RD = NC запрещает автоматический перезапуск и обработку контрольных точек.

RD = R разрешает автоматический перезапуск и рассматривает контрольную точку, закодированную в параметре CHKPT оператора DD.

RD = RNC разрешает автоматический перезапуск, но переопределяет (игнорирует) параметр CHKPT.

RD = NR указывает, что задание / шаг не может быть автоматически перезапущен. Но когда он перезапускается вручную с использованием параметра RESTART, будет учитываться параметр CHKPT (если есть).

RD = NC запрещает автоматический перезапуск и обработку контрольных точек.

Если требуется выполнить автоматический перезапуск только для определенных кодов аварийного завершения , это можно указать в элементе SCHEDxx библиотеки IBM system parmlib.

Параметр RESTART кодируется в операторе JOB или EXEC и помогает при ручном перезапуске JOB / STEP после сбоя задания. RESTART может сопровождаться checkid, который является контрольной точкой, записанной в наборе данных, закодированном в операторе SYSCKEOV DD. При кодировании 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 перезапускается с контрольной точки5. Обратите внимание, что добавлен оператор SYSCHK, а оператор SYSCKEOV закомментирован в предыдущей программе, описанной в разделе «Установка контрольной точки».