JCL - 过程

JCL 过程是 JCL 内的一组语句,这些语句组合在一起以执行特定功能。 通常,JCL 的固定部分被编码在过程中。 作业的不同部分在 JCL 中进行编码。

您可以使用过程来实现使用多个输入文件的程序的并行执行。 可以为每个输入文件创建一个 JCL,并且可以通过将输入文件名作为符号参数传递来同时调用单个过程。

语法

以下是 JCL 过程定义的基本语法:

//*
//Step-name EXEC procedure name 

过程的内容保存在流内过程的 JCL 中。 内容保存在基础库的不同成员中,用于编目过程。 本章将解释 JCL 中可用的两种类型的过程,最后我们将了解如何嵌套各种过程。

Instream 过程

当过程在同一个 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 语句并不强制必须在编目过程中进行编码。 以下是调用 CATLPROC 过程的 JCL 示例:

//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。