COBOL语言总结(三)--JCL扩展

目录

一、JCL扩展

1、JCL语法规则:

2、JOB语句:

2.1、JOB语句中的位置参数

2.2、JOB语句中的关键字参数

3、EXEC语句

3.1、EXEC语句中的位置参数

3.2、EXEC语句中的关键字参数

3.3、COND参数

4、DD语句

4.1、DD语句中的位置参数

4.2、DD语句中与数据集相关的关键字参数

4.3、DD语句中与设备相关的关键字参数

4.4、JCL的过程


一、JCL扩展

JCL(Job  Control  Language)  即作业控制语言。在大型机中,作业(Job)是用户在完成某任务时要求计算机所做工作的集合。

一个JCL作业必须包含的语句:

        1.JOB语句:作业语句。该语句标志着一个作业的开始,并提供该作业执行时所必要的一些运行参数。

        2.EXEC语句:执行语句。该语句标志着作业中的一个(JOB STEP)作业步的开始,并指明本作业步执行的程序名或过程名。当该语句在过程中时,标志一个过程步的开始。

同一个JOB中的JOB STEP数目不能超过255个。

        3.DD语句:数据定义语句。该语句用于定义应用程序所需的数据文件。这种数据文件通常为一个数据集,不过有时也可以为其他内容,如显示屏等。

      一个作业中的各个作业步是按顺序依次执行的,因此,上一个作业步的输出可以作为下一个作业步的输入。并且,有的时候某一作业步是否执行也是根据上一作业步的执行情况而定的。

1、JCL语法规则:

一、JCL只允许出现系统指定的字符,其他字符将不被系统识别。

JCL字符集包含以下字符:

                1.26个英文字母:A-Z

                2.10个阿拉伯数字:0-9

                3.6个关系字符 GT、GE、LT、LE、EQ、NE。

                4.3个通配符:@、$、#。

                5.10个特殊字符:", . / ( ) * & + - ="

