【问题标题】:Concatenating files with similarDSN连接具有相似DSN 的文件
【发布时间】:2022-06-23 16:48:36
【问题描述】:

请问如何制作一个JCL来连接具有相似名称但最后一个限定符不同的各种数据集?我们将每一个的录制日期作为 DSN 的最后一个限定符。我的问题是我不知道它什么时候执行,我不能写每个文件的日期。

示例:AAAA.BBBBB.CCCCC.F090622

      AAAAA.BBBBB.CCCCC.F100622

      AAAAA.BBBBB.CCCCC.F110622

我的问题是:有没有办法在我的 JCL 中只写一个 DSN AAAA.BBBB.CCCC.F* 来连接上面描述的所有 DSN?

  • , 您可以使用 Rexx/ ISPF 文件剪裁来生成 JCL。
  • 这些是不是具有相同 DSN 的文件!所有限定符都属于数据集名称,您的日期限定符也是如此。
  • 作为旁注:您可能希望在日期顺序最终。明智的做法是预见到这一点按年月日顺序写日期而不是日月年。例如。 AAAAA.BBBBB.CCCCC.F220613

标签: mainframe jcl


【解决方案1】:

如果你的意思是这样的:

//INPUT DD DSN=AAAA.BBBB.CCCC.F*,DISP=SHR

代表:

//INPUT DD DSN=AAAA.BBBB.CCCC.F090622,DISP=SHR
//      DD DSN=AAAA.BBBB.CCCC.F100622,DISP=SHR
//      DD DSN=AAAA.BBBB.CCCC.F110622,DISP=SHR

这在 JCL 中是做不到的。

