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)