JCL语句除/*语句外均以//作为开始标志。

系统规定每行长度为80列,超过80列通过续行完成。逻辑上将这80列分为5个区域

                1. 标识符区:1-2列,//  特殊情况 /* 或//*

                2.名字区:3列开始, 名字区后必须跟一个或多个空格。名字由1-8个字母,数字以及通配符组成。

                3.操作符区:即JOB,EXEC,DD,PROC,PEND或操作员命令

                4.参数区:用于指定语句中所要用到的参数

                5.注释区:注释说明,注释区后必须跟一个空格。仅当语句中含有参数时,才能写注释信息。

//EXAMPLE  JOB   ,TOM,CLASS=S          THIS IS A COMMENT
JCL语句各区域内容
标识符区//
名字区EXAMPLE
操作符区JOB
参数区 ,TOM,CLASS=S
注释区THIS IS A COMMENT

关于JCL语句中的续行要求:

        1.JCL只允许在参数区和注释区有续行。

        2.当前行的第71列之前参数或子参数,以及参数后的逗号必须是完整的。

        3.新一行的首2列必须为//,第三列为空格,续行内容只能从4-16列开始。当续行内容超过16列时,会被认为是注释内容,而非JCL语句的续行部分。

例子:续行

//DD1      DD   DSNAME = ADCDA,MYDATA,
//  DISP = (NEW, ,KEEP),
//  UNIT = 3390, VOL=SER=WORK01,
//  DCB = (RECFM=FB, LRECL=80, BLKSIZE=4000),
//  SPACE = (TRK,(10,5))

JCL语句:

        JCL语句没有特定的结束标志,下一条语句的开始就象征着本条语句的结束。

        JCL语句除JOB语句,EXEC语句,DD语句外,还有6种附加语句。

                1. //语句:仅有//,表示该语句为空语句。空语句用来标志一个完整作业的结束。

                2./*语句:一种情况:表示流内数据的结束,流内数据通常由DD*或DD DATA引导

另一种情况:调用JES控制语句,JES控制语句是相对于JCL的另一种作业控制语句。

                3.//*语句:表示为注释语句,注释语句中的内容可以为任何注释信息。

                4.PROC语句:在操作符区为PROC时,表示一个过程的开始,该过程既可以为流内过程,也可以为编目过程。

                5.PEND语句:当操作符区中的字符为PEND时,表示一个流内过程的结束。

                6.Command语句:该语句中的内容为操作员在输入流中写入的操作命令。命令包括SORT,MERGE,REPRO等。

2、JOB语句:

JOB语句用于表明一个作业的开始,任何一个作业的第一条语句必须为JOB语句。同时,JOB语句还为作业分配作业名并设置相应的各项参数。

作业名作为JCL语句名字区中的内容。必须遵循该区域中的语法规则。语法规则主要体现在以下两点。

        1、作业名的第一个字符必须为字母或通配符。

        2、作业名的长度不能超过8个字符。

此外,由于系统不能同时运行同名的作业,因此每一个作业都应指定为唯一的名字。

2.1、JOB语句中的位置参数

关于JOB语句中的位置参数,主要有两个。其中一个参数为记账信息,另一个参数为程序员名。记账信息参数位于JOB之后,程序员名参数位于记账信息参数之后。

1、记账信息参数

记账信息参数主要用于记录和作业相关的一些信息。其中包括用户账号、时间、部门号、房间号。记账信息参数可以包含多个子参数,每一子参数用来提供以上某一条信息。记账信息参数及其子参数最多不得超过143个字符。这些字符包括各子参数之间的逗号,但不包括子参数括起来的括号。

//TESE01  JOB  (B867-4092,'16/5/09',BSS)
//TEST02  JOB  B867-4092

2、程序员名参数

程序员名参数用于标明该作业的所有者信息。该信息既可为该作业所有者的真实姓名,也可以为其编号,内容不受限制。程序员名参数最多不得超过20个字符。

//TESE01  JOB  , ERIC
//TEST02  JOB  , ST262

2.2、JOB语句中的关键字参数

1、CLASS参数和MSGCLASS参数

CLASS参数用于指定作业的类别。相同类别的作业将具有相同的处理属性。

作业的类别由一个字符所表示,该字符既可以为A-Z这26个字母,也可以为0-9这10个阿拉伯数字。

//TESE01  JOB  2008, ERIC,CLASS=A
//TEST02  JOB  , ERIC,CLASS=9
//TEST03  JOB  CLASS=G

MSGCLASS参数与CLASS参数类似,其数据也是26个字母或10个数字中的一个字符。不过,该参数指定的是作业日志的输出类别,而非作业的处理类别。

//TESE01  JOB  , ERIC,MSGCLASS=9
//TEST02  JOB  CLASS=A,MSGCLASS=9

2、MSGLEVEL参数

MSGLEVEL参数用于指定作业清单输出的内容及方式。两个参数

第一个参数:主要用于控制作业清单输出的内容,取值内容及对应信息如下。

    1.取值为0:表示仅输出作业中的JOB语句。

    2.取值为1:表示输出作业中的所有JCL语句。

    3.取值为2:表示输出作业中包含输入流中控制语句在内的所有语句。

第二个参数:主要用于控制作业清单输出的方式。该子参数的取值内容及对应信息如下。

    1.取值为0:表示只有在作业异常终止时,才输出相关信息。这些信息包括JCL、JES、操作员以及SMS的各种处理信息。

    2.取值为1:表示无论作业是否异常终止,都输出以上相关信息。

第一个参数默认必须用逗号表示,第二个参数默认时,不必写逗号,并且可去掉逗号。

//TEST10  JOB  MSGLEVEL=(0,1)
//TEST20  JOB  CLASS=A,  MSGLEVEL=(,1)
//TEST30  JOB  MSGLEVEL=2

MSGLEVEL参数中的两个位置子参数默认值都为1。

3、ADDRSPC参数和REGION参数

ADDRSPC参数用于指定作业所需的存储类型。该参数的数据有两种取值。这两种取值及其表示的信息分别如下:

    1.取值为VIRT:表示作业请求的存储类型为虚拟页式存储。

    2.取值为REAL:表示作业请求的是实存空间。

该参数的默认值为VIRT。

//TEST20  JOB  ADDRSPC=VIRT
//TEST30  JOB  ,BOB,ADDRSPC=REAL

REGION参数则用于指定作业所需的虚存或实存的空间大小。该空间用两种单位进行表示,一种为K(KB),另一种为M(MB)。
系统是以每4KB为一个存储单元分配空间的。因此,对于以K为单位的表示方式,前面的数值应该为4的倍数。当其不为4的倍数时,系统会将其增至为一最接近的4的倍数的值。例如:14K--->16K
对于以M为单位的表示方式,当系统未定义具体的上限值时,其空间最大不能超过16MB。

//TEST20  JOB  REGION=16K
//TEST30  JOB  123,BOB,
//      ADDRSPC=REAL,
//      REGION=280K
//TEST40  JOB  ,ANDY, CLASS=A,REGION=2M

REGION参数可以默认,但却不能指定为0。同时该参数也不可以被指定为任何大于系统极限值的数值。否则,以上问题。2种做法将引发存储问题。

4、TIME参数

TIME参数用于指定作业的最长运行时间。当作业运行时间超过该参数所指定的值时,系统将会终止该作业。TIME参数的数据有四种类型:
    1.(minutes,seconds):两个位置子参数。第一个子参数表示分钟数,第二个子参数表示秒数。
    2.MAXIMUM:该数据表示作业的运行时间为357912分钟。
    3.1440:1440相当于分钟数,将其转换为小时即24小时。因此,该数据表示的意义是作业的运行无时间限制。
    4.NOLIMIT:该数据同样表示作业的运行是无时间限制的,与1440数据是等效的。

//TEST20  JOB  ,WENDY,TIME=(8,10)
//TEST30  JOB  ,BOB,TIME=NOLIMIT

当JOB语句中的TIME参数默认时,系统将采用每条EXEC语句中定义的TIME参数。当EXEC语句中的TIME参数也默认时,系统将会采用系统默认的作业步时间限制值。
JOB语句中的TIME参数是指定的整个作业的最长运行时间。对于作业中的各作业步来说,既要满足各自的运行时间,其总和又要满足整个作业的运行时间。

//JOBTIM  JOB  ,TINNA,TIME=5
....
//STEP1     EXEC  PGM=MY1,TIME=3
....
//STEP2     EXEC  PGM=MY2,TIME=3
....
JOB时间5分钟,STEP1+STEP2运行总时间<=5分钟,否则,作业异常终止。

5、NOTIFY参数、TPYRUN参数和PRTY参数

NOTIFY参数:用于在作业运行完毕后发送返回信息给指定用户,其数据为一个TSO用户账号。   如果该用户当前没有登录,则将会在下次登录时收到系统发送的返回信息。通常可以使用&SYSUID数据表示将返回信息发送给自身用户。
TPYRUN参数:主要用于对所写的JCL进行语法检测。通常其数据指定为SCAN,此时提交作业后将不运行该作业,而只是对其进行语法检测。当不确定所写的JCL是否正确,而又不能影响系统的正常执行时,通常使用该参数进行调试。    
PRTY参数:该参数用于指定作业的优先级。优先级使用数字表示,数字越大,优先级越高。优先级的取值范围为0-15    

//TEST01  JOB  2008,NOTIFY=ADCDA
//TEST02  JOB  2009,NOTIFY=&SYSID,TPYRUN=SCAN
//TEST03  JOB  2020,PRTY=10,NOTIFY=&SYSID,TPYRUN=SCAN

在返回信息中重点MAXCC的值。当MAXCC的值为0时,表示作业运行正常。

还有其他一些关键字参数:BYTES、PASSWORD、COND、GROUP、USER、RD、SECLABEL。

3、EXEC语句

EXEC语句用于表明作业或过程中一个作业步的开始,同时为该作业步设置相关参数。
分析一段JCL代码的功能,实际上就是分析其中每一作业步的功能。
EXEC语句注意事项:
    1.一个作业中最多只能有255个作业步。并且,这些作业步还包含在本作业中通过EXEC语句调用的过程中的所有作业步。即一个作业中最多只能含有255条EXEC语句。并且,其中还包括在该作业中所调用的过程中的EXEC语句。
    2.作业步名必须在该作业,及该作业所调用的过程中是唯一的。根据JCL语句名字区中的规定,作业步名也是由字母或通配符开头的1-8个字符和数字所组成。此外,作业步名是可以默认的。


3.1、EXEC语句中的位置参数

EXEC语句中的位置参数有两个,分别为PGM参数和PROC参数。这两个位置参数相对其他位置参数比较特殊,因为这两个位置参数是带等号的。每条EXEC语句中必须有一个位置参数,并且仅能有一个位置参数。

1、PGM参数

作业步是通过调用程序或过程以实现其具体功能的。PGM位置参数便用于指定该作业步所调用的程序名。PGM参数数据的表示有3种方式。
    1、PGM=program-name:直接指定程序名program-name,实现直接调用方式。其中程序名是由1-8个以字母、或通配符开头的字符和数字组成。
    2、PGM=*.stepname.ddname:调用的程序在本作业步之前名为stepname的作业步中指定。
stepname作业步中名为ddname的DD语句中的DSN参数具体决定了本作业步调用的程序。这种情况下实现的是间接调用。
    3、PGM=*.stepname.procstepname.ddname:调用的程序在本作业步之前名为stepname的作业步所调用的过程中指定。该过程的过程步procstepname中的DD语句ddname的DSN参数决定了该程序。这种情况下实现的也属于间接调用。

//JOB01    JOB    CLASS=A
//STEP1    EXEC   PGM=MYPGM
//DD1      DD     DSN=ADCD.LINKLIB(PGM2),
//      DISP=OLD
//STEP2    EXEC   PGM=*.STEP1.DD1
//PROC1    PROC
//JSTEP1   EXEC   PGM=PCPGM
//JDD1     DD     DSN=SAMPLE.LINKLIB(P03),DISP=SHR
//   PEND
//PSTEP    EXEC   PROC=PROC1
//STEP3    EXEC   PGM=*.PSTEP.JSTEP1.JDD1
//

对于以上作业步STEP1,其调用的是名为MYPGM的程序,进行的是直接调用。作业步STEP2调用的程序由作业步STEP1中名为DD1的DD语句决定。该DD语句中的DSN参数指定了一个分区数据集ADCD.LINKLIB中的成员PGM2。该成员即为作业步STEP2所调用的程序,进行的是间接调用。同样,作业步STEP3调用的程序为分区数据集SAMPLE.LINKLIB中的成员P03,也是间接调用。

2、PROC参数

PROC参数用来指定该作业步所调用的过程名。过程名同程序名一样,也是由1-8个以字母或通配符开头的字符和数字组成。

PROC参数所指定调用的过程大体上可以分为两种类型。

    一种为编目过程,此时PROC参数的数据可为该编目过程的成员名或别名。

    另一种为通过PROC语句定义的流内过程,PROC参数的数据为该过程的过程名。

注意:PROC参数指定的过程为流内过程时,该过程必须在本作业步之前进行定义。

//JOB01    JOB   CLASS=A
//INPROC   PROC                                   /* 流内过程*/
//JSTEP1   EXEC  PGM=INPGM
//JDD1     DD    DSN=SAMPLE.PS2
//    PEND                                       /*流内定义结束*/
//SETP1    EXEC  PROC=INPROC                     /*本作业步调用该流内过程*/
//

