2

我有一个要求,我需要检查 VSAM 文件是否存在。如果它不存在,那么我需要像 TEST.FILE2 一样创建它。我的 JCL 是:

//STEP01   EXEC PGM=IDCAMS                           
//SYSPRINT DD  SYSOUT=*                              
//SYSIN    DD  *                                     
  LISTCAT ENTRIES('BRTEST.FILE1') 
/*                                                   
//STEP02 EXEC PGM=IEFBR14,COND=(4,GT)                
//DD01     DD DSN=BRTEST.FILE1,   
//            DISP=(,CATLG,DELETE),                  
//            LIKE=BRTEST.FILE2
//SYSPRINT DD  SYSOUT=*                              
//SYSOUT   DD  SYSOUT=*                    

但奇怪的事情正在发生。每当我执行此 JCL 时,STEP001 将返回代码为 004,即使该文件已经存在,并且在 STEP02 中创建一个新文件。因此,如果我两次提交此 JCL,则两次都会创建一个新文件。我无法理解文件是如何被删除的。奇怪的是,如果我在没有 STEP02 的情况下运行 JCL,那么它会将 MAXCC 显示为 0,表示该文件已在目录中找到。

我能够通过以下代码实现我的要求,但仍然想了解为什么以及如何为 LISTCAT 删除我的 VSAM 文件。

//STEP02 EXEC PGM=IEFBR14,COND=(4,GT)                
//DD01     DD DSN=BRTEST.FILE1,   
//            DISP=(MOD,CATLG,CATLG),                  
//            LIKE=BRTEST.FILE2
//SYSPRINT DD  SYSOUT=*                              
//SYSOUT   DD  SYSOUT=*  

这是仅执行 STEP01 时的 SYSPRINT:

IDCAMS  SYSTEM SERVICES                                           TIME: 03:47:44

  LISTCAT ENTRIES('BRTEST.FILE1')                                               
CLUSTER ------- BRTEST.FILE1                                                    
     IN-CAT --- CATALOG.TEST03                                                  
   DATA ------- BRTEST.FILE1.DATA                                               
     IN-CAT --- CATALOG.TEST03                                                  
   INDEX ------ BRTEST.FILE1.INDEX                                              
     IN-CAT --- CATALOG.TEST03                                                  
IDCAMS  SYSTEM SERVICES                                           TIME: 03:47:44
         THE NUMBER OF ENTRIES PROCESSED WAS:                                   
                   AIX -------------------0                                     
                   ALIAS -----------------0                                     
                   CLUSTER ---------------1                                     
                   DATA ------------------1                                     
                   GDG -------------------0                                     
                   INDEX -----------------1                                     
                   NONVSAM ---------------0                                     
                   PAGESPACE -------------0                                     
                   PATH ------------------0                                     
                   SPACE -----------------0                                     
                   USERCATALOG -----------0                                     
                   TAPELIBRARY -----------0                                     
                   TAPEVOLUME ------------0                                     
                   TOTAL -----------------3                                     
         THE NUMBER OF PROTECTED ENTRIES SUPPRESSED WAS 0                       
IDC0001I FUNCTION COMPLETED, HIGHEST CONDITION CODE WAS 0                       

IDC0002I IDCAMS PROCESSING COMPLETE. MAXIMUM CONDITION CODE WAS 0 

当两个步骤都执行时:

IDCAMS  SYSTEM SERVICES                                           TIME: 03:48:35

  LISTCAT ENTRIES('BRTEST.FILE1')                                               
IDC3012I ENTRY BRTEST.FILE1 NOT FOUND                                           
IDC3009I ** VSAM CATALOG RETURN CODE IS 8 - REASON CODE IS IGG0CLEG-42          
IDC1566I ** BRTEST.FILE1 NOT LISTED                                             
IDCAMS  SYSTEM SERVICES                                           TIME: 03:48:35
         THE NUMBER OF ENTRIES PROCESSED WAS:                                   
                   AIX -------------------0                                     
                   ALIAS -----------------0                                     
                   CLUSTER ---------------0                                     
                   DATA ------------------0                                     
                   GDG -------------------0                                     
                   INDEX -----------------0                                     
                   NONVSAM ---------------0                                     
                   PAGESPACE -------------0                                     
                   PATH ------------------0                                     
                   SPACE -----------------0                                     
                   USERCATALOG -----------0                                     
                   TAPELIBRARY -----------0                                     
                   TAPEVOLUME ------------0                                     
                   TOTAL -----------------0                                     
         THE NUMBER OF PROTECTED ENTRIES SUPPRESSED WAS 0                       
IDC0001I FUNCTION COMPLETED, HIGHEST CONDITION CODE WAS 4                       

IDC0002I IDCAMS PROCESSING COMPLETE. MAXIMUM CONDITION CODE WAS 4               

ZOS390RL 变量的值是 z/OS 02.01.00,ZENVIR 是 ISPF 7.1MVS TSO。

4

2 回答 2

1

可能会给你一个答案。没有想到它,因为它是一个 VSAM 数据集,而且你尝试这样做的方式是不寻常的(对我来说)。

有/曾经有一个产品叫UCC11。我认为它现在由 Computer Associates 销售,并称为 CA-11(或类似名称)。我认为您在您的网站上使用此产品或类似产品。

如果在 JOB 开始时执行,它将查找指定为 NEW 和 CATLG 的文件,并查看目录中是否存在同名文件。如果有,现有文件将被删除。

这将消除删除此类文件的初始 IEFBR14 步骤的需要。

我认为您正在使用此产品或类似产品。您的文件在存在时会被自动删除,因此产品不知道从文件中读取数据的 IDCAMS 步骤(即使它是 SYSIN 和 DD *),因此您的 VSAM 文件在 IDCAMS 步骤之前被删除跑。

将文件更改为 MOD 作为初始配置(MOD 将添加到现有文件并在不存在时创建新文件)不会导致此类产品删除该文件。

对 VSAM 文件使用 LIKE 不会从模型数据集中获得 CA-size 和 CI-SIZE。您将获得这些的默认值,这很可能会影响程序的性能。在 JCL 中定义 VSAM 文件时不能指定这些值。您也不会从模型数据集中获取缓冲区值,但您可以在 JCL 中单独指定这些值(您没有)。

以下是 LIKE 为您所做的说明:http: //publibfp.dhe.ibm.com/cgi-bin/bookmgr/BOOKS/iea2b680/12.40 ?DT=20080604022956

以下属性从模型数据集复制到新数据集:

Data set organization
    Record organization (RECORG) or
    Record format (RECFM) 
Record length (LRECL)
Key length (KEYLEN)
Key offset (KEYOFF)
Type, PDS, PDSE, basic format, extended format, large format, or HFS (DSNTYPE)
Space allocation (AVGREC and SPACE)

Unless you explicitly code the SPACE parameter for the new data set, 
the system determines the space to be allocated for the new data
set by adding up the space allocated in the first three extents of the
model data set. Therefore, the space allocated for the new data set
will generally not match the space that was specified for the model
data set. Note that regardless of the units in which the model data
set was allocated, the new data set will be allocated in tracks. This
assumes that space was not specified on the JCL and is being picked up
from the model data set.

还有一些其他的小“陷阱”,如最后一段,链接中也有详细说明。

除非您有充分的理由,否则我强烈建议您在一个 IDCAMS 步骤中完成整个操作(如下所示)。


我怀疑它将是 1.12、1.13 或 2.1 (2.01)。IEFBR14 现在巧妙地成为操作系统的一部分。

究竟为什么你会得到这种效果,我不知道。我无权访问 2.1,所以无法调查自己。

IEFBR14 发生了变化,LIKE 并不是真正适用于 VSAM 数据集(你会得到很多你可能想要或不想要的东西的默认值),这并不是真正的“通常”方式。请参阅下面的建议。

尝试将 DDname 添加到仅引用 VSAM 数据集的 IDCAMS 步骤。看看这是否改变了什么。在 IDCAMS 语句中使用该 DDname。看看这是否改变了什么。

把你所有的结果带到你的 Sysprogs,看看他们是否能发现任何东西。

如果没有,那就是 PMR 时间:http ://www-01.ibm.com/support/docview.wss?uid=swg21507639

如果您确实提出了 PMR,请在收到答案后通过添加带有解决方案的答案来更新。


建议。

了解您站点上的其他人是如何完成此任务的。

您是否尝试过使用您以这种方式定义的 VSAM 文件?您应该 LISTCAT TEST.FILE1 和 TEST.FILE2 并进行比较。如果您在 JCL 参考中查找 LIKE,您将看到 VSAM DEFINE 可以做的事情,而对于在 JCL 中使用 LIKE 定义的 VSAM 文件却无法做到。

除非有其他原因,否则我建议您使用 IDCAMS 一步完成整个过程。查看文件是否存在,使用 IDCAM 的 IF 来测试 CC,如果文件不存在则只定义。您可以使用模型(例如在您的 TEST.FILE2 上)来获取与另一个文件相似的所有内容,并覆盖您需要的任何不同内容。

如果您在这里查看http://pic.dhe.ibm.com/infocenter/zos/v1r13/index.jsp?topic=%2Fcom.ibm.zos.r13.idai200%2Fdefclu.htm,您会发现一个IDCAMS的编号,Modal Commands如果它不存在,它将为您提供您需要定义的所有内容,如果存在,则执行不同的操作(例如设置条件代码)。

请仍然提供所要求的信息。从表面上看,这是一个有趣的问题,可能有一个简单的解决方案。但即使有解决方案,我认为这不是你想要的。

于 2014-10-31T01:15:35.663 回答
1

您想要做的事情可以完全在 IDCAMS 步骤中完成。您可以检查先前操作(即 LISTCAT)的返回代码,如果代码大于 0,则执行某些操作(例如定义新集群)。如果第二步有效,则将 MAXCC 设置为返回 0 以告诉您JCL 认为这一步可以完成(并让您的 Ops 人员也知道这一点)。

寻找 IDCAMS 'IF'。

于 2014-12-24T20:58:51.363 回答