首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >主机Jcl proc

主机Jcl proc
EN

Stack Overflow用户
提问于 2022-12-02 19:58:16
回答 1查看 53关注 0票数 -1

我对如何处理proc的rc有疑问。假设

代码语言:javascript
复制
//STEP1    EXEC PROC=BANKEMP

如何使用“如果其他.pls提供语法”处理此步骤返回的代码。

EN

回答 1

Stack Overflow用户

发布于 2022-12-03 13:34:50

z/OS MVS JCL

IF /IF/ The / ENDIF语句

在"z/OS引用“(第IF/IF/ELSE/ENDIF语句构造章)中描述了z/OS / are /OS语句。这些语句可用于测试先前执行的步骤的终止结果。

从z/OS的角度来看,如果以下情况下,已成功完成

  1. 它真的被运行了
  2. 它有而不是 ABENDed,即程序很可能已经终止并设置了返回代码。请注意,返回代码值对此决定并不重要。

如果存在由系统强制执行的ABEND,即完成代码为"Shhh“形式( hhh为三个十六进制数字),或由程序发出,即完成代码为”dddd“(dddd为四位小数位),则该步骤被视为已结束unsuccessfully.。

测试成功的步骤执行的结果

基本上,您可以针对之前所有步骤的最高返回代码(实际上已经运行了)进行测试,也可以针对实际执行了单个步骤的特定返回代码进行测试。针对由于IF语句而未运行的步骤进行测试,始终返回FALSE (该步骤在作业日志中标记为“刷新”)。

如果在编写IF语句时不引用步骤或过程步骤,则可以根据迄今为止最高的返回代码进行测试:

代码语言:javascript
复制
//IF01     IF   RC EQ 5 THEN

如果要测试特定步骤的返回代码,则需要对步骤名或过程步骤名和步骤名进行编码。

代码语言:javascript
复制
//IF01     IF   STEP01.RC EQ 5 THEN

代码语言:javascript
复制
//IF01     IF   STEP01.PROCST02.RC EQ 5 THEN

注意:您不能引用EXEC PROC=语句,因为该语句不会执行程序,而只是将JCL语句从过程复制到当前作业中。只有EXEC PGM=语句执行程序,只有程序设置返回代码。

针对ABENDs进行测试,或步骤是否已运行或未运行

因此,您可以使用关键字ABEND¬ABENDABENDCCRUN¬RUN来测试这些步骤结束状态。有关更多细节,请参见上面的手册。

使用返回码的示例演示

这里是一个示例JCL过程,您可以使用它来处理返回代码。请注意,第一步创建了一个小的REXX过程,该过程将由以下步骤调用,以设置特定的返回代码。将此过程复制到JCL库中的一个成员,并将其命名为RCTEST

代码语言:javascript
复制
//RCTEST   PROC PROCRC01='0004',PROCRC02='0008'                
//*
//*---------------------------------------------------------   
//*                                                            
//PROCST00 EXEC PGM=IEBGENER                                   
//SYSPRINT DD   DUMMY                                          
//SYSIN    DD   DUMMY                                          
//SYSUT1   DD   *,DLM=##                                       
/* REXX */                                                     
                                                               
/* Test if PARM is a whole number between 0 and 4095 */        
/* If true, set RC to that value, else set RC=12     */        
if datatype( arg(1), "W" )                                     
then do                                                        
  if arg(1) >= 0  &  arg(1) < 4096                             
  then RC = arg(1)                                             
  else RC = 12                                                 
  end                                                          
else RC = 12                                                   
                                                               
exit RC                                                        
##                                                             
//SYSUT2   DD   DISP=(NEW,PASS),DSN=&&REXX(SETCODE),           
//         RECFM=FB,LRECL=80,SPACE=(1,(1,,1)),AVGREC=K         
//*                                                            
//*---------------------------------------------------------   
//*                                                            
//PROCST01 EXEC PGM=IKJEFT1A,PARM='%SETCODE &PROCRC01'         
//SYSTSPRT DD   DUMMY                                          
//SYSTSIN  DD   DUMMY                                          
//SYSEXEC  DD   DISP=(OLD,PASS),DSN=&&REXX                     
//*                                                            
//*---------------------------------------------------------   
//*                                                            
//PRIF01   IF   PROCST01.RC GT 0 THEN                          
//*                                                            
//PROCST02 EXEC PGM=IKJEFT1A,PARM='%SETCODE &PROCRC02'         
//SYSTSPRT DD   DUMMY                                          
//SYSTSIN  DD   DUMMY                                          
//SYSEXEC  DD   DISP=(OLD,PASS),DSN=&&REXX                     
//*                                                            
//PRIF01E  ENDIF                                               

编写这样的作业以调用过程,并通过PROCRC01=PROCRC02=EXEC语句上指定所需的返回代码。请注意,您需要使用JCL库的名称来调整JCLLIB (您将过程复制到的库中)。

代码语言:javascript
复制
//jobname    JOB ....
//***************************************************/       
//*                                                          
//         JCLLIB ORDER=your.jcl.library
//*                                                          
//***************************************************/       
//*                                                          
//STEP00    EXEC RCTEST,PROCRC01='0004',PROCRC02='0006'      
//*                                                          
//IF01      IF STEP00.PROCST01.RC EQ 4 THEN                  
//STEP01    EXEC PGM=IEFBR14                                 
//IF01      ENDIF                                            
//*                                                          
//IF02      IF RC EQ 4 THEN                                  
//STEP02    EXEC PGM=IEFBR14                                 
//IF02      ENDIF                                            
//*                                                          
//IF03      IF RC NE 0 THEN                                  
//STEP03    EXEC PGM=IEFBR14                                 
//IF03      ENDIF                                            
//*                                                          
//*                                                          
//IF04      IF RC EQ 0 THEN                                  
//STEP04    EXEC PGM=IEFBR14                                 
//IF04      ENDIF                                            
//*                                                          

如果要在过程之外处理返回代码,可以简单地将第一步从过程(PROCST01)复制到工作中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74660904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档