此外,PROC参数还可以是默认的。

//STEP01    EXEC   PROC=PTEST
//STEP02    EXEC   PTEST
上面例子是等效的语句

总之,PGM参数用于调用程序,而PROC参数用于调用过程。

3.2、EXEC语句中的关键字参数

EXEC语句中部分关键字参数同JOB语句类似。EXEC语句中的参数是针对该作业步,JOB是针对整个作业的。

1、ADDRSPC参数和REGION参数

这两个参数同JOB语句中的用法是一致的。作用范围不同。

//STEP1    EXEC   PGM=PGM1,ADDRSPC=REAL,REGION=10K

2、TIME参数

这个参数同JOB语句中的大体相同。JOB中该参数不可为0。EXEC语句中该参数可为0。代表该作业步的执行时间为前面作业步执行后的剩余时间。

//JOBTIM    JOB   ,TINNA,TIME=6
..
//STEP1    EXEC   PGM=MYPGM1,TIME=2
..
//STEP2    EXEC   PGM=MYPGM2,TIME=3
..
//STEP3    EXEC   PGM=MYPGM3,TIME=0
..
STEP3执行时间 <= 6-STEP1-STEP2的时间

3、ACCT参数

EXEC语句中的记账信息是通过关键字参数ACCT表示的。这点和JOB语句中通过位置参数表示记账信息是不同的。ACCT参数包括其子参数在内最多不能超过142个字符。这些字符包括子参数之间用于分割的逗号,但不包括子参数列表的括号。

