大型機學習之具體技術之-JCL練習(一)


《大型機學習之具體技術之-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果然是系統內定的名稱,可我現在還不知道這地方有這種規定又有什么意義呢?以后要弄清楚這個問題。

 

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com