大型机学习之具体技术之-JCL练习(一)

来源:互联网 发布:游戏美术设计 3d软件 编辑:程序博客网 时间:2024/05/15 00:44

《大型机学习之具体技术之-JCL练习》

今天试着写一个创建数据集的JCL,可是问题不小啊,虽说看了许多资料,但是有很多地方还是不明白,比如SYSIN,SYSOUT语句是做什么用的,还有。。。

历经磨难,请教人无数才写出了一个没错的JCL

EDIT       CCM417.CREDS.JCL                  Columns 00001 00072

****** *************** Top of Data ******************************

000100 //CCM417A JOB  ,JOHNNY,NOTIFY=CCM417,                                  

000200 //  TIME=2,MSGLEVEL=(1,1)                                               

000300 //**********************************                                   

000400 //*  A JCL EXAMPLE OF CREATE A SDS.                                    

000500 //**********************************                                   

000600 //CRESTEP EXEC PGM=IEFBR14                                             

000610 //SYSPRINT DD SYSOUT=*                                                 

000700 //DD1 DD DSN=CCM417.OH.YEAH,                                          

000710 //  DISP=(NEW,CATLG,DELETE),                                           

000800 //  SPACE=(TRK,(10,2)),RECFM=FB,                                    

000810 //  LRECL=80,UNIT=SYSDA                                                

000900 //SYSIN DD DUMMY                                                       

001000 //                                                                     

****** ********** Bottom of Data ****************************

得到的教训如下:

一:作业名必须是用户名或者是用户名再加上其它字符的形式(但注意不要超过8个),否则会错。原因暂时还不清楚,好像跟什么权限有关。。。

二:数据集名注意不要与已有的重复。

三:格式一定要注意,因为在大机那个简陋的ISPF编辑环境下,没有语法高亮显示,编译出错查看又麻烦,所以,一个逗号,或者一个空格的错误都会让你乱找半天。。。我就因为00800那行中SPACE=(TRK,(10,2)),中在TRK后面少写了一个逗号而找了半天,之郁闷。