//S1    EXEC   PGM=IEFBR14,ACCT=123456

4、PARM参数

PARM参数用于向本作业步所调用的程序传递相关的变量信息。同时,本作业步所调用的程序中也必须有相应的语句用于接收并使用这些信息。
PARM参数包括所有字符在内的总长度不得超过100个字符。对于PARM参数中包含有特殊字符的子参数,需要用撇号将其括起来。

//SP1    EXEC   PGM=P01,PARM='A+B,C=DE'
//SP2    EXEC   PGM=P02,PARM=(AB,CD,'E+F')

5、关键字参数的覆盖
EXEC语句的位置参数为PGM时,不存在覆盖问题。
EXEC语句的位置参数为PROC时,存在覆盖问题。

//MYPROC   PROC
..
//STEP1    EXEC   PGM=MYPGM1,ACCT=2007
..
//STEP2    EXEC   PGM=MYPGM2,ACCT=2007
..
//STEP3    EXEC   PGM=MYPGM3,ACCT=2009
..

//STEP0    EXEC   PROC=MYPROC,ACCT=2008
EXEC语句调用MYPROC过程。该过程中每条EXEC语句的ACCT参数将被覆盖为2008

//STEP0    EXEC   PROC=MYPROC,ACCT.STEP2=2008
EXEC语句调用MYPROC过程。该过程中step2的ACCT参数将被覆盖为2008

