使用 JCL 运行 COBOL 程序

编译COBOL程序

为了使用 JCL 以批处理模式执行 COBOL 程序,需要编译程序并创建包含所有子程序的加载模块。 JCL 使用加载模块而不是执行时的实际程序。 加载库在执行时使用 JCLLIBSTEPLIB 连接并提供给 JCL。

有许多大型机编译器实用程序可用于编译 COBOL 程序。 一些公司使用Endevor等变更管理工具,它编译并存储程序的每个版本。 这对于跟踪对程序所做的更改很有用。

//COMPILE   JOB ,CLASS=6,MSGCLASS=X,NOTIFY=&SYSUID             
//*            
//STEP1     EXEC IGYCRCTL,PARM=RMODE,DYNAM,SSRANGE
//SYSIN     DD DSN=MYDATA.URMI.SOURCES(MYCOBB),DISP=SHR
//SYSLIB    DD DSN=MYDATA.URMI.COPYBOOK(MYCOPY),DISP=SHR
//SYSLMOD   DD DSN=MYDATA.URMI.LOAD(MYCOBB),DISP=SHR
//SYSPRINT  DD SYSOUT=*
//*

IGYCRCTL 是一个 IBM COBOL 编译器实用程序。 编译器选项使用 PARM 参数传递。 在上面的例子中,RMODE指示编译器在程序中使用相对寻址模式。 COBOL程序是使用SYSIN参数传递的,copybook是SYSLIB中程序使用的库。

此 JCL 生成程序的加载模块作为输出,该输出用作执行 JCL 的输入。

运行 COBOL 程序

在下面的 JCL 示例中,使用输入文件 MYDATA.URMI.INPUT 执行程序 MYPROG,并生成两个写入到假脱机的输出文件。

//COBBSTEP  JOB CLASS=6,NOTIFY=&SYSUID
//
//STEP10    EXEC PGM=MYPROG,PARM=ACCT5000
//STEPLIB   DD DSN=MYDATA.URMI.LOADLIB,DISP=SHR
//INPUT1    DD DSN=MYDATA.URMI.INPUT,DISP=SHR
//OUT1      DD SYSOUT=*
//OUT2      DD SYSOUT=*
//SYSIN     DD *
//CUST1     1000
//CUST2     1001
/*

MYPROG的加载模块位于MYDATA.URMI.LOADLIB中。 值得注意的是,上述 JCL 只能用于非 DB2 COBOL 模块。

将数据传递给 COBOL 程序

COBOL批处理程序的数据输入可以通过文件、PARAM参数和SYSIN DD语句的方式进行。 在上面的例子中:

  • 数据记录通过文件 MYDATA.URMI.INPUT 传递到 MYPROG。 该文件将在程序中使用 DD 名称 INPUT1 引用。 该文件可以在程序中打开、读取和关闭。

  • PARM 参数数据 ACCT5000 在程序 MYPROG 的 LINKAGE 部分中接收到该部分中定义的变量中。

  • SYSIN 语句中的数据是通过程序的 PROCEDURE 部分中的 ACCEPT 语句接收的。 每个 ACCEPT 语句都会将一整条记录(即 CUST1 1000)读取到程序中定义的工作存储变量中。

运行 COBOL-DB2 程序

为了运行COBOL DB2程序,JCL和程序中使用了专门的IBM实用程序; DB2 区域和所需参数作为输入传递到实用程序。

运行 COBOL-DB2 程序时遵循以下步骤:

  • 编译 COBOL-DB2 程序时,会与加载模块一起创建 DBRM(数据库请求模块)。 DBRM 包含 COBOL 程序的 SQL 语句,并检查其语法是否正确。

  • DBRM 绑定到 COBOL 将在其中运行的 DB2 区域(环境)。 这可以使用 JCL 中的 IKJEFT01 实用程序来完成。

  • 绑定步骤之后,COBOL-DB2 程序(再次)使用 IKJEFT01 运行,并将加载库和 DBRM 库作为 JCL 的输入。

//STEP001  EXEC PGM=IKJEFT01
//*
//STEPLIB  DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR
//*
//input files
//output files
//SYSPRINT DD SYSOUT=*
//SYSABOUT DD SYSOUT=*
//SYSDBOUT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//DISPLAY  DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN  DD *
    DSN SYSTEM(SSID)
    RUN PROGRAM(MYCOBB) PLAN(PLANNAME) PARM(parameters to cobol program) -
    LIB('MYDATA.URMI.LOADLIB')
    END
/*

在上面的示例中,MYCOBB 是使用 IKJEFT01 运行的 COBOL-DB2 程序。 请注意,程序名称、DB2 子系统 ID (SSID)、DB2 计划名称是在 SYSTSIN DD 语句中传递的。 DBRM 库在 STEPLIB 中指定。