您的位置:首页 > 其它

大型机学习之具体技术之-JCL练习(四)-特殊的DD语句

2007-09-26 18:43 387 查看
《大型机学习之具体技术之-JCL练习四-特殊的DD语句》

从前面的学习中我明白了我可以通过JCL调用系统实用程序来完成许多常见的功能,但是,我并不知道系统中这些实用程序倒底在什么位置,还有如果我想调用的是自己写的PL/I或者COBOL程序 或者甚至是另一个JCL作业(这样不知道可以不?),又该如何处理呢?所以,还得接着学习JCL。
原来,当一个作业步需要调用一个程序的时候,系统会在一个名叫SYS1.LINKLIB的系统库中去找你要调用的那个程序,或者去一个由你在安装时用LINKLIST这个参数成员指定的列表库中去寻找。
当你需要调用一个自己写的程序时,你就需要自己指定位置,那么,就要用到一个特殊的DD语句-JOBLIB:
JOBLIB
通过 JOBLIB DD语句用户可以创建一个私有库或为作业指定一个私有库。系统将会首
先搜索所指定的私有库去查找那些在 EXEC 语句的 PGM 参数中使用的程序,只有在私有库中没发现相匹配的程序时系统才会去搜索系统库。
一个私有库实际上是一个位于一个直接访问设备上的分区数据集(PDS)或分区数据集扩
展(PDSE),其中的每一个成员都是一个用户的可执行程序。
格式:
//JOBLIB DD 参数,[参数,参数。。。]

定义已编目的库:
指定 DSNAME 参数。
指定 DISP参数,其中的状态子参数必须为 OLD或SHR。
不需要指定 VOLUME 或 UNIT 参数。

定义未编目的库:
指定 DSNAME 参数。
指定 DISP参数,参数值必须为 DISP=(OLD,PASS)或 DISP=(SHR,PASS)。其中 SHR
表示这个数据集是已经存在的并允许其它作业使用这个库。
指定 UNIT 参数。
指定 VOLUME 参数。

创建一个库:
指定 DSNAME 参数,作为库的名字。
指定 UNIT 参数,注意一个库必须建立在一个直接访问设备上。
指定 VOLUME 参数,非特定卷的情况例外。
指定 SPACE 参数,为整个库分配足够的空间,并为 PDS 的目录分配空间。
指定 DISP参数,其中的状态子参数必须为 NEW。

向库中添加成员:
在 DSNAME 参数包含相应的成员名,例如,DSNAME=LIBRARY(PROGRAM)
将 DISP 参数中的状态子参数指定为 MOD。如果在创建库时已经编目则不需要其
它子参数,否则指定为 PASS 或 CATLG。
不要指定 SPACE 参数。

其它参数:
如果在数据集标签中不包含数据控制块信息则需要指定相应的 DCB 参数,但不要指定
FREE=CLOSE.

例一:
//PAYROLL JOB JONES,CLASS=C
//JOBLIB DD DSNAME=PRIVATE.LIB4,DISP=(OLD,PASS)
//STEP1 EXEC PGM=SCAN
//STEP2 EXEC PGM=UPDATE
//DD1 DD DSNAME=*.JOBLIB,DISP=(OLD,PASS)

在本例中,JOBLIB指定的私有库已经被编目,所以无需指定UNIT和VOLUME参数。系统首先搜索PRIVATE.LIB4私有库去查找程序SCAN,UPDATE,然后才查找系统库SYS1.LINKLIB,在DD1语句中引用了JOBLIB语句所指定的私有库。

例二:
//PAYROLL JOB FOWLER,CLASS=L
//JOBLIB DD DSNAME=PRIV.DEPT58,DISP=(OLD,PASS),
// UNIT=3350,VOLUME=SER=D58PVL
//STEP1 EXEC PGM=DAY
//STEP2 EXEC PGM=BENEFITS
//DD1 DD DSNAME=*.JOBLIB,VOLUME=REF=*.JOBLIB,DISP=(OLD,PASS)

因为在本例中,JOBLIB语句所指定的私有库没有被编目,所以要指定UNIT和VOLUME参数,系统首先查找所指定的PRIV.DEPT58,如果找不到,才去找SYS1.LINKLIB系统库,在DD1语句中引用了JOBLIB语句中指定的私有库。