3.3、COND参数

      COND参数不仅涉及到本作业步,还涉及到本作业步之前的一些作业步。其作用是根据对先前作业步执行后的返回码进行指定的条件判断,以决定本作业步是否执行。
      在COND参数中,是通过将先前作业步的返回码,与指定的测试码比较以对其进行条件判断的。其中测试码的取值范围为0-4095。而先前作业步的返回码通常为0、4、8、16,以及异常终止码ABEND CODE。对返回码与测试码进行比较的操作符以下6个关系字符。

    GT:大于。
    GE:大于等于。
    LT:小于。
    LE:小于等于。
    EQ:等于。
    NE:不等于。

注意:当测试条件不满足时,系统才执行本作业步。而当测试条件满足时,系统则跳过该作业步不对其执行。这一点和人的正常思维习惯是有所不同的,容易混淆。

//JOBA    JOB   CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1),
//        NOTIFY=&SYSUID
//STEP1    EXEC   PGM=MYPGM1
..
//STEP2    EXEC   PGM=MYPGM2,COND=(4,GE,STEP1)
..
//STEP3    EXEC   PGM=MYPGM3,COND=((16,EQ),(20,LT,STEP1))
..
STEP2在作业步STEP1的返回码小于4的情况下执行。
STEP3的执行需要满足两个条件。
  一个条件是该作业步之前的所有作业步的返回码都不等于16,
  另一个条件是STEP1的返回码大于等于20。

     COND参数判断条件里返回码位置上的作业步名是可以默认的。当作业步名默认时,表示该判断条件应用于本作业步之前所有作业步的返回码。
当存在多个判断条件时,只有全部条件都不满足,本作业步才执行。只要有一个条件满足,本作业步就不执行。
      COND参数中还存在两个子参数,分别为EVEN和ONLY。二者不能同时出现。当COND参数中包含有这两个参数之一时,表示在先前作业步有异常终止的情况下也进行条件判断。否则,在此情况下本作业步不被执行。当EVEN或ONLY子参数设定时,系统都将不去测试先前任何异常终止作业步的返回码。其中EVEN子参数表示无论先前作业步是否异常终止,本作业步都将继续根据判断条件决定是否执行。而ONLY子参数则表示只有当先前作业步异常终止时,本作业步才可能执行。

包含EVEN/ONLY子参数的作业执行情况
先前作业步是否异常终止测试条件是否满足本作业步是否执行
EVEN
EVEN
EVEN
EVEN
ONLY
ONLY
ONLY
ONLY

     COND参数的子参数最多只能为8个。有EVEN或ONLY时,最多只能有7个判断条件。

