📅  最后修改于: 2020-11-22 17:04:10             🧑  作者: Mango
JCL过程是JCL内部的一组语句,这些语句组合在一起以执行特定函数。通常,JCL的固定部分是在过程中编码的。作业的不同部分在JCL中编码。
您可以使用一个过程来使用多个输入文件来并行执行程序。可以为每个输入文件创建一个JCL,并且可以通过将输入文件名作为符号参数传递来同时调用单个过程。
以下是JCL过程定义的基本语法:
//*
//Step-name EXEC procedure name
该过程的内容保存在JCL中以进行流内过程。内容保存在基本库的其他成员中,用于编目过程。本章将解释JCL中可用的两种类型的过程,然后最后我们将看到如何嵌套各种过程。
当该过程在同一JCL成员编码时,称为流内过程。它应该以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)
//*
在上面的示例中,使用不同的输入文件在STEP1和STEP2中调用了INSTPROC过程。参数DSNAME和DATAC可以在调用过程时用不同的值编码,这些被称为符号参数。 JCL的不同输入(例如文件名,数据卡,PARM值等)作为符号参数传递给过程。
在对符号参数进行编码时,请勿将关键字,参数或子参数用作符号名称。示例:不要使用TIME =&TIME,但是可以使用TIME =&TM,它被认为是编码符号的正确方法。
用户定义的符号参数称为JCL符号。有些符号称为系统符号,用于登录作业执行。普通用户在批处理作业中使用的唯一系统符号是&SYSUID,并且在JOB语句的NOTIFY参数中使用。
当该过程与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个级别。嵌套可以完全在流内或分类。我们无法在分类过程中编写流内过程的代码。
//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在JSTEP1中调用了过程INSTPRC1,而在过程INSTPRC1中正在调用过程INSTPRC2。此处,INSTPRC1的输出(SORTOUT)作为输入(SORTIN)传递到INSTPRC2。
SET语句用于定义跨作业步骤或过程的常用符号。它初始化符号名称中的先前值。必须在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。