【讨论】:

    【解决方案2】:

    生成数据组的用例

    我了解要求如下:

    • 作业 A 每天运行,创建数据集 X 的新实例。
    • 作业 B 定期运行,比如每月运行一次,处理自上次运行以来创建的数据集 X 的所有实例的内容。
    • 在作业 B 成功运行后,您不再需要数据集 X 的各个实例。
    • 您不需要按日期访问数据集 X 的单个实例(非常频繁)。

    如果假设正确,则使用生成数据组可能是使用带有日期限定符的数据集名称的替代方法。

    有关详细信息,请参阅 z/OS DFSMS Access Method Services Commandsz/OS MVS JCL User's Guidez/OS MVS JCL Reference

    生成数据组简要说明

    一个世代数据组, 短的GDG, 是一组数据集,称为生成数据集, 短的GDS, 由他们在组中的位置引用。此位置由相对位置指定,括在括号中,并在 JCL 中指定 DSN 时附加到数据集名称。 (您不能在 TSO/ISPF 中使用此表示法)。

    GDG是数据集目录中的一个特殊条目。它定义了 GDS 的基本名称、任何时候可能存在的最大代数、最老的一代会发生什么、何时达到该最大值、创建另一个新的 GDS,以及更多选项。

    系统在创建和删除 GDS 时对其进行跟踪,并且此簿记是在 GDG 基本条目的帮助下完成的,并且自动附加到 DSN 的附加限定符。这个限定词的形式是 G呸呸呸V00,其中呸呸呸是实例的代号,每个新 GDS 加一。

    通过指定在 GDG 基础中指定的 DSN 并将相对代号附加为正整数,在 JCL 中创建新的 GDS。作业中的第一个新 GDS 的相对位置为 +1,第二个新 GDS 在同一份工作有相对位置+2。在作业开始执行之前存在的最新 GDS 的相对位置为零 (0),之前的 GDS 的位置为 -1。

    假设您定义了一个名称为Z08593.GDGTEST 的GDG。然后,您将在 JCL 中创建一个新的 GDS 实例,如下所示:

    //OUTPUT DD DSN=Z08593.GDGTEST(+1),DISP=(NEW,CATLG),....
    

    你会在整个工作中使用位置 (+1) 来引用这个实例。如果您需要阅读存在的最新实例工作开始了,您将其称为:

    //INPUT DD DSN=Z08593.GDGTEST(0),DISP=OLD,....
    

    在同一作业中创建的第二个新实例由DSN=Z08593.GDGTEST(+2) 引用。第二个但最新的实例由DSN=Z08593.GDGTEST(-1) 引用,依此类推。默认情况下,系统会在作业开始之前拍摄现有代的“快照”,并且整个作业执行过程中的所有相关引用都保持固定在此快照上。

    GDG 和 GDS 背后还有更多内容,以及如何处理它们。仔细阅读 JCL 用户指南(见上文)以更好地了解这一点,并考虑处理异常,如 ABEND、重复运行作业(因为它存在问题)等。

    将所有现有世代作为一个数据集读取(串联)

    这就是为什么 GDG 对您很重要的原因:您可以使用 JCL 中的单个 DD 语句轻松连接 GDG 的所有当前实例或世代。只需指定 DSN,但不要引用任何相关代:

    //INPUT DD DSN=Z08593.GDGTEST,DISP=SHR
    

    系统将在幕后为您创建 DD 连接。您甚至可以指定连接数据集的顺序:LIFO 或 FIFO:

    //INPUT DD DSN=Z08593.GDGTEST,DISP=SHR,GDGORDER=FIFO
        
    //INPUT DD DSN=Z08593.GDGTEST,DISP=SHR,GDGORDER=LIFO
    

    LIFO 是默认值。

    示例 JCL 和 JOBLOG

    我希望,一个例子和由此产生的工作日志有助于理解这个想法。

    创建生成数据组

    这是一次性的工作。一旦创建了 GDG 条目,它将一直存在,直到被明确删除。

    //jobname  JOB  ...
    //STEP01   EXEC PGM=IDCAMS                             
    //SYSPRINT DD  SYSOUT=*                                
    //SYSIN    DD  *                                       
      DEFINE GDG ( -                                       
        NAME( Z08593.GDGTEST ) -                           
        LIMIT( 35 ) -                                      
        NOEMPTY -                                          
        SCRATCH                                            
        )                                                  
    /*                                                     
    

    该作业定义了一个名为Z08593.GDGTEST,并指定在任何时候都不能超过 35 个生成数据集实例。它还指定在创建第 36 代时将删除最旧的一代 (SCRATCH)。 NOEMPTY 表示只删除最旧的 GDS。见访问方法服务命令手册了解详情。

    可以检查生成的 GDG 条目。例如在 ISPF 3.4 中,通过在 DGD 行上输入命令 LISTC ENT(/) ALL。结果与此类似:

    GDG BASE ------ Z08593.GDGTEST                                                                    
         IN-CAT --- CATALOG.ZOS6                                                                      
         HISTORY                                                                                      
           DATASET-OWNER-----(NULL)     CREATION--------2022.167                                      
           RELEASE----------------2     LAST ALTER------2022.167                                      
         ATTRIBUTES                                                                                   
           LIMIT-----------------35      NOSCRATCH  NOEMPTY    LIFO       NOPURGE    NOEXTENDED       
         ASSOCIATIONS--------(NULL)                                                                   
    

    创建新一代数据集

    该作业将定期运行,可能每天或每周运行,并且每次运行时都会创建一个新的 GDS 实例。

    //jobname  JOB  ...
    //STEP01   EXEC PGM=IEBGENER                                    
    //SYSPRINT DD   SYSOUT=*                                        
    //SYSIN    DD   DUMMY                                           
    //SYSUT1   DD   *
    Record on GDG data set 01
    /*                                                              
    //SYSUT2   DD   DSN=Z08593.GDGTEST(+1),                         
    //         DISP=(NEW,CATLG,DELETE),                             
    //         SPACE=(1,(50,50),RLSE),AVGREC=K                      
    

    实际上,每次作业运行时,程序都会读取不同的输入,对其进行处理,然后将结果写入新的 GDS。出于测试目的,我使用 IEBGENER,它只是将输入 (//SYSUT1) 复制到输出 (//SYSUT2)。您可能想要编辑“记录”,例如ba 为每次运行增加数字。

    在该作业第一次运行的日志中,可以看到新 GDS 的名称:

    IGD101I SMS ALLOCATED TO DDNAME (SYSUT2  )                 
            DSN (Z08593.GDGTEST.G0001V00                     ) 
            STORCLAS (ZXPS) MGMTCLAS (        ) DATACLAS (ZXPD)
            VOL SER NOS= ZXPL01                                
    

    在第二次运行中,它看起来像这样:

    IGD101I SMS ALLOCATED TO DDNAME (SYSUT2  ) 
            DSN (Z08593.GDGTEST.G0002V00                     )
            STORCLAS (ZXPS) MGMTCLAS (        ) DATACLAS (ZXPD)
            VOL SER NOS= ZXPL01                                
    

    等等。运行 3 次后,您将在 ISPF 3.4 中看到以下内容:

    DSLIST - Data Sets Matching Z08593.GDG*                             Row 1 of 4  
    Command ===>                                                  Scroll ===> PAGE  
                                                                                    
    Command - Enter "/" to select action                  Message           Volume  
    ------------------------------------------------------------------------------- 
             Z08593.GDGTEST                                                 ??????  
             Z08593.GDGTEST.G0001V00                                        ZXPL01  
             Z08593.GDGTEST.G0002V00                                        ZXPL01  
             Z08593.GDGTEST.G0003V00                                        ZXPL01  
    

    如您所见,系统为每个数据集添加了如上所述的生成限定符。笔记虽然您无法使用相对的ISPF 中的生成语法,您始终可以使用完整的数据集名称,如此处所示。如果您需要经常与 ISPF 中的人一起工作,它就不是那么有用:您不能轻易说出哪一代是在什么日期创建的。

    一次处理所有现有的世代

    因此,现在是时候运行该作业以处理自上次运行该作业以来已创建的所有世代。这是这项工作的 JCL:

    //jobname  JOB  ...
    //STEP01   EXEC PGM=IEBGENER                  
    //SYSPRINT DD   SYSOUT=*                      
    //SYSIN    DD   DUMMY                         
    //SYSUT1   DD   DISP=(SHR,KEEP),                     
    //             DSN=Z08593.GDGTEST,            
    //             GDGORDER=FIFO                  
    //SYSUT2   DD   SYSOUT=*   
    

    您指定单个 DD 语句通过其基本名称引用 GDG。系统会将其扩展为 DD 连接,每代一个 DD,在作业启动时存在。在作业日志中,您可以轻松地确认这一点:

    IEF142I Z08593R STEP01 - STEP WAS EXECUTED - COND CODE 0000   
    IEF285I   Z08593.Z08593R.JOB09672.D0000101.?           SYSOUT 
    IGD104I Z08593.GDGTEST.G0001V00                      RETAINED,  DDNAME=SYSUT1
    IGD104I Z08593.GDGTEST.G0002V00                      RETAINED,  DDNAME=      
    IGD104I Z08593.GDGTEST.G0003V00                      RETAINED,  DDNAME=          
    

    成功处理所有代后重置 GDG

    一旦处理作业成功处理了所有代,您希望删除所有代以开始下一个循环。同样,一个简单的工作看起来像这样:

    //jobname  JOB  ...
    //STEP01   EXEC PGM=IEFBR14
    //GDG      DD   DISP=(OLD,DELETE),                     
    //             DSN=Z08593.GDGTEST            
    

    作业日志的相关部分显示数据集已被删除:

    IEF142I Z08593D STEP01 - STEP WAS EXECUTED - COND CODE 0000                     
    IGD105I Z08593.GDGTEST.G0001V00                      DELETED,   DDNAME=SYSUT1   
    IGD105I Z08593.GDGTEST.G0002V00                      DELETED,   DDNAME=         
    IGD105I Z08593.GDGTEST.G0003V00                      DELETED,   DDNAME=         
    

    笔记重要的是要了解只有 GDS 被删除,GDG 基础是不是.

    【讨论】:

      猜你喜欢
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      • 2018-08-13
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多