《大型机学习之具体技术之-JCL练习五-过程的定义与使用》
和其它高级语言一样,作业控制语言中也允许定义过程。过程是一段预先编写好的JCL
语句的集合,它可以被反复调用。作业控制语言中定义了两种过程,分别是编目过程
(cataloged procedure)和流内过程(in-stream procedure)。
编目过程与流内过程
在指定的过程库中编目的过程称为编目过程。该过程库可以是分区数据集或扩展分区数据集,通常系统过程被编目在系统过程库中,用户过程被编目在用户库中。由于调用编目过程时,系统提供的是该过程的拷贝,因此一个编目过程可以同时被几个作业调用。
流内过程是放置在作业输入流中的过程。在一个作业中最多可以有 15 个流内过程,但不能嵌套使用,也不能被其他作业调用。流内过程与编目过程的区别是流内过程随着一个作业放在输入流中,它紧跟在 JOB 语句后面而不是作为分区数据集的成员。在实际应用时,流内过程只用于测试阶段,一旦流内过程调试成功,即可对其进行编目,使其能够成为编目过程。
l 过程的编写
一个过程可由几个作业步组成。在过程中可以包含除下列语句外的所有JCL 语句:
调用过程的 EXEC 语句(一个过程不能调用另一个过程)
JOB 语句、/*语句或//语句
JOBLIB DD语句或 JOBCAT DD语句
任何的 JES控制语句
DD *语句或 DD DATA 语句
流内过程的开始和结束分别用 PROC 语句和 PEND 语句表示,对于编目过程,不能有
PEND 语句,而如果没有分配给符号参数默认值,PROC 语句是可选的。过程的结构如下:
//过程名 PROC [符号参数]
//过程步 1 EXEC
//dd名 1 DD
。
。
。
//过程步 2 EXEC
//dd名 2 DD
。
。
。
// PEND (仅在流内过程中使用)
过程结构中的过程名、过程步名及 dd 名的书写规则与 JCL 中其它语句名的书写规则一样。 符号参数的功能类似于其它编程语言子程序中的形式参数。
例:流内过程
//MYJOB JOB (2216,82),’TEST RUN’,CLASS=A
//RUN PROC
//GO EXEC PGM=ONE
//SYSOUT DD SYSOUT=A
// PEND
//STEP1 EXEC RUN
本例中RUN是一个流内过程,作业中名为 STEP1 的执行语句调用这个流内过程。该
流内过程在去掉 PEND 语句后也可以作为标准的过程放在用户库中,作为编目过程。
l 过程的调用
过程的调用有如下两种方式:
//作业步名 EXEC PROC=过程名 [符号参数]
或 //作业步名 EXEC 过程名 [符号参数]
当调用一个过程时,系统会以输入流、用户库、系统库的顺序来检索所要调用的过程。
如果所调用的过程是流内过程,则必须把流内过程放在调用它的EXEC 语句之前。
如果调用的编目过程被编目在用户库中,系统从JCLLIB 语句确定的用户库中进行检索。
因此,若调用的过程是用户库中的过程时,要用JCLLIB 语句来指明过程所在的用户库。如
果调用的编目过程被编目在系统库中,系统从 JES2 中的PROCLIB 参数指定的系统库进行
检索。
l 过程的修改
由于不同用户的要求不同,所以当某一个作业调用标准过程时,系统应允许用户对过程进行修改,以满足自己的需要。过程修改的方式有如下三种:
(1)置换过程中的符号参数;
(2 )对过程中的EXEC 及DD 语句参数进行覆盖和增加;
(3)增加新的DD 语句。
1. 符号参数
符号参数由符号“&”和参数名组成,参数名可以是以字母或通配符开头的1~8 位字母数字或通配符,关键字参数和关键字子参数不能作为符号参数的参数名。符号参数为修改过程提供了可选用的方法。
当过程中含有符号参数时,每一个符号参数必须指定一个值或赋空值,该值被称为符号参数的初值。
下面是一个使用符号参数的例子:
例 1://RUN PROC PROGRAM=ONE,UNIT=SYSDA
//GO EXEC PGM=&PROGRAM
//A DD UNIT=&UNIT,SPACE=(TRK,20)
在本例中符号参数PROGRAM、UNIT 都被赋了初值。当一个作业调用该过程时,这些
符号参数的初值可以被调用该过程的 EXEC 语句中的符号参数值所取代,从而达到修改过 程的目的。
下面是调用例 1 过程的例子:
例2://JOB1 JOB …
//GO EXEC RUN,UNIT=TEMP
// PROGRAM=TWO
2. EXEC 语句参数的覆盖和增加
用 EXEC 语句调用过程时,该语句的所有关键字参数都会影响过程的执行,它将覆盖过程中定义的参数,对于过程中没有定义的参数,系统会把它加到过程中去。用 EXEC 语句修改过程的方式如下:
//stepname EXEC 过程名,参数.过程步=值
其中“参数.过程步=值”表示准备对过程中所希望的过程步的关键字参数进行修改。
例如有下述过程:
//RUN PROC
//STEP1 EXEC PGM=P1
·
·
//STEP2 EXEC PGM=P2
·
·
//STEP3 EXEC PGM=P3,TIME=(2,30)
若要求对 STEP2 增加COND 参数并指定条件测试为(8,GT),对STEP3 改变其时间限
制为4 秒。那么调用该过程时,EXEC 语句为:
//GO EXEC RUN,
// COND.STEP2=(8,GT),
// TIME.STEP3=4
3. DD 语句参数的覆盖
对于过程中DD 语句参数的修改可以通过下列方式:
//过程步名.DD 名 DD …
“过程步名.DD 名”用来确定要修改的DD 语句,其中“DD 名”指需要修改的DD 语
句,“过程步名”指过程重要修改的 DD 语句所在的过程步的名字。下面是对过程中 DD 语 句进行修改的例子:
例://RUN PROC
···
//S1 EXEC …
···
//SYSUT2 DD SYSOUT=*
···
// PEND
···
//TEST2 EXEC RUN,…
···
//S1.SYSUT2 DD SYSOUT=S
4. 增加新的DD 语句
对于调用的过程,可能不包含用户需要的 DD 语句,这是可通过下列方法来增加新的DD 语句:
//过程步名.需增加的DD 语句
其中过程步名是确定新加的DD 语句在过程中的位置。