【问题标题】:Invoking Rexx from JCL从 JCL 调用 Rexx
【发布时间】:2021-06-29 01:24:45
【问题描述】:

要调用 Rexx 程序并传递参数,可以使用 IKJEFT01

// SET PARM1=
// SET PARM2=
//AUDITDS  EXEC PGM=IKJEFT01,
//     PARM='RXPGM &PARM1 &PARM2'

但 PARM 支持的字符数有限。有没有办法使用 JCL 调用 REXX 并传递包含更多字符的参数? 使用 SYSTSIN 将是一个解决方案,但我想使用符号参数作为 PARM 参数中的参数。

【问题讨论】:

  • 一个参数要传递多长时间? PARM 字段可能很长,您可以继续到下一行。
  • 参数值(不是参数语法)似乎存在限制,在 rutime 使用符号变量进行扩展。我需要至少 120 个字符长度。但它将值限制在 94 左右。

标签: jcl rexx


【解决方案1】:

由于历史原因,PARM 字段限制为 100 字节,但是对于愿意调用 CEE3PR2 LE 可调用服务的启用 LE(语言环境)的应用程序,此限制增加到 32K。 LE 语言将是 Assembler(某些注意事项适用),以及现代版本的 COBOL 和 PL/I。据我所知,Rexx 不是支持 LE 的语言。

我工作的一个地方有一个通用程序,它将 PARM 值中传递的任何内容写入平面文件。我们的恰好是 Assembler,但它可能是 COBOL、PL/I 或 Rexx。

有关如何使用它的示例,请参阅 this answer

如果您的商店还没有这样的程序,我建议您创建这样的程序(并且请在编写自己的程序之前进行检查)。 Syncsort(或许还有DFSORT)能够将参数写入输出文件,所以你也可以走这条路。

假设能够将参数写入平面文件,您可以为每个参数调用一次,将结果修改为平面文件。然后将平面文件读入您​​的 Rexx 程序,每条记录代表您的一个参数。

更新:正如@BillWoodger 在评论中指出的那样,可以使用PARMDD DD...

使用 PARMDD 指定包含命令的数据集的 ddname 如果命令 parmstring 大于 100,则要执行的 parmstring 字符长度。

...避免了一次读取一条记录的参数。

另外,显然as of z/OS 2.1 you no longer need a program to place your parms into a dataset,您可以在处理 JCL 时让它们在流中解析。

【讨论】:

  • 我需要从符号变量构造参数,所以前面提到的 PRM2FILE 之类的解决方案很有用。顺便说一句,关于使用 DFSORT 实用程序实现它的任何想法
  • @cobp 我没有可用的 DFSORT,您可能想查看 DFSORT documentation。另外,我建议查看最后一个链接,从 z/OS 2.1 开始,您可以在流内数据中解析符号参数。
  • DFSORT 可以通过使用 JPn 特殊符号(JP0-JP9,总共 10 个)来处理 PARM 数据。查阅有关您的 DFSORT 版本的文档,该文档可从 IBM 在 Web 上获得。
【解决方案2】:

使用 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        

【讨论】:

【解决方案3】:

有两种选择

  1. 如果您希望 REXX 能够执行 TSO 命令,请使用 IKJEFT01 您不能将其用作外部 cobol/pl1 程序

  2. 您可以使用 PGM=IRXJCL 来执行 REXX 程序。 在 IRXJCL 下,您无法激活“ADDRESS TSO”并使用 Wr TSO 命令。 但是你可以从其他高级语言中调用它。

问题在于您无法将 REXX 的答案返回给调用程序。 另一个问题是您可以只使用一个字符串参数调用 REXX。

为了解决这个问题,我从 cobol 调用了 rexx。部分参数是地址。在 REXX 中,我使用 STORAGE 函数将输出放到地址

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多