例三:
//TYPE JOB MSGLEVEL=(1,1)
//JOBLIB DD DSNAME=GROUP8.LEVEL5,DISP=(NEW,CATLG),
// UNIT=3350,VOLUME=SER=148562,SPACE=(CYL,(50,3,4))
//STEP1 EXEC PGM=DISC
//DDA DD DSNAME=GROUP8.LEVEL5(RATE),DISP=MOD,
// VOLUME=REF=*.JOBLIB
//STEP2 EXEC PGM=RATE

由于在本例的 JOBLIB DD语句中指定的私有库还不存在,因此必须在 JOBLIB DD 语句中包含所有用于定义这个库的必要的参数。这个库将在 STEP1 中被建立,并且由 DD 语句 DDA 为这个库添加了一个新的成员 RATE。明显可知,系统将在系统库 SYS1.LINKLIB 中查找程序DISC,在作业步 STEP2中系统将首先在新创建的私有库中查找程序 RATE。

例 四:
//PAYROLL JOB BIRDSALL,TIME=1440
//JOBLIB DD DSNAME=KRG.LIB12,DISP=(OLD,PASS)
// DD DSNAME=GROUP31.TEST,DISP=(OLD,PASS)
// DD DSNAME=PGMSLIB,UNIT=3350,
// DISP=(OLD,PASS),VOLUME=SER=34568

通过三个 DD 语句为作业定义了三个相连接的私有库,系统将按照下面的顺序查找每一个程序:
KRG.LIB12
GROUP31.TEST
PGMSLIB
SYS1.LINKLIB
当然,有特殊用途的DD语句不止JOBLIB一条,还有如JOBCAT,STEPCAT,STEPLIB以及我们前面已经用过的SYSIN。下面逐条进行:
JOBCAT
通过DD 语句JOBCAT 可以为作业定义一个私有的VSAM 用户编目或完整的编目功能。系统可以在搜索主编目或搜索与数据集名的第一部分相关联的私有编目(不明白这儿的搜索编目指的是什么。。。) 前先搜索本语句中定义的私有编目。 当作业中引用了一个 SMS (STORAGE MAMAGEMENT SUBSYSTEM)数据集时不要使用 JOBCAT 语句,因为 SMS 仅仅访问那些在系统编目中进行编目的 SMS 数据集。
格式:
//JOBCAT DD DISP={OLD},DSNAME=私有编目名[,参数]... [说明]
{SHR}

不要指定任何UNIT 和VOLUME 参数,系统将会从主编目中获取私有编目的位置。
可以通过在 JOBCAT 语句后立即跟有省略了语句名的 DD 语句的方法为作业指定多个这样的私有编目。
应当将JOBCAT 语句放置在JOB 语句之后,并且位于第一个EXEC 语句之前。
如果作业中包含了JOBLIB 语句,应当放置在JOBCAT 语句之前。

例 1
//EXAMPLE JOB WILLIAMS,MSGLEVEL=1
//JOBLIB DD DSNAME=USER.LIB,DISP=SHR
//JOBCAT DD DSNAME=LYLE,DISP=SHR
// EXEC PGM=SCAN
在这个例子中,JOBCAT 语句指定了一个私有编目 LYLE,并且 JOBCAT 语句位于 JOBLIB 语句之后。
STEPCAT

通过DD 语句JOBCAT 可以为作业步定义一个私有的VSAM 用户编目或完整的编目功
能。系统可以在搜索主编目或搜索与数据集名的第一部分相关联的私有编目前先搜索本语句中定义的私有编目。
当作业步中引用了一个 SMS 数据集时不要使用 JOBCAT 语句,因为 SMS 仅仅访问那
些在系统编目中进行编目的 SMS 数据集。
格式:
//STEPCAT DD DISP={OLD},DSNAME=私有编目名[,参数]... [说明]
{SHR}

不要指定任何UNIT 和VOLUME 参数,系统将会从主编目中获取私有编目的位置。
可以通过在STEPCAT 语句后立即跟有省略了语句名的DD 语句的方法为作业指定多个 这样的私有编目。
通过下面的语句可以在一个特定的作业步中用主编目覆盖JOBCAT 中定义的私有编目:
//STEPCAT DD DISP=OLD,DSNAME=主编目名。
在一个作业步中可以将 STEPCAT 语句放在DD 语句中的任何一个位置。

例 1.
// EXEC PROC=SNZ12
//STEPCAT DD DSNAME=BETTGER,DISP=SHR

