从JCL调用Rexx

3
要调用一个Rexx程序并传递参数,可以使用IKJEFT01。
// SET PARM1=
// SET PARM2=
//AUDITDS  EXEC PGM=IKJEFT01,
//     PARM='RXPGM &PARM1 &PARM2'

但是PARM只支持有限数量的字符。是否有办法通过JCL调用REXX并传递包含更多字符的参数?使用SYSTSIN可能是一种解决方案,但我想使用与PARM参数类似的符号参数。


你想传递多长的参数?PARM字段可以相当长,你可以将其延续到下一行。 - Steve Ives
1
限制似乎存在于参数值(而非参数语法),在运行时使用符号变量扩展。我需要至少120个字符长度,但它限制在94左右的值。 - cobp
3个回答

4
由于历史原因,PARM字段被限制为100个字节,但对于愿意调用CEE3PR2 LE可调用服务的LE(语言环境)启用应用程序,此限制增加到32K。LE语言将是汇编语言(某些注意事项适用),以及现代版本的COBOL和PL/I。据我所知,Rexx不是一种LE启用的语言。
我曾经工作的一个地方有一个通用程序,可以将传递给PARM值写入平面文件。我们的程序碰巧是汇编语言,但它也可以是COBOL、PL/I或Rexx。
请参见this answer,了解如何使用示例。
如果您的商店还没有这样的程序,请建议您创建一个(在编写自己的程序之前,请务必检查)。Syncsort(可能还有DFSORT)具有将parm写入输出文件的功能,因此您也可以选择该路线。
假设您有能力将参数写入平面文件,您可以为每个参数调用它一次,并将结果MOD到平面文件中。然后将平面文件读入您的Rexx程序,每个记录代表一个参数。
更新:正如@BillWoodger在评论中指出的那样,可以使用PARMDD DD...
引用: 使用PARMDD指定包含要执行的命令parmstring的数据集的ddname,如果命令parmstring的长度超过100个字符。
这消除了逐条读取参数的需要。
此外,显然从z/OS 2.1开始,您不再需要程序将参数放入数据集中,您可以在处理JCL时在流中解决它们。

3
https://www.ibm.com/support/knowledgecenter/SSLTBW_2.1.0/com.ibm.zos.v2r1.ikjc200/jcl_exec.htm - Bill Woodger
我需要从符号变量构建参数,因此像PRM2FILE这样的解决方案非常有用。顺便问一下,您有没有关于使用DFSORT实用程序实现它的任何想法? - cobp
@cobp 我没有可用的DFSORT,你可能需要查看DFSORT文档。此外,我建议您查看最后一个链接,在z/OS 2.1中,您可以在流数据中解析符号参数。 - cschneid
DFSORT可以通过使用JPn特殊符号(JP0-JP9,共10个)来处理PARM数据。请查阅IBM网站上您所使用的DFSORT版本的文档以获取更多信息。 - Bill Woodger

2

使用IKJEFT01调用REXX脚本有两种方法。一种是像您目前正在做的那样使用parm,另一种是使用SYSTSIN数据集。那是我首选的方法,您可以使用+续行字符将长参数延续到下一行。例如,以下是使用延续字符调用BPXBATCH并传递长参数zFS文件名的示例。

//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        

从z/OS 2.1版本开始,你可以使用SYMBOLS=JCLONLY参数在instream JCL中使用符号。详情请参考:https://www.ibm.com/support/knowledgecenter/SSLTBW_2.1.0/com.ibm.zos.v2r1.ieab600/xddsymbols.htm - David Crayford

1

有两个选项

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

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接