IBM主机技术一本通
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.19 过程定义和调用的例子

下面我们来看一些过程定义和调用的例子。

2.19.1 定义和调用流内过程

下面是定义和调用内部流过程的例子。在这个例子中,第3行的PROC语句标志内部流过程的开始,而第20行的PEND语句则标志内部流过程的结束。对于内部流过程来说,它们是过程定义必需的。

在过程定义的第8行和第16行使用了符号变量(参数),但在过程中并没有给它赋默认值,因此,在调用过程之前的第21行,我们使用SET语句将符号变量&USERID赋值IBMUSER。

第22行的EXEC语句直接调用过程IBMBR14,没有修改过程中的任何参数。

        000001 //IBMUSERA JOB 168,‘NEWMAN LV',CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1),
        000002 // NOTIFY=IBMUSER
        000003 //IBMBR14  PROC →                   流内过程必须以PROC开始
        000004 //*****************************************************************
        000005 //*          DEFINE QSAM FILE
        000006 //*****************************************************************
        000007 //DEL110S1 EXEC PGM=IEFBR14
        000008 //QSAM1    DD DSN=&USERID..TEST.QSAM1,
        000009 //            DISP=(NEW,CATLG,DELETE),
        000010 //            SPACE=(TRK,(1,1),RLSE),
        000011 //            DCB=(RECFM=FB,LRECL=80,DSORG=PS)
        000012 //*****************************************************************
        000013 //*          DEFINE PDS  FILE
        000014 //*****************************************************************
        000015 //DEL110S2 EXEC PGM=IEFBR14
        000016 //PDS1     DD DSN=&USERID..TEST.PDS1,
        000017 //            DISP=(NEW,CATLG,DELETE),
        000018 //            SPACE=(TRK,(1,1,5),RLSE),
        000019 //            DCB=(RECFM=FB,LRECL=80,DSORG=PO)
        000020 //         PEND →                    流内过程必须以PEND结束
        000021 //DATA SET  USERID=IBMUSER
        000022 //STEP1   EXEC IBMBR14
        000023 //

2.19.2 调用定义在系统过程库中的过程

假定过程REP存储在系统过程库SYS1.PROCLIB的成员REPORT中,其内容为:

        000001 //REP    PROC →                     编目过程的PROC语句是可选的
        000002 //PSTEP1 EXEC PGM=PRINTREP
        000003 //OUTDS   DD   SYSOUT=A

我们可以用下面的作业流来调用上面的过程。

        000001 //IBMUSERA JOB (12345678),IBMUSER,MSGLEVEL=(1,1),CLASS=A,
        000002 //       MSGCLASS=H,NOTIFY=&SYSUID
        000003 //STEPA   EXEC PROC=REPORT →       必须与过程库的成员名一致
        000004 //PSTEP1.OUTDS DD  DSN=IBMUSER.TEST.FILE,DISP=SHR

在上述调用中,第3行的PROC=后面的值必须是过程在SYS1.PROCLIB中的成员名而不是过程名,此外,原来过程中的PROC语句对于登目过程来说是可以省略的。

2.19.3 调用定义在系统过程库中的过程并覆盖原过程中的参数

过程REP1存储在系统过程库SYS1.PROCLIB的成员PRTREP中,其内容为:

        000001 //PS1     EXEC   PGM=PRREP1
        000002 //OUTA    OUTPUT  CONTROL=PROGRAM
        000003 //DSA     DD     SYSOUT=C,OUTPUT=*.OUTA
        000004 //DSB     DD     SYSOUT=D,OUTPUT=*.OUTA
        000005 //PS2     EXEC   PGM=PRREP2
        000006 //DSC     DD     SYSOUT=A

我们可以用下面的作业流来调用上面的过程。

        000001 //IBMUSERA JOB (12345678),IBMUSER,MSGLEVEL=(1,1),CLASS=A,
        000002 //          MSGCLASS=H,NOTIFY=&SYSUID
        000003 //ADD1     OUTPUT  COPIES=2
        000004 //STEPA    EXEC   PROC=PRTREP →        必须与过程库的成员名一致
        000005 //PS1.OUTA  OUTPUT  CONTROL=DOUBLE,COPIES=3
        000006 //PS1.DSB   DD     OUTPUT=*.ADD1
        000007 //PS1.DSE   DD  DSN=IBMUSER.TEST.FILE1,DISP=SHR
        000008 //PS2.OUTB  OUTPUT  DEFAULT=YES,DEST=STL

在下面的调用中,我们首先增加了控制语句ADD1,覆盖了原来过程部PS1中的OUTA和DSB两条DD语句,同时为作业步PS1增加了一个DD语句DSE。对于作业步PS2,我们增加了一个DD语句,即OUTB,这样,调用之后的作业流实际就变成了:

        000001 //IBMUSERA JOB (12345678),IBMUSER,MSGLEVEL=(1,1),CLASS=A,
        000002 //          MSGCLASS=H,NOTIFY=&SYSUID
        000003 //ADD1     OUTPUT  COPIES=2
        000004 //PS1      EXEC   PGM=PRREP1
        000005 //OUTA     OUTPUT  CONTROL=DOUBLE,COPIES=3
        000006 //DSA      DD     SYSOUT=C,OUTPUT=*.OUTA
        000007 //DSB      DD     OUTPUT=*.ADD1
        000008 //DSE      DD  DSN=IBMUSER.TEST.JCL1,DISP=SHR
        000009 //PS2      EXEC   PGM=PRREP2
        000010 //DSC      DD     SYSOUT=A
        000011 //OUTB     OUTPUT  DEFAULT=YES,DEST=STL

2.19.4 调用私有过程库中的过程并覆盖原过程中的某些参数

下面的例子说明调用私有库中的过程。该过程是存放在私有库IBMUSER.TEST.PROC中的,在调用时,必须使用第3行所示的JCLLIB语句,告诉系统你的过程所在的过程库的名字。第7行的SET语句为过程中的符号变量USERID赋值IBMUSER。

第9行和第10行的DEL110S1.QSAM1和DEL110S2.PDS1语句由于没有指定文件名,在调用过程后不会有任何的文件操作。

第13行和第14行的DEL110S1.QSAM1和DEL110S2.PDS1语句分别覆盖原过程中指定的数据集,因此,作业执行后系统会生成文件IBMUSER.TET.QSAM6和IBMUSER.TEST.PDS6。

第17行和第19行的DEL110S1.QSAM1和DEL110S2.PDS1语句分别覆盖原过程中指定的数据集,因此,作业执行后系统会生成文件IBMUSER.TET.QSAMA和IBMUSER.TEST.PDSA。此外,它们的DCB也替换掉了。

        000001 //IBMUSERA  JOB ACCT#,IBMUSER,NOTIFY=IBMUSER,MSGLEVEL=(1,1)
        000002 //*    RESTART=STEP3.DEL110S1
        000003 //MYLIB JCLLIB ORDER=(IBMUSER.TEST.PROC)
        000004 //*****************************************************************
        000005 //*          DEFINE QSAM FILE
        000006 //*****************************************************************
        000007 //DATA SET USERID=IBMUSER
        000008 //STEP1   EXEC IBMBR14
        000009 //DEL110S1.QSAM1 DD DISP=OLD
        000010 //DEL110S2.PDS1 DD DISP=OLD
        000011 //*
        000012 //STEP2   EXEC IBMBR14
        000013 //DEL110S1.QSAM1 DD DSN=&USERID..TEST.QSAM6,DISP=OLD
        000014 //DEL110S2.PDS1 DD DSN=&USERID..TEST.PDS6,DISP=OLD
        000015 //*
        000016 //STEP3   EXEC IBMBR14
        000017 //DEL110S1.QSAM1 DD DSN=&USERID..TEST.QSAMA,
        000018 //          DCB=(RECFM=FB,LRECL=133,DSORG=PS)
        000019 //DEL110S2.PDS1 DD DSN=&USERID..TEST.PDSA,
        000020 //          DISP=(NEW,CATLG,DELETE),
        000021 //          SPACE=(TRK,(1,1,5),RLSE),
        000022 //          DCB=(RECFM=FB,LRECL=133,DSORG=PO)
        000023 //