//JOBB    JOB   CLASS=B,MSGCLASS=A,MSGLEVEL=(1,1),
//        NOTIFY=&SYSUID
//STEP0    EXEC   PGM=MYPGM0
..
//STEP1    EXEC   PGM=MYPGM1,COND=(0,NE,STEP0)
..
//STEP2    EXEC   PGM=MYPGM2,COND=((4,GE,STEP1),EVEN)
..
//STEP3    EXEC   PGM=MYPGM3,COND=((8,LE,STEP2),ONLY)
..
STEP1:在STEP0的返回码为0的情况下将执行。
    同时,若STEP0异常终止,则不进行条件判断,也不执行STEP1作业步。
STEP2:无论此前作业步是否异常终止都将进行条件判断。
    并且,只要满足STEP1的返回码小于等于4,该作业步都将执行。
    如果STEP0异常终止,STEP1将不被执行,STEP1不执行,也就不存在对其返回码进行判断。
    只要STEP0异常终止,STEP2都必将会执行。
STEP3:只有在此前的作业步存在异常终止的情况下才进行条件判断。
    同时,该作业的执行还需满足STEP2的返回码大于8的条件。

最后,COND参数还可用于调用过程的EXEC语句中。此时,COND参数作为关键字参数,可覆盖到该过程的各过程步之中。此外,COND参数中的判断条件也可以为与先前作业步所调用过程中的过程步进行的比较。

//STEP3    EXEC   PROC=MYPROC,
//      COND.PROSTP1=(10,LT,STEP1)
//      COND.PROSTP2=((20,GE,STEP2,SPROC),EVEN)
//STEP4    EXEC   PGM=MYPGM,
//      COND=((50,GE),(8,LE,STEP3,PROSTP2))
以上EXEC语句调用的过程为MYPROC。其中PROSTP1和PROSTP2为该过程中的2个过程步。
而PROSTP2的COND参数中的SPROC则为之前的作业步STEP2所调用过程中的一个过程步。
STEP4作业步的执行情况,则涉及对过程步PROSTP2返回码的判断。

4、DD语句

DD语句主要用于定义数据集及设置与该数据集相关的各种属性。
DD语句的语句名必须满足JCL语句名字区中的要求。即DD语句的语句名也必须为一段由字母或通配符开头的1-8位字符。
一个JOB语句的作业中,可包含多个EXEC语句作业步。
一个EXEC语句的作业步中,可包含多条DD语句的数据定义。
同一JOB语句中的EXEC语句名必须唯一。同样,同一EXEC语句中DD语句名也必须唯一。
不过,不同作业步中的DD语句名则是可以重复的。
DD语句名可由系统指定,代表不同意义。
JOBCAT、JOBLIB、STEPCAT、STEPLIB、SYSIN、SYSPRIN、SYSUT1、SYSUT2、SYSMDUMP、SYSUDUMP、SYSCHK、SYSCKEOV、SYSABEND

用户自定义DD语句名避免和系统定义的相重复。
当为应用程序输入输出文件定义数据集时,其命名规则取决于程序所使用的开发语言。
    COBOL语言:由ASSIGN指定。
    大型机汇编语言:由DCB宏命令指定。
    PL/I语言:由DECLARE语句指定。
    FORTRAN语言:由READ或WRITE语句中的通道号构成。


4.1、DD语句中的位置参数

DD语句中共有3种位置参数,这3种位置参数是可选的,但每次至多只能出现一种。

1、“*”参数

