Процедуры 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.