您的位置:首页 > 其它

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

2007-08-19 15:47 656 查看
《大型机学习之具体技术之-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语法的问题了。。。
五:上面这个程序,提交的确是可以了,也就是提交以后无错,并且在ISPF,3.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中,SYSUT1与SYSUT2 DD语句是不能用别的名称的,我并不知道它们具体代表什么意义,但是我试着把SYSUT2改动了一下,变成SYUT2,然后提交也可以,但是返回码不再是0,而成了12,然后我再想打开生成的新数据集时,又有那种INVALID BLOCK SIZE错误了,我去SDSF的H下面看到有如下的提示语句:
07.30.07 JOB11737 IEC130I SYSUT2 DD STATEMENT MISSING
呵呵,SYSUT2果然是系统内定的名称,可我现在还不知道这地方有这种规定又有什么意义呢?以后要弄清楚这个问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