要调用 Rexx 程序并传递参数,可以使用 IKJEFT01
// SET PARM1=
// SET PARM2=
//AUDITDS EXEC PGM=IKJEFT01,
// PARM='RXPGM &PARM1 &PARM2'
但 PARM 支持有限数量的字符。有没有办法使用 JCL 调用 REXX 并传递包含更多字符的参数?使用 SYSTSIN 将是一个解决方案,但我想使用符号参数作为 PARM 参数中的参数。
CEE3PR2
由于历史原因,PARM 字段限制为 100 字节,但是对于愿意调用LE 可调用服务的启用 LE(语言环境)的应用程序,此限制增加到 32K 。LE 语言将是 Assembler(某些注意事项适用),以及现代版本的 COBOL 和 PL/I。据我所知,Rexx 不是支持 LE 的语言。
我工作的一个地方有一个通用程序,可以将 PARM 值中传递的任何内容写入平面文件。我们碰巧是 Assembler,但它可能是 COBOL、PL/I 或 Rexx。
有关如何使用它的示例,请参阅此答案。
如果您的商店还没有这样的程序,我建议您创建这样的程序(并且请在编写自己的程序之前进行检查)。Syncsort
(也许DFSORT
)有能力将参数写入输出文件,所以你也可以走这条路。
假设能够将参数写入平面文件,您可以为每个参数调用一次,将结果修改为平面文件。然后将平面文件读入您的 Rexx 程序,每条记录代表您的一个参数。
更新:正如@BillWoodger 在评论中指出的那样,可以使用PARMDD DD...
如果命令 parmstring 的长度超过 100 个字符,则使用 PARMDD 指定包含要执行的命令 parmstring 的数据集的 ddname。
...这消除了一次读取一条记录的参数的需要。
此外,显然从 z/OS 2.1 开始,您不再需要将参数放入数据集的程序,您可以在处理 JCL 时让它们在流中解析。
有2个选项
如果您希望 REXX 能够执行 TSO 命令,请使用 IKJEFT01 您不能将其用作外部 cobol/pl1 程序
您可以使用 PGM=IRXJCL 来执行 REXX 程序。在 IRXJCL 下,您无法激活“ADDRESS TSO”并使用 Wr TSO 命令。但是您可以从其他高级语言调用它。
问题是您无法将 REXX 的答案返回给调用程序。另一个问题是您只能使用一个字符串参数调用 REXX。
为了解决这个问题,我从 cobol 调用了 rexx。部分参数是地址。在 REXX 中,我使用 STORAGE 函数将输出放到地址
有两种使用 IKJEFT01 调用 REXX 脚本的方法。一种是像你现在一样使用 parm,另一种是使用 SYSTSIN 数据集。这是我的首选方法,您可以使用 + 继续符将长参数继续到下一行。例如,下面是使用带有延续的长参数 zFS 文件名调用 BPXBATCH 的示例。
//FORWARD EXEC PGM=IKJEFT01,REGION=0M
//SYSPRINT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//STDOUT DD SYSOUT=*
//STDERR DD SYSOUT=*
//SYSTSIN DD *
BPXBATCH SH sftp -b /u/bigdata/doc/hadoop.sftp -oPort=8022 biadmin@biad+
min