四:当SUBMIT时返回红色的错误信息×××××JCL ERROR×××时,这个错误一般是JCL语句的格式错误,比如关键字写错了,数据集有重名等等,在报JCL ERROR以后,进入M.5(也就是ISPF主菜单下的SDSF 进入H,在最后一行(最后一行是最后执行的操作,如果任务没有阻塞的话,肯定是当前发生JCL ERROR的操作),在左边输入?(?号只是让系统把调试信息分门别类的显示出来,感觉适用于我们这些菜鸟)。进入第三个JESYSMSG(在左边输入s),错误提示信息一般都在里面啦,其实JCL ERROR的错误很好懂的,把里面的英文读一下就清楚的差不多了。。。(这一段是从别人BLOG上抄来的,但是我没有找到输?的那个地方,难道他说的M.5下的H不是SDSF.H吗?)

当显示 JOB ×××× SUBMITTED .的时候表明提交成功,并且会看到MAXCC=0,返回码为0,4表示运行正确,返回8,12表示执行错误,至于错误原因,估计不仅仅是JCL语法的问题了。。。

五:上面这个程序,提交的确是可以了,也就是提交以后无错,并且在ISPF3.4下也确实找到了CCM417.OH.YEAH数据集,但是当我在那儿用E命令字打算编辑一下这个数据集,在里面写下一些纪念信息的时候出错啦,右上角提示:Invalid Block Size.我晕,这又是怎么回事呢?的确,我在创建数据集的时候没有指定BLOCK SIZE,因为在ISPF下直接进行数据集创建的时候,如果我把BLOCK SIZE域置空的话,意思是让系统自动选择一个最佳的值 ,看来在JCL方式下这个行不能,于是将000810行修改为:

000810 //  LRECL=80,UNIT=SYSDA,BLKSIZE=160

这下就可以进行编辑,写下纪念信息啦。

六:在我后面又写一个JCL时因为要把流内数据直接写到本作业中新创建的数据集中去,就要用到IEBGENER了,因为IEFBR14其实是个什么都不做的程序。然后这次我没有定义BLOCK SIZE,发现这次数据集定义成功了,并且要写的流内数据也成功写入了,呵呵,原来上面的那个错误的原因是这样子,そうですね

 

 

 

写这个程序时,我在网上,还有资料中看到了好几个示例,但是没有一个可以拿来直接运用的,都要报这样那样的错误,所以综合了半天,改了半天错才弄好这么小一个程序,但是现在还有问题,因为其中的语句:000610 //SYSPRINT DD SYSOUT=* 这一行是从别人那照搬过来的,我并不知道这句代码的作用是什么,所以我试着把这行注释掉我发现作业仍然可以照常提交,并且正确的生成我要的数据集,可见在这个JCL中,这一行不是必需的。然后还有:000900 //SYSIN DD DUMMY 这一句,我只从资料中看到:SYSIN DD 语句定义控制数据集,如果不需要控制语句,可以如下表示:

//SYSIN DD DUMMY

可是我不明白他上面说的控制数据集是什么东西,控制语句又是什么。然后我再次试着将这一行注释掉,我发现:作业仍然可以正常提交,正常运行,得到正常的结果,所以说这一句也不是必需的,不过它们应该有很重要的作用啦,不过我现在还不知道,但是我总归会知道的。

现在看来,上面那个JCL其实可以简化为:

//CCM417A   JOB   ,JOHNNY,NOTIFY=CCM417

//STEP1      EXEC  PGM=IEFBR14

//DD1       DD    DSN=CCM417.OH.YEAH,

//     DISP=(,CATLG),RECFM=FM,

//     SPACE=(TRK,(10,2)),LRECL=80,

//     BLKSIZE=160,UNIT=SYSDA

//

现在看来就3条语句,刚开始那会写得时候真把我难倒了。。。想起来就跟当初自己摸索着学C++时一样,不知道这代码该往哪写,写出来的是代码又咋个执行?呵呵

既然学会了如何创建顺序数据集,那么创建分区数据集也就不难了,代码如下:

//CCM417B   JOB   ,JOHNNY,NOTIFY=CCM417

//STEP1      EXEC  PGM=IEFBR14

//DD1       DD    DSN=CCM417.OH.YEAH2,

//     DISP=(,CATLG),RECFM=FM,

//     SPACE=(TRK,(10,2,5)),LRECL=80,

//     BLKSIZE=160,UNIT=SYSDA

//

 

要注意的是,其中不同的只有一句:SPACE=(TRK,(10,2,5)),这加的第3个数字就是指定了分区数据集中的目录区的大小,既然这个值不为1,那么系统就会替你建立一个分区数据集,而不是顺序数据集了,同样要注意的是也要指定BLKSIZE值,否则当你添加新的MEMBER的时候又要弹出INVALID BLOCK SIZE错误了。

 

下面写个稍微复杂一点的,在创建顺序数据集的同时把一条流内数据写入所创建的数据集中:代码如下

000100 //CCM417B JOB ,JOHNNY,NOTIFY=CCM417    

000200 //CREDS EXEC PGM=IEBGENER              

000300 //SYSPRINT DD SYSOUT=*                 

000400 //SYSUT1 DD *                          

000500    THIS SENTENCE IS ADDED BY JCL.      

000600 //SYSUT2 DD DSN=CCM417.OH.YEAH3,       

000700 // DISP=(NEW,CATLG,DELETE),            

000800 // SPACE=(TRK,(1,1)),RECFM=FB,         

000900 // LRECL=80,UNIT=SYSDA                 

001000 //SYSIN DD DUMMY                       

001100 //    

 

在这个代码中,我发现将000300 //SYSPRINT DD SYSOUT=* 

或者   001000 //SYSIN DD DUMMY  像前面使用 IEFBR14时省略掉都会出错误,结果就是虽说提交成功了,数据集也创建了,但是系统没有对它进行像前面一们的BLKSIZE的赋值,所以当你用E命令编辑的时候会报INVALID BLOCK SIZE的错误,你当然也就看不到你生成的数据集中你写入的信息了。                              

 要注意到上面的JCL中,SYSUT1SYSUT2   DD语句是不能用别的名称的,我并不知道它们具体代表什么意义,但是我试着把SYSUT2改动了一下,变成SYUT2,然后提交也可以,但是返回码不再是0,而成了12,然后我再想打开生成的新数据集时,又有那种INVALID BLOCK SIZE错误了,我去SDSFH下面看到有如下的提示语句:

07.30.07 JOB11737  IEC130I SYSUT2   DD STATEMENT MISSING   

呵呵,SYSUT2果然是系统内定的名称,可我现在还不知道这地方有这种规定又有什么意义呢?以后要弄清楚这个问题。

 
原创粉丝点击