第2章 作业控制语言(Job ControI Language——JCL)
作业控制语言(Job Control Language——JCL)的起源应追溯到1960年,那时程序员使用的是穿孔卡片而不是终端把他们的作业输入系统中的。编写一个作业实际上就是穿孔卡片,然后由本地读卡器来读取,这些卡片就构成了一个批量作业,每一个卡片含有一个JCL语句,或JCL语句的一部分,并且JCL语句和JCL卡片仍然被同步使用。JCL语句的基本结构从一开始就没有被更改过,即使到了今天,JCL每行80个字符,这个限制来源于穿孔卡片的80列。
2.1 作业控制语言JCL的基本结构
作业控制语言JCL必须包含3个JCL基本语句。
● 作业语句(JOB):标识一个作业的开始,提供必要的运行参数。
● 执行语句(EXEC):标识一个作业步的开始,定义本作业步所要执行的程序或过程。
● 数据定义语句(DD):用于描述应用程序所需要的数据文件。
系统规定这3种语句行必须以“//”开头。下面是一个多步作业的例子。
//JOB1 JOB … //STEP1 EXEC … //DD1 DD … 作业步1 //STEP2 EXEC … //INDD1 DD … 作业步2 //INDD2 DD … //
除了上述3种语句外,JCL还包括6种附加语句。
● /* 语句:表示流内数据结束或调用JES控制语句。
● //*语句:注释语句,由第4列到第80列写出注释内容。
● //语句:空语句,用以标记一个作业的结束。
● PROC语句:流内过程(IN-STREAM PROCEDURE)或编目过程(CATALOGED PROCEDURE)的起始标记。
● PEND语句:标记一个流内过程的结束。
● Command语句:操作员用这个语句在输入流中写入操作命令。
下面是一个完整的JCL实例。
=COLS> ----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- 000001 //IBMUSERA JOB (36512),'IBMUSER',CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1), 000002 // NOTIFY=IBMUSER 000003 //STEP1 EXEC PGM=IEBGENER 000004 //SYSUT1 DD DSNAME=IBMUSER.TEST.BADTRAN,DISP=SHR QSAM OR PDS(MEM) 000005 //SYSUT2 DD DSNAME=IBMUSER.TEST.QSAM2,DISP=OLD QSAM OR PDS(MEM) 000006 //* DISP=(NEW,CATLG,DELETE), 000007 //* SPACE=(TRK,(1,1),RLSE), 000008 //* DCB=*.SYSUT1 000009 //*SYSPRINT DD SYSOUT=* 000010 //SYSPRINT DD DSNAME=IBMUSER.TEST.QSAMX, 000011 // DISP=(NEW,CATLG,DELETE), 000012 // SPACE=(TRK,(1,1),RLSE), 000013 // DCB=(RECFM=FBA,LRECL=121,DSORG=PS) 000014 //SYSIN DD DUMMY 000015 //
一个JCL语句由一个或多个80个字节的记录构成,每一个JCL语句在逻辑上分为下列5个区域。
● 标识符(Identifier):标识符告知系统这一行所包含的是哪一类语句,可能的语句类型有JCL语句、JES语句、注解等。
● 命名(Name):命名区域分配一个名字给特殊的JCL语句,另一个语句可以引用它。
● 操作(Operation):这个区域指出了JCL语句的类型,例如,JOB、EXEC、DD等。
● 参数(Parameter):这个区域可以用来传送除JCL语句以外的信息,JCL语句中的参数紧随操作区域之后,由逗号分开。
● 注解(Comments):注解区域只用于文本描述。程序员在编写语句时,认为有帮助的任何信息都可以写入注解区域内。其格式为:
例://SYSUT1 DD DSNAME=IBMUSER.TEST.BADTRAN,DISP=SHR QSAM OR PDS(MEM)
图2.1显示的是几个常用的JCL语句的例子及编写规则。
图2.1 常用JCL语句的例子及编写规则
标识符区域必须从第1列开始,命名区域,紧随在“//”之后,与标识符区域无任何空格;除此之外,其他区域可以以自由格式输入,也就是说,它们无须从固定列开始,区域之间至少有一个空格,空格是区域之间的分隔符。除注解语句之外,所有的编码区域不能超过第71列。如果区域的总长度超过了71列,由一个或多个随后的语句继续这个区域的执行。
命名区后必须跟一个或多个空格,可以选择合适的名字表达出这个JCL语句的作用。JCL语句的命名规则如下。
● 名字必须从第3列开始。
● 名字的长度必须是1到8个字符。
● 名字的第1个字符必须是字母(A到Z)或通配符(#、@和$)。
● 第1个字符不能是数字(0到9)。
● 剩余的字符可以是字母、数字(A到Z和0到9)或通配符(#、@和$)。
● 名字中不能包括特殊字符或空格。
● JCL字符集如下。
✧ 字母(共26个),即A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R S、T、U、V、W、X、Y、Z。
✧ 数字(共10个),即0、1、2、3、4、5、6、7、8、9。
✧ 特殊字符(共11个),即,、.、/、‘、(、)、*、&、+、-、=。
✧ 通配符(共3个),即 @、$、#(也可分别用X’7C’、X’5B’、和X’7B’表示)。
✧ EBCDIC可打印字符集。
下面的表2.1给出了几个正确与错误的名字区的例子。
表2.1 正确与错误的名字区的例子
操作符区位于名字区之后,规定了语句的类型:JOB、EXEC、DD、PROC、PEND,或操作员命令。名字区后必须跟一个或多个空格。例如:
//EXAMPLE JOB //STEP1 EXEC //INDD1 DD
参数区在操作符区之后,其中包括被逗号分隔的参数,参数由事先规定好的关键字组成,对于这些参数其数值必须是可被代换的变值。参数区没有固定的长度及列的要求。例如:
//EXAMPLE JOB 2000,CLASS=A //STEP1 EXEC PGM=IEYFORT //PRINT DD SYSOUT=A
注解区位于参数区后,用于对相应语句进行注释说明,它可以是任何需要的说明信息,注释区后必须跟一空格。需要注意的是,仅当参数出现时才能书写说明信息,不然容易与参数混淆。
//EXAMPLE JOB ,CLASS=A IT IS A COMMENT
在JCL中,参数区内的参数的类型分为两类。
● 位置参数(positional):与其他参数保持相对位置的参数。
● 关键字参数(keyword):由一个关键字和等号后面的可变数据组成。
如果在一个语句内既有位置参数,又有关键字参数时,所有的关键字参数必须位于位置参数之后。例:
//EXAMPLE JOB 2000, CLASS=A
位置参数 关键字参数
在编写JCL时,一个控制语句在一行的最大长度不能超过71个字符,如果超过了71个字符,需在下一行继续编写此语句。值得注意的是,命令语句、注解语句、分割语句和空语句只限于单行,它们不能有继续行,所有其他的JCL语句,或者在参数区,或者在注解区域,可以有继续行。
一条语句想在下一行继续编写,本行必须结束在第72 列之前,以一个完整的参数或子参数后面加逗号“,”结束。例如:
//DD1 DD DSNAME=SWITCH.LEVEL18.GROUP12,UNIT=3350,
下一继续行的编写,必须在第1列和第2列以双斜线“//”开始,后面至少一个空格。语句继续部分的编写可以从第4列到第16列的任意位置开始。例如:
// VOLUME=335023,SPACE=(TRK,(80,15)),DISP=(,PASS)
如果参数已超过71列,不能在JCL语句中的第71列上编写单引号,因为系统的解释是由单引号作为语句的最后一个字符,继续行为就会被忽略掉。例如:
71列 // COMMAND 'R0 MVSA,S GTF.RLW,,,MBR=UNITTEST,SPC=(CYL,(100,100)),VLSR=' // VOL=SER=VOL001,'',ODSN-W123456'
为避免这种错误,即使把参数分开,也要将单引号放在下一继续行里。正确的写法如下所示。
// COMMAND 'R0 MVSA,S GTF.RLW,,,MBR=UNITTEST,SPC=(CYL,(100,100)),VLSR= // 'VOL=SER=VOL001,'',ODSN-W123456'
如果想要继续一个注解区域,在本行第72列之前的任何位置都可以中断,但在第72列上不能出现空字符,下一继续行双斜线“//”之后,在空至少一个空格后的任何位置可以继续编写注解。例如:
// COND.BILL=((20,GE),(30,LT,CHGE)) THIS STATEMENT CALLS X // THE BILLING PROCEDURE AND SPECIFIES RETURN CODE TESTS X // FOR THREE PROCEDURE STEPS.
注解的继续是非常混乱的,可能会导致JCL错误或看不到注解。建议连续使用几个注解语句,因为这样便于阅读。例如:
// COND.BILL=((20,GE),(30,LT,CHGE)) //********************************************************************* //* THIS STATEMENT CALLS THE BILLING PROCEDURE AND SPECIFIES RETURN //* CODE TESTS FOR THREE PROCEDURE STEPS. //*********************************************************************
下面是一些JCL语句的例子。
作业语句 //MYJOB1 JOB,’IBMUSER’,MSGLEVEL=(1,1), JOB EXAMPLE 作业语句续行 // MSGCLASS=Q,CLASS=A //*-----------------------* 注释语句 //* IT IS A JOB EXAMPLE * //*-----------------------* 执行语句 //STEP1 EXEC PGM=IEFBR14 DD语句 //DD1 DD DSN=IBMUSER.TEST.JCL1,DISP=(,CATLG), DD语句续行 // SPACE=(TRK,(5,2)), UNIT=SYSDA DD语句 //DD2 DD DSN=IBMUSER.TEST.COCBOL,DISP=(,KEEP), DD语句续行 // SPACE=(TRK,(5,5)), UNIT=SYSDA