“*”参数用于表示一个流内数据集的开始。并且该参数所引导的流内数据集中的首两列不得为“/*”符号或“//”符号。因为“/*”符号表示流内数据集的结束。“//”符号表示一个新的JCL语句的开始,同时也表示该流内数据集的结束。

//STEP1    EXEC   MYPROC
//CRT.DSA    DD   UNIT=3390
//CRT.INP1    DD   *
123
          ABC
           CREATE
//PRT.DSB    DD   UNIT=180
//PRT.INP2    DD   *
     TEST
          TEST
           PRINT
/*
以上CRT.INP1所标明的DD语句所定义的输入数据将被编目过程中的过程步CRT使用。
而PRT.INP2所标明的DD语句所定义的输入数据将被编目过程中的过程步PRT使用。

2、DATA参数

DATA参数同样也用于引导一个流内数据集。与“*”参数不同的是,DATA所引导的数据集首两列是可以为“//”符号的。此时,系统并不会将其看作一条新的JCL语句,而只是将其视作流内数据集中的一段数据。因此,通过DATA引导的流内数据集只能通过/*语句表示结束。

//STEP2    EXEC   MYPROC
//CREATE.DSA    DD   UNIT=3390
//CRT.INP2    DD   DATA
123
          ABC
//INDATA     DD   DSN=TEST.DATA,SPACE=(TRK,(2,1)),DISP=SHR
/*
//PRT.DSB    DD   UNIT=180
//PRT.INP2    DD   DATA
//      TEST
          TEST
           PRINT
/*
以上第一组输入数据流中的最后一行并非一条DD语句。该行内容仅为其流内数据集中的一段数据。

4.2、DD语句中与数据集相关的关键字参数

DD语句的关键字参数分为两大类:

        一类为与数据集相关的关键字参数,主要涉及到逻辑上的概念。

        另一类为与设备相关的关键字参数,主要涉及到物理上的概念

1、DSNAME参数

DSNAME参数用来指定一个数据集的名字。当该数据集存在时,表示对原有数据集的引用。
当该数据集不存在时,表示对新数据集的命名。参数名DSNAME常被简写为DSN。

//DDA    DD   DSN=A.B.MYLIB(MEMBER1),DISP=SHR
//DDB    DD   DSN=&&TEMP
//DDC    DD   DSN=&&LIB(MEM2),DISP=SHR
DDA语句引用了分区数据集MYLIB中的成员MEMBER1。
DDB语句创建了一个临时数据集。该临时数据集名字的最后一个部分为TEMP
DDC语句引用了一个分区数据集中的成员MEM2。该分区数据集名字的最后一个部分为LIB。

DSNAME参数也可以对之前作业步中DD语句里指定的数据集进行引用。

//STEP1    EXEC   PGM=P01
//DD01    DD   DSN=DATA01.LEVEL01.GROUP01,DISP=(,PASS),
//          UNIT=3390,VOL=SER=WORK04
//DD1    DD   DSN=TEST
//STEP2    EXEC   PGM=P02
//DD02    DD   DSN=*.STEP1.DD01,
//        DISP=(OLD,PASS,DELETE)
//STEP3    EXEC   PGM=P03
//DD03    DD   DSN=*.STEP2.DD02,
//        DISP=(OLD,CATLG,DELETE)
STEP2中DD02的DD语句引用之前STEP1中的DD01语句指定的数据集。
STEP3中DD03的DD语句引用之前STEP2中的DD02语句指定的数据集。
实际引用的为同一数据集。

2、DISP参数

DISP参数用于描述数据集的状态,并指定该数据集在作业或作业步结束后如何进行相应处理。    
格式:DISP(X1,X2,X3)    
第一个参数X1表示执行前数据集的状态。这个位置可以选择的参数有:    
             NEW:分配新的数据集,一般均为OUTPUT时。
            OLD:独占该数据集。
            SHR:JOB STEP执行前已存在,共享该数据集。
            MOD:当数据集不存在时,视为NEW,当数据集存在时独占该数据集且记录追加在该数据集末尾。
第二个参数X2表示JOB STEP正常结束时的处理。这个位置可以选择的参数有:    
            DELETE:删除该数据集,释放所占空间。
            KEEP:保留该数据集,但不登记主目录
            PASS:保留该数据集并传递给后续作业步(用在临时数据集里面,让下一个作业步也可以使用此数据集)
            CATLG保留数据集并登记主目录。
            UNCATLG:保留该数据集但删除在主目录中记录。
第三个参数X3表示JOB STEP异常结束时的处理。这个位置可以选择的参数有:    
            DELETE:删除该数据集,释放所占空间。
            KEEP:保留该数据集,但不登记主目录
            CATLG保留数据集并登记主目录。
            UNCATLG:保留该数据集但删除在主目录中记录。

默认整个DISP参数:DISP(NEW,DELETE,DELETE)
DISP=NEW:DISP(NEW,DELETE,DELETE)
DISP=OLD:DISP(OLD,KEEP,KEEP)
DISP=SHR:DISP(SHR,KEEP,KEEP)
DISP=MOD:DISP(MOD,KEEP,KEEP)
DISP=(,CATLG):DISP(NEW,CATLG,CATLG)

3、DCB参数

DCB全称为Data Control Block,DCB参数即数据控制块参数。该数据集主要用在新创建的数据集上,用于描述数据集的属性。这些属性包括数据集的组织结构,记录格式,逻辑记录长度,记录块大小等。        
DCB参数中子参数:        
    DSORG参数:指定数据集的组织结构。    
        PS或PSU表示顺序数据集
        PO或POU表示分区数据集
        DA或DAU表示直接定位数据集
        IS或ISU表示索引数据集
        默认为PS。
    RECFM参数:指定数据集的记录格式。    
        FB表示定长组块记录格式
        F表示定长不组块记录格式
        VB表示变长组块记录格式
        V表示变长不组块记录格式
    LRECL参数:指定数据集的逻辑记录长度,以字节为单位,对于定长记录,该参数数值为实际记录的长度。对于变长记录,该参数数值为变长记录中最大的记录长度再加上2个字节的控制信息。    
    BLKSIZE参数:指定数据集的记录块大小,以字节为单位。其中最大的记录快大小不得超过32K。    
    并且,对于定长组块的记录,该参数数值必须为LRECL参数数值的偶数倍。当该参数数值为0时,将由系统指定一个最适当的记录块大小。    
以上子参数可写在DCB参数后括号里,也可单独列出来。        

//DD1    DD   DSN=DATA1,DISP=(,CATLG),
//      UNIT=3380,VOL=SER=WORK10,SPACE=(23472,(200,40)),
//      DCB=(DSORG=PS,RECFM=FB,LRECL=80,BLKSIZE=800)
//DD2    DD   DSN=DATA.LIB,DISP=(NEW,KEEP),
//      UNIT=3380,VOL=SER=WORK10,SPACE=(23472,(200,40)),
//      RECFM=FB,LRECL=80,DSORG=PO

4、SYSOUT参数

SYSOUT参数主要用于将相应的数据集标志为一个系统输出数据集。该参数的参数数据可以为一个输出类。输出类同作业类一样,也是由A-Z或0-9中的一个字符所表示。当参数数据为“*”号时,表示输出类与JOB语句中的MSGCLASS参数定义相同。
该参数常用于JCL实用程序中名为SYSPRINT的DD语句中。

//STEP1    EXEC   PGM=TEST01
//SYSPRINT    DD   SYSOUT=*

4.3、DD语句中与设备相关的关键字参数

DD语句中与设备相关的关键字主要有三种功能。

        一种用于指定数据集所在的设备。
        另一种用于指定数据集所在设备上的卷。
        还有一种用于指定设备上分配给数据集的物理空间。

1、UNIT参数

UNIT参数用于为数据集指定物理设备。物理设备通常使用设备类型或设备组名进行描述。
设备组名则由1-8个英文字母组成,表示一台或一组设备。通常设备组名有SYSDA、DASD、TAPE、CART等

2、VOLUME参数

VOLUME参数用于指定数据集所在物理设备上的卷,该参数也可简写为VOL。    
VOLUME参数包含两个关键字子参数。    
            SER子参数:该参数用来直接指定卷标号,卷标号由1-6位数字、字母、通配符或特殊字符所组成。
            REF子参数:该参数通过从其他已知数据集中间接获得卷标号。不过该参数所指定的数据集不能是GDG世代数据集及其成员。

3、SPACE参数

SPACE参数用于对数据集分配存储空间。该参数中的第一个位置子参数用于表示所分配存储空间的单位。
存储空间的单位通常有以下几种。
TRK:表示以磁道为单位进行分配。
CYL:表示以柱面为单位进行分配。
0-65535中的一个数字:表示以字节为单位进行分配。其中在非SMS环境下表示数据的平均块长度,在SMS环境下表示数据的平均记录长度。


4.4、JCL的过程

JCL的过程相当于包含一段JCL语句的模块。该模块可被其他JCL作业调用,并可以进行重载。通常可将经常用到的一段JCL语句编入一个过程,以便于其他作业的编写。JCL的过程通常分为两大类别:
        流内过程:直接在JCL作业中编写。其中使用PROC语句表示该过程的开始,使用PEND语句表示该过程的结束。
        编目过程:存放在分区数据集的一个成员中,其中PROC语句在该过程中是可选的,而PEND语句通常则不应用于该过程。

COBOL语言总结(一)

  • 9
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杀神lwz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值