在 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 程序的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 JCL 将参数传递给 REXX 程序

当前日期参数未添加到 jcl 中的文件

将环境变量传递给大型机 JVM

使用 JZOS 工具包的 JCL 作业中所有 z/OS DD 语句的列表

使用条件逻辑验证 JCL

JCL,我需要将我的 VSAM 文件引入我的 cobol 使用的 DD 语句是啥