如何在CICS与DB2环境下的COBOL程序中复用Copybook?
问题:如何在COBOL+CICS+DB2程序中复用包含CICS/DB2语句的Copybook
我正在学习COBOL、CICS和DB2技术,已开发一款实现伪事务CICS流程并与DB2交互的程序,该事务功能运行正常,但程序代码逐渐冗长。我想了解如何将包含CICS语句(EXEC CICS ...)、DB2语句或两者兼有的段落放入Copybook中实现复用。我已尝试使用COPY、INCLUDE甚至++INCLUDE语句,但均未成功。
原预处理、编译及链接JCL脚本
//COMPPRG JOB 'COMPGDB',CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1), // NOTIFY=&SYSUID //PLIB JCLLIB ORDER=(DFH510.CICS.SDFHPROC, // PROJECT.CICS.SOURCE, // PROJECT.CICS.LINK, // PROJECT.CICS.LOAD) //*--------------------------------------------------------------------- //*--------------- PRECOMPILATION DB2 ---------------------------------- //*--------------------------------------------------------------------- //PC EXEC PGM=DSNHPC, // PARM=('HOST(IBMCOB),APOST,XREF,DATE(ISO),NOSOURCE',''), // REGION=4096K //STEPLIB DD DISP=SHR,DSN=DSNA10.SDSNLOAD //SYSCIN DD DSN=&DSNHOUT,DISP=(MOD,PASS), // SPACE=(800,(500,500)),UNIT=SYSDA //SYSIN DD DISP=SHR,DSN=PROJECT.CICS.SOURCE(PROGCLI) //SYSLIB DD DISP=SHR,DSN=PROJECT.CICS.COPYBOOK //DBRMLIB DD DISP=SHR,DSN=PROJECT.CICS.DBRM(PROGCLI) //SYSPRINT DD SYSOUT=T //SYSTERM DD SYSOUT=T //SYSUDUMP DD SYSOUT=* //SYSUT1 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT2 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT3 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT4 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT5 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT6 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT7 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //*--------------------------------------------------------------------- //*--------------- TRADUCTEUR CICS ---------------------------------- //*--------------------------------------------------------------------- //TRN EXEC PGM=DFHECP1$, // PARM='COBOL3', // REGION=4M, // COND=(4,LT,PC) //STEPLIB DD DSN=DFH510.CICS.SDFHLOAD,DISP=SHR //SYSIN DD DSN=&DSNHOUT,DISP=(OLD,DELETE) //SYSPRINT DD SYSOUT=* //SYSPUNCH DD DSN=&SYSCIN, // DISP=(,PASS),UNIT=SYSDA, // DCB=BLKSIZE=400, // SPACE=(400,(400,100)) //*--------------------------------------------------------------------- //*--------------- COMPILATEUR COBOL ---------------------------------- //*--------------------------------------------------------------------- //COB EXEC PGM=IGYCRCTL,REGION=4M,COND=((4,LT,PC),(4,LT,TRN)), // PARM='NODYNAM,LIB,OBJECT,RES,APOST,MAP,XREF,NOSEQUENCE' //STEPLIB DD DSN=IGY420.SIGYCOMP,DISP=SHR //SYSLIB DD DSN=PROJECT.CICS.COPYBOOK,DISP=SHR // DD DSN=PROJECT.CICS.LINK,DISP=SHR // DD DSN=DFH510.CICS.SDFHCOB,DISP=SHR // DD DSN=DFH510.CICS.SDFHMAC,DISP=SHR // DD DSN=DFH510.CICS.SDFHSAMP,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSIN DD DSN=&SYSCIN,DISP=(OLD,DELETE) //SYSLIN DD DSN=&LOADSET,DISP=(MOD,PASS), // UNIT=SYSDA,SPACE=(80,(250,100)) //SYSUT1 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT2 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT3 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT4 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT5 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT6 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT7 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA
修改后的可行JCL脚本
尝试了@cschneid的建议后问题已解决,以下是更新后的脚本:
//COMPPRG JOB 'COMPGDB',CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1), // NOTIFY=&SYSUID //PLIB JCLLIB ORDER=(DFH510.CICS.SDFHPROC, // PROJECT.CICS.SOURCE, // PROJECT.CICS.LINK, // PROJECT.CICS.LOAD) //COB EXEC PGM=IGYCRCTL,REGION=4M, // PARM=('NODYNAM,LIB,OBJECT,RES,APOST,MAP,XREF,NOSEQUENCE,CICS,SQL') //STEPLIB DD DSN=IGY420.SIGYCOMP,DISP=SHR // DD DSN=DFH510.CICS.SDFHLOAD,DISP=SHR // DD DISP=SHR,DSN=DSNA10.SDSNLOAD //SYSLIB DD DSN=PROJECT.CICS.COPYBOOK,DISP=SHR // DD DSN=PROJECT.CICS.LINK,DISP=SHR // DD DSN=DFH510.CICS.SDFHCOB,DISP=SHR // DD DSN=DFH510.CICS.SDFHMAC,DISP=SHR // DD DSN=DFH510.CICS.SDFHSAMP,DISP=SHR //DBRMLIB DD DSN=PROJECT.CICS.DBRM(PROGCLI),DISP=SHR //SYSPRINT DD SYSOUT=* //SYSIN DD DSN=PROJECT.CICS.SOURCE(PROGCLI),DISP=SHR //SYSLIN DD DSN=&LOADSET,DISP=(MOD,PASS), // UNIT=SYSDA,SPACE=(80,(250,100)) //SYSUDUMP DD SYSOUT=* //SYSUT1 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT2 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT3 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT4 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT5 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT6 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT7 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT8 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT9 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT10 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT11 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT12 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT13 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT14 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //SYSUT15 DD SPACE=(800,(500,500),,,ROUND),UNIT=SYSDA //*--------------- LINKAGE PROG COBOL ------------------------------- //LKED EXEC PGM=IEWL,REGION=4M, // COND=(5,LT,COB), // PARM='LIST,XREF' //SYSLIB DD DSN=DFH510.CICS.SDFHLOAD,DISP=SHR // DD DSN=CEE.SCEELKED,DISP=SHR // DD DSN=DSNA10.SDSNLOAD,DISP=SHR // DD DSN=ISP.SISPLOAD,DISP=SHR // DD DSN=GDDM.SADMMOD,DISP=SHR // DD DSN=PROJECT.CICS.LOAD,DISP=SHR //DBRMLIB DD DISP=SHR,DSN=ZANKOC.CICS.DBRM(PROGCLI) //SYSLMOD DD DSN=PROJECT.CICS.LOAD(PROGCLI),DISP=SHR //SYSUT1 DD UNIT=SYSDA,DCB=BLKSIZE=1024,SPACE=(1024,(200,20)) //SYSPRINT DD SYSOUT=* //SYSLIN DD DSN=&LOADSET,DISP=(OLD,DELETE) // DD DDNAME=SYSIN //SYSIN DD DUMMY
关键修改说明
- 合并了DB2预编译、CICS翻译和COBOL编译步骤,直接在COBOL编译器参数中添加
CICS,SQL,让编译器直接处理两类语句 - 在COBOL编译步骤的STEPLIB中加入CICS和DB2的LOAD库,确保编译器能识别CICS/DB2语法
- 移除了单独的DB2预编译(PC)和CICS翻译(TRN)步骤,简化了编译流程
内容的提问来源于stack exchange,提问作者Hyppolite
相关产品推荐
相关产品推荐

