Система ввода заданий использует два подхода для выполнения условной обработки в 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 закомментирован в предыдущей программе, описанной в разделе «Установка контрольной точки».