在 EXEC 语句中使用 JCL PARM= 将参数传递给 COBOL 程序
Posted
技术标签:
【中文标题】在 EXEC 语句中使用 JCL PARM= 将参数传递给 COBOL 程序【英文标题】:Issue passing parameters to a COBOL program using JCL PARM= on the EXEC statement 【发布时间】:2020-12-04 22:10:40 【问题描述】:我编写了这个简单的代码来打印我通过 JCL 传递的参数,为什么它不打印参数?
代码:
CBL APOST
IDENTIFICATION DIVISION.
PROGRAM-ID. GETAPIT.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
DATA DIVISION.
WORKING-STORAGE SECTION.
LINKAGE SECTION.
01 PARM-BUFFER.
05 PARM-LENGTH PIC S9(4) COMP.
05 PARM-DATA.
10 numb PIC X(6).
10 filler PIC X(250).
PROCEDURE DIVISION using PARM-BUFFER.
MAINLINE SECTION.
DISPLAY "NUMB: " numb of PARM-DATA.
MAINLINE-EXIT.
GOBACK.
//MVSSYNSQ JOB (3911),'&SYSUID',CLASS=F,MSGCLASS=R,NOTIFY=&SYSUID
/*JOBPARM R=51,L=100
//*
//GETAPI1 EXEC PGM=GETAPIT,PARM='000100'
//STEPLIB DD DISP=SHR,DSN=MVJE.ZCONN.LOADLIB
//SYSPRINT DD SYSOUT=*
OUTPUT:
********************************* TOP OF DATA
NUMB:
【问题讨论】:
你的 JCL 长什么样,程序做了什么(也许你根本看不到输出)? 只打印我正在传递的参数 STEP EXEC PGM,PARM='000100' 你能提供你的 JCL 和你的输出吗? 阅读“我有 JCL”和“我看到输出”很有趣——但如果你不显示这些,我们只能猜测而不是确定的答案。将缺失的信息添加到您的问题中,我们可能会提供答案... @Simon Sobisch:numb
是一个定义为PIC X(6)
的字符字段。您将其与字段 PARM-LENGTH
混为一谈。但即使这个字段也会以字符格式显示为可读数字(负数除外)。来自 IBM Enterprise Cobol 手册的“DISPLAY”语句部分:如果 identifier-1 是二进制、内部十进制或内部浮点数据项,则 identifier-1 会自动转换为外部格式,如下所示: v 二进制和内部十进制项目转换为分区十进制。负符号值会导致低阶符号过冲。.
【参考方案1】:
当我编译没有 CICS 集成器选项的 COBOL 程序时,它对我有用。
【讨论】:
【参考方案2】:使用您的测试程序和另一个 DISPLAY 来打印参数的长度。
CBL APOST
IDENTIFICATION DIVISION.
PROGRAM-ID. GETAPIT.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
DATA DIVISION.
WORKING-STORAGE SECTION.
LINKAGE SECTION.
01 PARM-BUFFER.
05 PARM-LENGTH PIC S9(4) COMP.
05 PARM-DATA.
10 numb PIC X(6).
10 filler PIC X(250).
PROCEDURE DIVISION using PARM-BUFFER.
MAINLINE SECTION.
DISPLAY "LENGTH: " PARM-LENGTH.
DISPLAY "NUMB: " numb of PARM-DATA.
MAINLINE-EXIT.
GOBACK.
使用 PARM='12345' 的参数,我得到了这个输出。
长度:0005 号码:12345
请注意,我使用了 SYSOUT
而不是 SYSPRINT
DD 语句,这是您在 JCL 中的内容。
//SYSOUT DD SYSOUT=*
据我所知,DISPLAY 默认为STDOUT
,在JCL
中为SYSOUT
。
来自z/OS COBOL Programming Guide 的关于DISPLAY
的另一条评论
要将数据写入系统逻辑输出设备,可以省略 UPON 子句或将 UPON 子句与目标 SYSOUT 一起使用。
在 sysout 时显示“Hello”。复制代码输出被定向到 您在 OUTDD 编译器选项中指定的 ddname。您可以指定 分层文件系统中具有此 ddname 的文件。
如果未分配 OUTDD ddname 并且您未在 z/OS UNIX 环境,分配一个默认 DD SYSOUT=*。如果 未分配 OUTDD ddname 并且您正在 z/OS UNIX 中运行 环境,_IGZ_SYSOUT 环境变量使用如下:
未定义或设置为标准输出输出被路由到标准输出(文件描述符 1)。设置为 stderr 输出被路由到 stderr(文件描述符 2)。 否则(设置为 stdout 或 stderr 以外的其他内容) 声明失败;严重程度为 3 的语言环境条件是 提高。当 DISPLAY 输出被路由到 stdout 或 stderr 时,输出 不细分为记录。输出写为单个 没有换行符的字符流。
如果 OUTDD 和语言环境运行时选项 MSGFILE 指定 相同的 ddname,DISPLAY 输出和语言环境运行时 诊断被路由到语言环境消息文件。
【讨论】:
以上是关于在 EXEC 语句中使用 JCL PARM= 将参数传递给 COBOL 程序的主要内容,如果未能解决你的问题,请参考以下文章