开发手册 欢迎您!
软件开发者资料库

JCL - 程序

JCL程序 - 从概述,环境设置,JOB语句,Exec语句,DD语句,基础库,过程,条件作业处理,定义数据集,输入,输出,运行COBOL开始,以简单方便的步骤学习JCL(作业控制语言)程序,实用程序,排序技巧,常见问题解答。

JCL程序是JCL内部的一组语句,它们组合在一起以执行特定功能.通常,JCL的固定部分在程序中编码. Job的不同部分在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//PROC1EXEC PGM=SORT//SORTINDD DSN=&DSNAME,DISP=SHR//SORTOUTDD SYSOUT=*MYINCL//SYSOUTDD SYSOUT=*//SYSINDD 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值等)作为符号参数传递给过程.

编码符号参数时,请勿使用KEYWORDS,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,并在过程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.