Учебники

JCL — Процедуры

Процедуры JCL — это набор операторов внутри JCL, сгруппированных для выполнения определенной функции. Обычно фиксированная часть JCL кодируется в процедуре. Различная часть работы кодируется в JCL.

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

Синтаксис

Ниже приведен основной синтаксис определения процедуры JCL:

//*
// Step-name EXEC procedure name 

Содержимое процедуры содержится в JCL для процедуры instream. Содержимое хранится в другом элементе базовой библиотеки для каталогизированной процедуры. В этой главе будет объяснено два типа процедур, доступных в JCL, и, наконец, мы увидим, как мы можем вкладывать различные процедуры.

Процедура Instream

Когда процедура закодирована в одном и том же элементе JCL, она называется процедурой Instream. Он должен начинаться с оператора PROC и заканчиваться оператором PEND.

//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//INSTPROC   PROC                //*START OF PROCEDURE
//PROC1		EXEC PGM=SORT
//SORTIN	DD DSN=&DSNAME,DISP=SHR
//SORTOUT	DD SYSOUT=*MYINCL
//SYSOUT	DD SYSOUT=*
//SYSIN		DD DSN=&DATAC LRECL=80
//           PEND               //*END OF PROCEDURE
//*
//STEP1      EXEC INSTPROC,DSNME=MYDATA.URMI.INPUT1,
//           DATAC=MYDATA.BASE.LIB1(DATA1)
//*
//STEP2      EXEC INSTPROC,DSNME=MYDATA.URMI.INPUT2
//           DATAC=MYDATA.BASE.LIB1(DATA1)
//*                               

В приведенном выше примере процедура INSTPROC вызывается в STEP1 и STEP2 с использованием разных входных файлов. Параметры DSNAME и DATAC могут кодироваться с различными значениями при вызове процедуры, и они называются символическими параметрами . Различные входные данные для JCL, такие как имена файлов, карты данных, значения PARM и т. Д., Передаются в качестве символических параметров процедурам.

При кодировании символических параметров не используйте KEYWORDS, PARAMETERS или SUB-PARAMETERS в качестве символических имен. Пример: не используйте TIME = & TIME, но да, вы можете использовать TIME = & TM, и это считается правильным способом кодирования символов.

Определяемые пользователем символические параметры называются символами JCL . Существуют определенные символы, называемые системными символами , которые используются для выполнения заданий входа в систему. Единственный системный символ, используемый в пакетных заданиях обычными пользователями, это & SYSUID, который используется в параметре NOTIFY в операторе JOB.

Каталогизированная процедура

Когда процедура отделяется от JCL и кодируется в другом хранилище данных, она называется каталогизированной процедурой . Заявление PROC не обязательно должно быть закодировано в каталогизированной процедуре. Ниже приведен пример JCL, где он вызывает процедуру CATLPROC:

//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//STEP EXEC CATLPROC ,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT
//          DATAC=MYDATA.BASE.LIB1(DATA1)

Здесь процедура CATLPROC каталогизирована в MYCOBOL.BASE.LIB1. PROG, DATAC и DSNAME передаются в качестве символических параметров в процедуру CATLPROC.

//CATLPROC PROC PROG=,BASELB=MYCOBOL.BASE.LIB1
//*
//PROC1     EXEC PGM=&PROG
//STEPLIB   DD DSN=&BASELB,DISP=SHR
//IN1       DD DSN=&DSNAME,DISP=SHR
//OUT1      DD SYSOUT=*
//SYSOUT    DD SYSOUT=*
//SYSIN     DD DSN=&DATAC
//*

В рамках процедуры кодируются символические параметры PROG и BASELB. Обратите внимание, что параметр PROG в процедуре переопределяется значением в JCL, и, следовательно, PGM принимает значение CATPRC1 во время выполнения.

Вложенные процедуры

Вызов процедуры изнутри процедуры называется вложенной процедурой . Процедуры могут быть вложены до 15 уровней. Вложенность может быть полностью потоковой или каталогизированной. Мы не можем закодировать процедуру instream в каталогизированной процедуре.

//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//SETNM     SET DSNM1=INPUT1,DSNM2=OUTPUT1
//INSTPRC1  PROC               //* START OF PROCEDURE 1
//STEP1        EXEC PGM=SORT,DISP=SHR
//SORTIN       DD DSN=&DSNM1,DISP=SHR
//SORTOUT      DD DSN=&DSNM2,DISP=(,PASS)
//SYSOUT       DD SYSOUT=*
//SYSIN        DD DSN=&DATAC
//*
//STEP2        EXEC PROC=INSTPRC2 ,DSNM2=MYDATA.URMI.OUTPUT2
//          PEND               //* END OF PROCEDURE 1
//*
//INSTPRC2  PROC               //* START OF PROCEDURE 2
//STEP1        EXEC PGM=SORT
//SORTIN       DD DSN=*.INSTPRC1.STEP1.SORTOUT
//SORTOUT      DD DSN=&DSNM2,DISP=OLD
//SYSOUT       DD SYSOUT=*
//SYSIN        DD DSN=&DATAC
//          PEND               //* END OF PROCEDURE 2
//*
//JSTEP1    EXEC INSTPRC1,DSNM1=MYDATA.URMI.INPUT1,
//          DATAC=MYDATA.BASE.LIB1(DATA1)
//*

В приведенном выше примере JCL вызывает процедуру INSTPRC1 в JSTEP1, а процедура INSTPRC2 вызывается в процедуре INSTPRC1. Здесь выходные данные INSTPRC1 (SORTOUT) передаются как входные данные (SORTIN) в INSTPRC2.

Оператор SET используется для определения часто используемых символов на этапах или процедурах задания. Он инициализирует предыдущие значения в символических именах. Это должно быть определено перед первым использованием символических имен в JCL.

Давайте посмотрим на описание ниже, чтобы понять немного больше о вышеупомянутой программе:

Параметр SET инициализирует DSNM1 = INPUT1 и DSNM2 = OUTPUT1.

Когда вызывается INSTPRC1 в JSTEP1 JCL, DSNM1 = MYDATA.URMI.INPUT1 и DSNM2 = OUTPUT1., Т.е. значение, инициализированное в операторе SET, сбрасывается со значением, установленным в любом из шагов / процедур задания.

Когда вызывается INSTPRC2 в STEP2 для INSTPRC1, DSNM1 = MYDATA.URMI.INPUT1 и DSNM2 = MYDATA.URMI.OUTPUT2.