3

我有 JCL,它正在执行一个目录过程。在目录过程中,正在执行一个 COBOL-DB2 pgm。


下面是我的JCL

//A JOB (@),'CALL DB2',NOTIFY=&SYSUID
//JS010 EXEC TESTPROC

下面是我的 TESTPROC

//TESTPROC
//PS010 EXEC PGM=IKJEFT01,,DYNAMNBR=20
//STEPLIB DD DSN=TEST.LOADLIB,DISP=SHR
//SYSTSPRT DD SYSOUT=*                     
//SYSPRINT DD SYSOUT=*                     
//SYSUDUMP DD SYSOUT=*                     
//SYSTSIN  DD DSN=TEST.PDS(TESTPGM), 
//            DISP=SHR            
//SYSOUT DD SYSOUT=*

下面是我的 SYSTIN 数据 --TESTPGM

DSN SYSTEM(TEST)                    
RUN PROGRAM(TESTPGM) PLAN(TESTPLAN)
END 

我的问题是我可以在 SYSTIN 数据成员 TESTPGM 中使用符号参数代替 TESTPGM 和 TESTPLAN 吗?

问候,赛莎 :)

4

3 回答 3

4

如下所述,您可以让 PDS 成员名称成为一个符号值,然后定义 PDS 中的每个成员以指向不同的程序。以您的 JCL 为例:

//TESTPROC PROC MYPGM=
//PS010 EXEC PGM=IKJEFT01,,DYNAMNBR=20
//STEPLIB DD DSN=TEST.LOADLIB,DISP=SHR
//SYSTSPRT DD SYSOUT=*                     
//SYSPRINT DD SYSOUT=*                     
//SYSUDUMP DD SYSOUT=*                     
//SYSTSIN  DD DSN=TEST.PDS(&MYPGM), 
//            DISP=SHR            
//SYSOUT DD SYSOUT=*

在上面的示例中,您的 EXEC 语句将调用 proc:

//JS010 EXEC TESTPROC,MYPGM=TESTPGM

另一种选择,您可以直接覆盖 SYSTSIN DD,如下所示:

//A JOB (@),'CALL DB2',NOTIFY=&SYSUID
//JS010 EXEC TESTPROC
//PS010.SYSTSIN DD *
DSN SYSTEM(TEST)                    
RUN PROGRAM(TESTPGM) PLAN(TESTPLAN)
END
/*
//

另一个建议...在您的最终实现中,您可能需要考虑将

DSN SYSTEM(TEST)

来自

RUN PROGRAM(TESTPGM) PLAN(TESTPLAN)
END

原因是您可能会发现您想在多个 DB2 环境中运行该程序,而不仅仅是 SYSTEM(TEST)。为此,只需添加另一个参数 DB2SYS= 并进行如下修改:

//TESTPROC PROC DB2SYS=MYTEST,MYPGM=
...
//SYSTSIN  DD DSN=TEST.PDS(&DB2SYS),DISP=SHR
//         DD DSN=TEST.PDS(&MYPGM),DISP=SHR

其中 PDS 成员 MYTEST 已经编码了 DSN SYSTEM(TEST) 语句。

于 2011-09-23T13:24:03.923 回答
2

最简洁的答案是不。如果您的 SYSTSIN DD 语句引用的 PDS 中的控制卡中有符号参数,它们(符号参数)将不会被解析。

解决这个问题的一种方法是有一个单独的程序,在您的 PS010 步骤之前在您的过程中的一个单独步骤中执行,该程序接受参数和文本并写入一个临时文件。符号参数将在该程序的 PARM= 中解析。

//PS001    EXEC PGM=LOADPARM,PARM='DSN SYSTEM(&DSNSYS)'
//SYSPRINT DD  SYSOUT=*
//OUTPUT01 DD  DISP=(,PASS), 
//             DSN=&&DSNSYS, 
//             AVGREC=U, 
//             LRECL=80,  
//             RECFM=FB, 
//             SPACE=(80,1)
//****

假设的程序 LOADPARM 将简单地获取其输入参数并将其写入 OUTPUT01,注意在右侧用空格填充它。在 PS010 中,您将拥有一个看起来像...的 SYSTSIN

//SYSTSIN  DD  DISP=(OLD,DELETE),DSN=&&DSNSYS
//         DD  DISP=SHR,DSN=TEST.PDS(TESTPGM)

... TESTPGM 成员的样子...

RUN PROGRAM(TESTPGM) PLAN(TESTPLAN)
END

以这种方式,您的编目过程不知道它正在访问哪个 DB2 子系统。该信息通过 DSNSYS 符号参数在执行 JCL 中提供。

还有其他方法可以解决这个问题,例如,您可以有一个符号参数,它解析为共享 PDS 中的一个已知成员,每个 DB2 子系统有一个成员。

于 2011-09-23T12:01:33.013 回答
0

不,我们不能在 SYSTSIN 中使用符号参数。与其将 SYSTSIN 卡分成两部分并概括 DB2 子系统,我更愿意为该成员名称维护带有符号参数的单独测试数据卡,并在需要时对其进行切换。

但是自动化 DB2 子系统可能不会总是产生期望的值。无论如何,这是很好的努力。

于 2011-09-28T17:46:13.670 回答