我们可以在编目程序中使用的PDS成员中添加符号参数吗?

时间:2011-09-23 09:22:57

标签: mainframe jcl

我有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?

此致 Saisha:)

3 个答案:

答案 0 :(得分: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)语句。

答案 1 :(得分: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将简单地取其输入parm并将其写入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子系统。该信息在执行JCL中提供DSNSYS符号参数。

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

答案 2 :(得分:0)

不,我们不能使用SYSTSIN中的符号参数。而不是将SYSTSIN卡分成两部分并推广DB2子系统,我更喜欢使用该成员名称的符号参数维护单独的测试数据,并在需要时切换它。

但是,DB2子系统的自动化可能不会始终产生所需的值。无论如何都做了很好的努力。