程序( Procedures)
JCL Procedures是JCL Procedures内部的一组语句,它们组合在一起以执行特定的功能。 通常,JCL的固定部分在程序中编码。 Job的变化部分在JCL中编码。
您可以使用过程来使用多个输入文件来实现程序的并行执行。 可以为每个输入文件创建JCL,并且可以通过将输入文件名作为符号参数传递来同时调用单个过程。
语法 (Syntax)
以下是JCL过程定义的基本语法:
//*
//<i>Step-name</i> <b>EXEC</b> <i>procedure name</i>
该过程的内容保存在JCL内,用于流程过程。 内容保存在基本库的不同成员中,用于编目过程。 本章将解释JCL中可用的两种类型的过程,最后我们将看到如何嵌套各种过程。
流程程序
当过程在同一个JCL成员中编码时,它被称为“插入过程”。 它应该以PROC语句开头,并以PEND语句结束。
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//INSTPROC <b>PROC</b> //*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
// <b>PEND</b> //*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)
//*
在上面的示例中,使用不同的输入文件在STEP1和STEP2中调用过程INSTPROC。 在调用过程时,参数DSNAME和DATAC可以用不同的值编码,这些symbolic parameters被称为symbolic parameters 。 JCL的变化输入(例如文件名,数据卡,PARM值等)作为符号参数传递给过程。
编码符号参数时,请勿使用KEYWORDS,PARAMETERS或SUB-PARAMETERS作为符号名称。 示例:不要使用TIME =&TIME但是可以使用TIME =&TM,它被认为是编码符号的正确方法。
用户定义的符号参数称为JCL Symbols 。 有一些称为system symbols ,用于登录作业执行。 普通用户在批处理作业中使用的唯一系统符号是&SYSUID ,这在JOB语句的NOTIFY参数中使用。
编目程序
当过程从JCL中分离出来并在不同的数据存储中编码时,它称为“已Cataloged Procedure 。 PROC语句不是必须在编目过程中编码。 以下是JCL的示例,它调用CATLPROC过程:
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//STEP EXEC <b>CATLPROC</b>,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT
// DATAC=MYDATA.BASE.LIB1(DATA1)
这里,程序CATLPROC在MYCOBOL.BASE.LIB1中编目。 PROG,DATAC和DSNAME作为符号参数传递给过程CATLPROC。
//CATLPROC <b>PROC</b> 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。
嵌套程序
从过程中调用过程称为nested procedure 。 程序最多可嵌套15个级别。 嵌套可以完全插入或编目。 我们无法在编目过程中编写一个instream过程。
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//SETNM SET DSNM1=INPUT1,DSNM2=OUTPUT1
//INSTPRC1 <b>PROC</b> //* 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 <b>PROC=INSTPRC2</b>,DSNM2=MYDATA.URMI.OUTPUT2
// <b>PEND</b> //* END OF PROCEDURE 1
//*
//INSTPRC2 <b>PROC</b> //* 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
// <b>PEND</b> //* END OF PROCEDURE 2
//*
//JSTEP1 EXEC INSTPRC1,DSNM1=MYDATA.URMI.INPUT1,
// DATAC=MYDATA.BASE.LIB1(DATA1)
//*
在上面的示例中,JCL在JSTEP1中调用过程INSTPRC1,并在过程INSTPRC1中调用过程INSTPRC2。 这里,INSTPRC1(SORTOUT)的输出作为输入(SORTIN)传递给INSTPRC2。
SET statement用于定义作业步骤或过程中常用的符号。 它初始化符号名称中的先前值。 它必须在JCL中第一次使用符号名称之前定义。
让我们看一下下面的描述,以便更多地了解上述程序:
SET参数初始化DSNM1 = INPUT1和DSNM2 = OUTPUT1。
当在JCL的JSTEP1中调用INSTPRC1时,DSNM1 = MYDATA.URMI.INPUT1和DSNM2 = OUTPUT1。,即,在SET语句中初始化的值将使用在任何作业步骤/过程中设置的值重置。
在INSTPRC1的STEP2中调用INSTPRC2时,DSNM1 = MYDATA.URMI.INPUT1和DSNM2 = MYDATA.URMI.OUTPUT2。