注意,上面的JCLLIB语句指定要执行的过程库名,定义在专有库IBMUSER.TEST.PROC中的过程IBMBR14的内容为:

        000001 //IBMBR14  PROC →           登目过程中,PROC语句不是必需的,可以省略
        000002 //*****************************************************************
        000003 //*         DEFINE QSAM FILE
        000004 //*****************************************************************
        000005 //DEL110S1 EXEC PGM=IEFBR14
        000006 //QSAM1    DD DSN=&USERID..TEST.QSAM1,
        000007 //             DISP=(NEW,CATLG,DELETE),
        000008 //             SPACE=(TRK,(1,1),RLSE),
        000009 //             DCB=(RECFM=FB,LRECL=80,DSORG=PS)
        000010 //*****************************************************************
        000011 //*            DEFINE PDS  FILE
        000012 //*****************************************************************
        000013 //DEL110S2 EXEC PGM=IEFBR14
        000014 //PDS1     DD DSN=&USERID..TEST.PDS1,
        000015 //             DISP=(NEW,CATLG,DELETE),
        000016 //             SPACE=(TRK,(1,1,5),RLSE),
        000017 //             DCB=(RECFM=FB,LRECL=80,DSORG=PS)
        000018 //         PEND →           登目过程中,PEND语句不是必需的,可以省略

登目过程中的PROC和PEND是可选的。下面显示的是系统完成置换后的JCL,下面的变化需要你的注意。

● 第6行和第8行,原来过程中定义的DSN变成了空,整个DD语句只剩下DISP=OLD,即这两步已经变成什么也不做了。

● 第11行和第13行的DD语句的文件名的尾部变成了QSAM6和PDS6,DISP都变成了OLD。

● 第16行和第18行的DD语句除了文件名的尾部变成了QSAMA和PDSA外,对应的DCB参数也替换掉了。

    1 //IBMUSERA  JOB ACCT#,IBMUSER,NOTIFY=IBMUSER,MSGLEVEL=(1,1)
      //*    RESTART=STEP3.DEL110S1
    2 //MYLIB JCLLIB ORDER=(IBMUSER.TEST.PROC)
      //*****************************************************************
      //*          DEFINE QSAM FILE
      //*****************************************************************
    3 //DATA SET USERID=IBMUSER
    4 //STEP1   EXEC IBMBR14
      XX*IBMBR14  PROC
      XX*****************************************************************
      XX*          DEFINE QSAM FILE
      XX*****************************************************************
    5 XXDEL110S1 EXEC PGM=IEFBR14
    6 //DEL110S1.QSAM1 DD DISP=OLD
      X/QSAM1   DD DSN=&USERID..TEST.QSAM1,
      X/           DISP=(NEW,CATLG,DELETE),
      X/           SPACE=(TRK,(1,1),RLSE),
      X/           DCB=(RECFM=FB,LRECL=80,DSORG=PS)
      XX*****************************************************************
      XX*          DEFINE PDS  FILE
      XX*****************************************************************
      IEFC653I SUBSTITUTION JCL - DSN=IBMUSER.TEST.QSAM1,DISP=(NEW,CATLG,DELETE),
      SPACE=(TRK,(1,1),RLSE),
      DCB=(RECFM=FB,LRECL=80,DSORG=PS)
    7 XXDEL110S2 EXEC PGM=IEFBR14
    8 //DEL110S2.PDS1 DD DISP=OLD
      X/PDS1    DD DSN=&USERID..TEST.PDS1,
      X/           DISP=(NEW,CATLG,DELETE),
      X/           SPACE=(TRK,(1,1,5),RLSE),
      X/           DCB=(RECFM=FB,LRECL=80,DSORG=PO)
    XX*       PEND
    //*
    IEFC653I SUBSTITUTION JCL - DSN=IBMUSER.TEST.PDS1,DISP=(NEW,CATLG,DELETE),
    SPACE=(TRK,(1,1,5),RLSE),
    DCB=(RECFM=FB,LRECL=80,DSORG=PO)
  9 //STEP2   EXEC IBMBR14
    XX*IBMBR14  PROC
    XX*****************************************************************
    XX*          DEFINE QSAM FILE
    XX*****************************************************************
  10 XXDEL110S1 EXEC PGM=IEFBR14
  11 //DEL110S1.QSAM1 DD DSN=&USERID..TEST.QSAM6,DISP=OLD
    IEFC653I SUBSTITUTION JCL - DSN=IBMUSER.TEST.QSAM6,DISP=OLD
    X/QSAM1   DD DSN=&USERID..TEST.QSAM1,
    X/           DISP=(NEW,CATLG,DELETE),
    X/           SPACE=(TRK,(1,1),RLSE),
    X/           DCB=(RECFM=FB,LRECL=80,DSORG=PS)
    XX*****************************************************************
    XX*          DEFINE PDS  FILE
    XX*****************************************************************
    IEFC653I SUBSTITUTION JCL - DSN=IBMUSER.TEST.QSAM1,DISP=(NEW,CATLG,DELETE),
    SPACE=(TRK,(1,1),RLSE),
    DCB=(RECFM=FB,LRECL=80,DSORG=PS)
  12 XXDEL110S2 EXEC PGM=IEFBR14
  13 //DEL110S2.PDS1 DD DSN=&USERID..TEST.PDS6,DISP=OLD
    IEFC653I SUBSTITUTION JCL - DSN=IBMUSER.TEST.PDS6,DISP=OLD
    X/PDS1    DD DSN=&USERID..TEST.PDS1,
    X/           DISP=(NEW,CATLG,DELETE),
    X/           SPACE=(TRK,(1,1,5),RLSE),
    X/           DCB=(RECFM=FB,LRECL=80,DSORG=PO)
    XX*       PEND
    //*
    IEFC653I SUBSTITUTION JCL - DSN=IBMUSER.TEST.PDS1,DISP=(NEW,CATLG,DELETE),
    SPACE=(TRK,(1,1,5),RLSE),
    DCB=(RECFM=FB,LRECL=80,DSORG=PO)
  14 //STEP3   EXEC IBMBR14
    XX*IBMBR14  PROC
    XX*****************************************************************
    XX*          DEFINE QSAM FILE
    XX*****************************************************************
  15 XXDEL110S1 EXEC PGM=IEFBR14
  16 //DEL110S1.QSAM1 DD DSN=&USERID..TEST.QSAMA,
    //          DCB=(RECFM=FB,LRECL=133,DSORG=PS)
    IEFC653I SUBSTITUTION JCL - DSN=IBMUSER.TEST.QSAMA,DCB=(RECFM=FB,LRECL=133,DSORG=PS)
    X/QSAM1   DD DSN=&USERID..TEST.QSAM1,
    X/           DISP=(NEW,CATLG,DELETE),
    X/           SPACE=(TRK,(1,1),RLSE),
    X/           DCB=(RECFM=FB,LRECL=80,DSORG=PS)
    XX*****************************************************************
    XX*          DEFINE PDS  FILE
    XX*****************************************************************
    IEFC653I SUBSTITUTION JCL - DSN=IBMUSER.TEST.QSAM1,DISP=(NEW,CATLG,DELETE),
    SPACE=(TRK,(1,1),RLSE),
    DCB=(RECFM=FB,LRECL=80,DSORG=PS)
  17 XXDEL110S2 EXEC PGM=IEFBR14
  18 //DEL110S2.PDS1 DD DSN=&USERID..TEST.PDSA,
    //          DISP=(NEW,CATLG,DELETE),
    //          SPACE=(TRK,(1,1,5),RLSE),
    //          DCB=(RECFM=FB,LRECL=133,DSORG=PO)
          IEFC653I SUBSTITUTION JCL - DSN=IBMUSER.TEST.PDSA,DISP=(NEW,CATLG,DELETE),
          SPACE=(TRK,(1,1,5),RLSE),
          DCB=(RECFM=FB,LRECL=133,DSORG=PO)
          X/PDS1    DD DSN=&USERID..TEST.PDS1,
          X/           DISP=(NEW,CATLG,DELETE),
          X/           SPACE=(TRK,(1,1,5),RLSE),
          X/           DCB=(RECFM=FB,LRECL=80,DSORG=PO)
          XX*       PEND
          IEFC653I SUBSTITUTION JCL - DSN=IBMUSER.TEST.PDS1,DISP=(NEW,CATLG,DELETE),
          SPACE=(TRK,(1,1,5),RLSE),
      DCB=(RECFM=FB,LRECL=80,DSORG=PO)