- JCL 教程
- JCL 主页
- JCL - 概述
- JCL - 环境
- JCL - JOB 语句
- JCL - EXEC 语句
- JCL - DD 语句
- JCL - 基本库
- JCL - 过程
- JCL - 条件处理
- JCL - 定义数据集
- JCL - 输入/输出方法
- JCL - 运行 COBOL 程序
- JCL - 实用程序
- JCL - 基本排序技巧
- JCL 有用资源
- JCL - 常见问题解答
- JCL - 快速指南
- JCL - 有用资源
- JCL - 讨论
JCL - 过程
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) //*
在上面的示例中,过程 INSTPROC 在 STEP1 和 STEP2 中使用不同的输入文件调用。参数 DSNAME 和 DATAC 可以在调用过程时使用不同的值进行编码,这些被称为符号参数。JCL 的可变输入,例如文件名、数据卡、PARM 值等,作为符号参数传递给过程。
在编码符号参数时,请勿使用 KEYWORDS、PARAMETERS 或 SUB-PARAMETERS 作为符号名称。例如:不要使用 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,过程 INSTPRC2 在过程 INSTPRC1 中被调用。这里,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。