STEPCAT 语句为这个作业步定义了一个私有编目 BETTGER。
STEPLIB
STEPLIB 语句的作用与JOBLIB 相似,主要区别在于作用的范围分别是作业步和作业。
这里我们不再对 STEPLIB 进行详细的说明,仅仅给出一些例子共大家参考。同一个作业中
后续作业步可以引用在 STEPLIB DD 语句中定义的私有库,同样,可以将一个 STEPLIB DD
语句放在内部流或编目过程中,但不能将JOBLIB DD 语句放在内部流或编目过程中。
.格式:
//STEPLIB DD 参数[,参数]... [说明]
例 1
//PAYROLL JOB BROWN,MSGLEVEL=1
//STEP1 EXEC PROC=LAB14
//STEP2 EXEC PGM=SPKCH
//STEPLIB DD DSNAME=PRIV.LIB5,DISP=(OLD,KEEP)
//STEP3 EXEC PGM=TIL80
//STEPLIB DD DSNAME=PRIV.LIB12,DISP=(OLD,KEEP)
在本例中系统首先在私有库 PRIV.LIB5 中搜索程序 SPKCH,在私有库 PRIV.LIB12 中搜
索程序 TIL80。

例 2
//PAYROLL JOB BAKER,MSGLEVEL=1
//JOBLIB DD DSNAME=LIB5.GROUP4,DISP=(OLD,PASS)
//STEP1 EXEC PROC=SNZ12
//STEP2 EXEC PGM=SNAP10
//STEPLIB DD DSNAME=LIBRARYP,DISP=(OLD,PASS),
// UNIT=3350,VOLUME=SER=55566
//STEP3 EXEC PGM=A1530
//STEP4 EXEC PGM=SNAP11
//STEPLIB DD DSNAME=*.STEP2.STEPLIB,
// DISP=(OLD,KEEP)
系统首先在私有库 LIBPARYP 中搜索程序 SNAP10;库 LIBRARYP 将被传递到后续的作业步。在作业步 STEP4 中的 STEPLIB DD 语句引用了 LIBRARYP 库,因此系统将会在 LIBRARYP中搜索程序 SNAP11。由于在这个作业中包含了 JOBLIB DD 语句,系统将会首先在库 LIB5.GROUP4中搜索程序 SNZ12和 A1530。

例 3
//PAYROLL JOB THORNTON,MSGLEVEL=1
//JOBLIB DD DSNAME=LIB5.GROUP4,DISP=(OLD,PASS)
//STEP1 EXEC PGM=SUM
//STEPLIB DD DSNAME=SYS1.LINKLIB,DISP=OLD
//STEP2 EXEC PGM=VARY
//STEP3 EXEC PGM=CALC
//STEPLIB DD DSNAME=PRIV.WORK,DISP=(OLD,PASS)
// DD DSNAME=LIBRARYA,DISP=(OLD,KEEP),
// UNIT=3350,VOLUME=SER=44455
// DD DSNAME=LIB.DEPT88,DISP=(OLD,KEEP)
//STEP4 EXEC PGM=SHORE
对于作业步 STEP2 和 STEP4 来说系统首先会在私有库 LIB5.GROUP4 中搜索程序 VARY 和 SHORE。但对于 STEP1 来说,系统或首先搜索库 SYS1.LINKLIB来查找程序 SUM。
在 STEP3 中定义了一组私有库,系统按照下面的顺序搜索程序 CALC:PRIV.WORK、
LIBRARYA、LIB.DEPT88、SYS1.LINKLIB。如果有后续的作业步引用在 STEP3中定义的 STEPLIB
语句,所引用的仅仅是库 PRIV.WORK,其它的库将不会被引用。

SYSIN
通常,我们使用 SYSIN DD 语句作为一个内部流数据集的开始。内部流数据集以DD *
或DD DATA 语句开头,这样的DD 语句可以有任何一个有效的名字,包括 SYSIN。如果在
内部流数据之前省略这样的DD 语句,系统会自动提供一个名为 SYSIN 的DD *语句。
格式:
//SYSIN DD 参数[,参数]... [说明]

第一个参数为*或 DATA,用以指出后面紧跟的时内部流数据。这条语句必须且只能够
位于内部流数据前。

例 1
//STEP1 EXEC PGM=READ
//SYSIN DD *

.

.

数据

其实从前面在学习系统实用程序的时候也看到了,那种情况下SYSIN DD语句也常常用来标示控制语句。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: