2.17 JCL符号参数
JCL符号参数(Symbolic parameter)用来在过程中定义其所使用的参数或子参数。使用符号参数的主要目的是提高过程调用的灵活性。对于那些每次调用很有可能变化的参数,最好使用符号参数来表示。符号参数通常有它的默认值。调用过程时既可以使用默认值,也可以在使用EXEC语句调用过程时赋予它别的值。
符号参数的语法规则为:
● 符号参数由&符号开始。
● 由1~7个字母数字组成(A~Z和0~9)或通配符(#、@、$)组成,开始字符必须是字母或通配符。
● 符号参数可以代表EXEC或DD语句中的参数。
下面是符号参数的例子。
ACCT=&ACOUNT PGM=&PGMID //STEP1 EXEC PGM=&PGMID,ACCT=&ACOUNT
符号参数由一个(&)符号开始,而临时数据集则由两个(&)符号开头,这一点不要搞混了。符号参数的默认值的定义方法为:
● 默认值出现在PROC语句的参数字段中。
● 默认值的前面没有(&)符号。
● 当有多个默认值时,它们用逗号隔开。
● 多个默认值赋值的顺序可以随意。
在下面的MYPROC过程定义中,过程PROC语句为&ACOUNT赋的默认值为1688,而为&PGMID赋的默认值为PGM1。
//MYRPOC PROC ACOUNT=1688,PGMID=PGM1 //PSTEP1 EXEC PGM=PROG1, // ACCT=&ACOUNT //PSTEP2 EXEC PGM=&PGMID,ACCT=&ACOUNT //DD1 DD SYSOUT=A
在下列情况下你需要为符号参数赋值。
● 过程部PROC语句中的默认值不适合你的调用。
● 过程部的PROC语句中没有指定默认值。
覆盖默认值的方法为:
● 如果覆盖默认值,在符号参数的前面不写(&)符号,紧跟在符号变量后面写等号(=)和要赋的值。
● 如果要清空默认值,在符号参数的前面不写(&)符号,紧跟在后面的只有等号(=)。
● 覆盖默认值或清空默认值的顺序是随意的。
在这个例子中,过程MYPROC在作业步PSTEP2中要使用测试程序PRG111,而不是原来的默认值。此外,因为这是一个测试,为了不影响账户的统计信息,我们需要将账户ACOUNT的值清空。这样,原来赋给ACOUNT的默认值1688和赋给PGMID的默认值PGM1就都不适用了,我们必须做修改。
//MYRPOC PROC ACOUNT=1688,PGMID=PGM1 //PSTEP1 EXEC PGM=PROG1, // ACCT=&ACOUNT //PSTEP2 EXEC PGM=&PGMID,ACCT=&ACOUNT //DD1 DD SYSOUT=A
下面是满足条件的调用过程MYPROC的JCL语句。
//JSTEP EXEC MYPROC,ACOUNT=, // PGMID=PRG111,
我们所做的修改有:
● 将原来赋给&ACOUNT的值清空。
● 覆盖原来赋给&PGMID的默认值PGM1,而用PRG111代替。
在调用过程的EXEC语句中,清空或覆盖符号变量值的语句可以按照任何顺序出现。JCL符号变量允许用户通过变量的使用修改作业中的JCL语句,它只对当前作业有效。当在作业里编写JCL符号变量时,每次作业运行时必须定义它们,它们拥有较高的优先权。一个JCL符号变量可以通过以下途径设定。
● PROC语句:PROC语句表示流内过程的开始,但也可用于编目过程。使用PROC语句定义JCL符号变量的默认值,如果没有分配其他的值,这个默认值将取代用户设定的值。例如:
//MYPROC PROC DSNAME='IBMUSER.DEFAULT.FILE'
● EXEC语句调用过程:分配给EXEC语句上的JCL符号变量的值优先于调用过程的默认值。如:
//STEP1 EXEC PROC=MYPROC,DSNAME='IBMUSER.MY.FILE'
● SET语句:在第1个JCL符号变量使用之前,编写JCL中的SET语句。使用SET语句定义JCL符号变量,它们可以用于:✧ JCL作业流里的JCL语句。✧ 过程中的语句(当既不是EXEC语句调用过程,也不是定义JCL符号变量的PROC语句),如:
//DATA SET DATASET='IBMUSER.TEST.FILE'
● 特别注意:分配给JCL符号的值包含特殊字符('、`、,、.、/、&、*、-、+、(、)、=)必须用但可用引号(`)括起来。