本文轉自《http://leowzy.iteye.com/blog/888931》
-----------------------------------------------------------------------------
整理筆記 很TM煩,不過效果確實蠻好的,所以。。。硬着頭皮,接着寫吧。
筆記內容:
作業控制語言JCL(類似UNIX下的shell語言)是批處理作業的用戶與操作系統的接口 。
作業(作業步1,作業步2,……,作業步n),作業步1……作業步n是順序執行的 。
作業由以下三步組成:
(1)、編譯 (2)、連接編輯(3)、執行
-
JCL語句的分類:
[基 本語句] (必須以“//”開頭)
1、作業語句(JOB):標識一個作業的開始,提供必要的運行參數。
2、執行語句(EXEC):標識一個作業步的開始,定義本作業步所要執行的程序或過程。
3、數據定義語句(DD):描述應用程序所需要的數據文件。
[附加語句]
4、/*:流內數據結束或調用JES控制語句。
5、//*:注釋語句,注釋內容寫在第4列到第80列。
6、PROC:流內過程或編目過程的起始標記。
7、PEND:標志一個流內過程的結束。
8、Command:在輸入流中 寫入操作命令。
JCL語法規則:
[JCL字符集]
26個大寫字母+10個數字+10個特殊字符+6個通配符+EBCDIC可打印字符集(X‘40’~X’FE‘)
其中,特殊字符的相關說明如下:
",": 分隔參數、分隔子參數JOB (2000,100,300),GOND=(9,LT)
"=":分隔關鍵字參數與它的值CLASS=A
"(b)":括起子參數列表或PDS、PDSE的成員名
"&" :標志一個符號參數&LIB
"&&": 標志一個臨時數據集命&&TEMPDS標志一個流內或系統輸出數據集命&&PAYOUT
"." : 分隔受限數據集名字的各個部分ST018.PDS.DATA
分隔一些特定參數與子參數的各部分nodename.userid
"*" : 提及一條先前的語句 OUTPUT=*.name在特定語句內標志特定功能//ddname DD*
" ' ":括起含有特殊字符的參數值william' lin應該轉換為'william'' lin'
"(空格)":划分域
[JCL語句格式規范]
語句80列: 標識符區(//或/*或//*)+名字區(1~8列)+空格+操作符區(JOB ....)+空格+參數區+說明區
需要注意的地方:
1、為免混淆,僅當參數出現時才能寫說明信息.
2、參數區的書寫詳見下面的[參數規則]
3、JCL只允許參數區和說明區有續行。當需要續行時,在當前行的第71列前必須將某個參數或某個
子參數以及參數后的逗號寫完整,且下一行第1、2列為“//”,第3列為空格,續行的內容只能從
第4~16列開始(16列后開始的話將被認為是注釋語句的續行 )。=_= !!
//DATA DD DSN=SYS1。FORTLIB,
// DISP=OLD
4、注意用空格來划分區域!
[JCL參數規則]
位置參數:與其他參數保持相對位置的參數
關鍵字參數:由一個關鍵字和等號后面的數據組成
1、位置參數和關鍵字參數之間用逗號隔開,不允許有空格,切記切記。
2、關鍵字參數必須寫在同一級別的關鍵字參數之后。
3、缺省(不等於沒有)某個位置參數或某個子參數時,必須用逗號指明所在位置
若缺省的是最后一個位置參數,則逗號可以省略
//EXP JOB (2000,,9),CLASS=A
//SYSTEM JOB ,SYSTEM,CLASS=S,MSGLEVEL=(0,0)
4、如果沒有任何位置參數,則不必書寫任何內容表示//EXP JOB class="A"
5、含有特殊字符的參數一般要用“' ”將其括起來。其中,'用''表示,&用&&表示....
(這個有點復雜,有待進一步研究)
6、位置參數和關鍵字參數最多只能有兩級子參數。
[JCL語法實例]
//EXPJOB JOB,'USERNAME',MSGLEVEL=(1,1),EXAMPLE#作業語句,EXAMPLE為注釋
//MSGGLASS=Q,CLASS=A#作業語句續行
//******************#注釋語句
//*IT'S AN EXAMPLE*
//******************
//STEP1 EXEC PGM=IEFBR14#執行語句
//DD1 DD DSN=MJSN.TEAM01.ONE,DISP=(,GATLG),#DD語句
//SPACE=(TRK,(5,2)),UNIT=SYSDA#DD語句續行
//DD1 DD DSN=MJSN.TEAM01.TWO,DISP=(,KEEP),#DD語句
//SPACE=(TRK,(1,1)),UNIT=SYSDA#DD語句續行
PS: 注釋有兩種方法,記住了哦^_^
JOB語句:
語句格式://作業名 JOB 位置參數[,關鍵字參數][,關鍵字參數]...[注釋說明]
作業名建議為USERID+數字或字符
[位置參數]
1、記帳信息 :提供用戶使用系統的合法性、機時及紙張收費管理等。
格式:([account-number][,accounting-information]...)
account-number:用戶帳號
accounting-information:附加記帳信息,如部門..等
//ST018A JOB (ST018,'6/7/2006',PGMBIN)
//ST018B JOB ST018
2、程序員名 :表示作業的所有者(owner)信息,長度不得超過20個字符
//ST018A JOB 2006,W.I.L.L.I.A.M
//ST018B JOB 2006,WILLIAM
//ST018C JOB 2006,'WILLIAM''LIN'
例子:
全部位置參數: //ST018EXP JOB (20006,60),WILLIAM,CLASS=S,....
缺省記帳信息: //ST018EXP JOB ,WILLIAM,CLASS=S,....
不帶位置參數: //ST018EXP JOB class="S",....
[關鍵字參數]
1、ADDRSPC :指明作業 所需之存儲類型。有兩個子參數:VIRT(缺省)、REAL。前者表示作業請求頁式存儲,后者表示作業請求實存存儲空間。
2、BYTES : 指明打印作業的系統輸出數據集的最大千字節數,並指出當超過所為最大字節數時系統對作業的處理方式。處理方式包括:CANCEL(取消且不轉儲)、 DUMP(取消且轉儲)、WARNING(繼續作業且發出警告信息)。類似BYTES(千數)的關鍵字參數有:CARDS(卡數)、LINES(行數)、 PAGES(頁數)。
3、CLASS :規定作業的類別,JCL可選的作業類別有36個,用字母A~Z、數字0~9表示。相同類別處於同一輸入隊列等待執行。
4、MSGCLASS :對作業日志(job log:與作業相關信息的記錄)設置輸出類別。類別種類和CLASS中的類別一樣。
5、MSGLEVEL :控制JCL作業輸出清單的內容。格式:MSGLEVEL={[statements][,messages]}。其中,statements、messages的說明如下:
statements=0:僅打印出作業的JOB語句
=1:打印出作業中包括過程語句在內的所有JCL語句
=2: 打印出輸入流中的所有控制語句
messages=0:僅當作業 異常終止時,才打印出有關JCL、JES、操作員及SMS的處理信息
=1:無論作業是否異常終止,都打印出有關JCL、JES操作員及SMS的處理信息。
例如://EXMP JOB ,MSGLEVEL=(2,1)
//EXMP JOB ,JSGLEVEL=0
//EXMP JOB ,MSGLEVEL=(,0)
6、NOTIFY :請求系統在后台作業處理完畢時給指定用戶發信息。NOTIFY={USERID}
※ &SYSUIDと指定すると、そのJOBの実行ユーザーにメッセージがきます。
7、PRTY :為輸入隊列設置優先級。PRTY=priority。priority的取值范圍:0~15(JES2)、0~14(JES3)。對於同一優先級的作業,采用FIFO的方法執行。
8、REGION :指定作業所需的實存或虛存空間的大小
REGION={valueK}
={valueM}
例子://ACCT1 JOB A23,SMITH,REGION=100K
//ACCT2 JOB A23,REGION=2M
9、TIME :指定作業占用處理器的最長時間。當作業時間超過限制后,系統將終止該作業。
TIME={([minutes][,seconds])}
={1440}#無限制
={NOLIMIT}#無限制
={MAXIMUM}#運行時間為357912分鍾
10、TYPRUN :請求特殊的作業 處理
TYPRUN={COPY}#僅支持JES2;請求JES2將輸入作業流直接拷貝的輸出數據集進行處理。
={HOLD} #請求系統在執行前將其掛起,等待某特定事件發生。
={JCLHOLD}#請求JES2在JCL執行前掛起,直到操作員將其釋放。
={SCAN}#只對作業的JCL進行語法檢查,不執行也不分配設備。
11、(待續……)
EXEC語句:
//[作業名] EXEC 位置參數[,關鍵字參數]...[符號參數=值]...[注釋]
[位置參數]
有兩個位置參數,只能二選其一。
1、PGM :指明所要執行的程序名。該程序必須是PDS的成員或系統庫、私有庫及臨時庫的PDSE的成員。調用方法有直接調用和間接調用。
PGM={program-name}
={*.stepname.ddname}
={*.stepname.procstepname.ddname}
program-name:指明要執行程序的成員名或別名,程序名由1~8個字母或通配符開頭的字符數字構
成。
*.stepname.ddname:表示要執行的程序名由本作業步前名為“ stepname” 的作業步內名為
”ddname”的DD語句的DSN參數決定。
*.stepname.procstepname.ddname:表示要執行的程序名由本作業步前名為“stepname”的作業步
里所調用過程名為“procstepname”的過程步中相應名為“ddname”DD語句的DSN參數決定。
2、PROC :指明作業步所要運行的過程名。格式如下:
{RPOC=procedure-name}
{procedure-name}
//SP EXEC PROC=PAYWRKS
//SP EXEC OPERATE
procedure-name:調用的過程名可以是:編目過程的成員名或別名;由PROC語句定義的流內過程的過程名,該流內過程必須在本作業內且本作業步前定義。
[關鍵字參數]
P.S 作用范圍僅限於本作業步,總的書寫格式:關鍵字參數[.過程步名]=值
1、ACCT :指明作業步所需懂的一個或多個記帳信息子參數.格式:ACCT[.過程步名]=(記帳信息)
//STP3 EXEC PROC-=LOOKUP,ACCT=('/83468')
2、ADDRSPC :指明作業步所需之存貯類型,方法同JOB中的ADDRSPC參數.
3、REGION :同JOB語句中的REGION
4、TIME :同JOB中的TIME
5、COND :用於對先前作業步執行的返回碼(return code)進行測試,以決定是否執行本作業步.當條件滿足時(有一個滿足即可)系統不執行本作業步,即跳過本作業步.格式如下:
COND[.過程步名]=(code,operator)
=((code,operator[,作業步名][,過程步名])
[,(code,operator[,作業步名][,過程步名])],...[,EVEN])
[,ONLY]
COND=EVEN
COND=ONLY
說 明:最多可測試8個返回碼,EVEN(ONLY)也算一個返回碼的名額.code0用來與返回碼的比較,取值范圍0~4095。operator表示比較 類型,GT(大於)、GE(大於等於)、EQ(等於)、NE(不等於)、LT(小於)、LE(小於等於)。EVEN表示無論先前作業步是否異常終止,本作 業步都要執行(測試先哦)。ONLY表示只有先前作業步異常終止時,本作業步才執行(還要測試滴)。
//STEP2 EXEC PGM=DUMPINT,COND=((16,GE),(90,LE,STEP1),ONLY)
//STP4 EXEC PROC=BILLING,COND.PAID=((20,LT),EVEN),
//COND.LATE=(60,GT,FIND),
//COND.BILL=((20,GE),(30,LT,CHGE))
6、PARM :用於向本作業步執行的程序傳遞變量信息。該程序必須有相應的指令接受這些信息。
PARM[.過程步名]=子參數
=(子參數,子參數)
=('子參數',子參數)
='子參數,子參數'
//RUN1 EXEC PGM=APG22,PARM='P1,123,P2=5'#將參數P1、123、P2=5傳遞給APG22
//STP6 EXEC PROC=ASFCLGP,PARM.LKED=(MAP,LET)
#將參數MAP、LET傳遞到過程ASFCLG中名為LKED的過程步
DD語句:
//[dd名 ] DD [位置參數][,關鍵字參數]...[注釋]
[過程步名.dd名]
//[dd名 ]DD
[過程步名.dd名]
dd名不能與系統定義的dd名重復
[位置參數]
此三者取其一
1、* :開始一個流內數據。數據記錄跟在DD語句之后,其第一、第二列不能是“//”或“/*”(因為這兩個符號標記了流內數據記錄的結束)。倘若數據記錄需要以“//”開始,就必須以DATA參數代替*。
//INPUT1 DD *
.
.
data
.
//INPUT2 DD .....
//STEP2EXEC PROC=FRESH
//SETUP.WORK DD UNIT=3400-6,LABEL=(,NSL)
//SETUP.INPUT1 DD *
.
.
data
/*
//PRINT.FRM DD UNIT=180
//PRINT.INP DD *
.
.
data
/*
注意數據集所對應的過程步名.
2、DATA :用於一個流內數據的開始,該流內數據可以含有以“//”開頭的語句。數據記錄以“/*”來結束。用法與“*”參數基本類似。
3、DUMMY :用於標明(1)沒有設備或外存空間分配給該數據集(2)對該數據集不進行狀態處理(3)對BSAM或QSAM來說,不對該數據集作輸入輸出操作。
//OUTDD1 DD DUMMY,DSNAME=X.X.Z,UNIT=3380,SPACE=(TRK,(10,2)),DISP=(,CATLG)
該DD語句定義了一個空數據集.該語句出DUMMY以外的參數將接受系統語法檢查但並不起作用.
[關鍵字參數]
總的可分為兩類,一類是與設備相關的,另一類是與數據集或數據相關。
1、UNIT :用於請求物理設備
{UNIT=([三位設備地址][,設備數][,DEFER])}
[/三位設備地址][,P]
[/四位設備地址][,]
[設備類型]
[設備組名]
{UNIT=AFF=DD名}
設備地址:通過設備地址指定設備.
設備類型:通過設備類型指定設備,這個名稱通常是數字.比如通過3480、3422指定磁帶機,3340、3375、3380、3390指定磁盤機。
設備組名:通過設備組名請求一台或一組設備.組名有1~8個字母符號構成,常見的有SYSDA、DASD、TAPE、CART等。如果需要直接訪問的存儲設備時,參數可以設置為:UNIT=DASD。
設備數:所需設備數量,1~59取值.
例子:
//STEP2 EXEC PGM=POINT
//DDX DD DSNAME=EST,DISP=MOD,
// VOLUME=SER=USER01,
// UNIT=(3390,2)
//DDY DD DSNAME=ERAS,DISP=OLD,UNIT=3390
//DDZ DD DSNAME=RECK,DISP=OLD,
// VOLUME=SER=USER01,UNIT=AFF=DDX
//DD3 DD DSNAME=COLLECT,
// DISP=OLD,
// VOLUME=SER=1095,
// UNIT=(3490,,DEFER)
DDX請求分配兩個3390設備,DDZ申請分配與DDX相同的
兩個設備,DDY申請分配一個3480設備。DD3所請求的磁帶卷只到數據集
被打開時才會裝載。
2、VOLUME : 指定所引用(或者是新建)數據集所在的卷或卷組。在使用這個參數時,用戶可以指定一個特定的卷、一組卷、具有特定序列號的卷或另外一個數據集所使用的卷。 對於一個跨越多個卷的數據集來說,這個參數還可以用來指定首先被處理的卷。對於一個新建的數據集來說,可以通過不指定VOLUME參數或在VOLUME參 數中不指定SER和REF子參數的方法在任何一個卷或卷組上創建該數據集,我們稱這種方法為非特定卷。
{VOLUME}=([PRIVATE][,RETAIN][,卷順序號][,卷數])
VOL =[,][, ]
[SER=序列號]
[SER=(序列號[,序列號]...) ]
[,] [REF=數據集名]
[REF=*.DD名]
[REF=*.作業步名.DD名]
[REF=*.作業步名.過程作業步名. DD名]
PRIVATE:申請一個私有的卷。這里的私有卷是指:
(1)除非使用VOLUME=SER子參數明確地請求這個卷,否則系統不會在這個卷上分配輸出數據集。
(2)對於一個磁帶卷來說,除非指定了RETAIN子參數或在DISP參數中指定PASS,否則這個磁帶卷將會在數據集關閉后被卸載。
(3)對於一個可卸載的直接訪問卷來說,這個卷將在數據集關閉后被卸載。
RETAIN:對於一個私有磁帶卷來說,指定RETAIN子參數表示在數據集關閉后或在作業步結束后,這個卷不會被卸載;對於一個公共磁帶卷來說,如果這個卷在作業中被卸載,它將保留在相應的設備上。
卷順序號:用來在一個多卷的數據集中確定開始處理的卷。卷順序號為1~255的十進制數,第一個
卷的順序號為1,卷的順序號必須小於等於數據集所占用的實際卷數,否則作業將會失敗。如果不指定卷順序號,則系統從1開始處理。對於一個新數據集系統將忽略所指定的卷順序號。
卷數:用來確定一個輸出數據集所申請的卷的最大數量。卷數為1~255的一個十進制數,在一個作業步中所有的DD語句中的卷數總和不能超過4095。
SER :通過卷的序列號用來確定數據集占用或將占用那些卷。一個卷的序列號為1~6個字符,可以包含字母、數字和$、#、@等特殊字符。不足6位的序列號將被空 格填滿。在一條DD語句中最多可以指定255個卷序列號。不要在一個SER子參數中指定重復的序列號,無論是磁帶卷還是磁盤卷,每個卷都應該有唯一的卷序 列號。不要將序列號指定為SCRTCH、PRIVAT或Lnnnnn(L后有五個數字),這些名字已經被用在請求操作員裝載卷的消息中;不要將序列號指定 為MIGRAT,這個名字被DFHSM Data FacilityHierarchical Storage Manager)用來做數據集的移植。
REF:用來表示系統將從其它的數據集或前面的DD語句中獲得卷序列號的信息。
例子:
//OUTDD DD DSNAME=TEST.TWO,DISP=(NEW,CATLG),
//VOLUME=(,,,3,SER=(333001,333002,333003)),
//SPACE=(TRK,(9,10)),UNIT=(3330,P)
//NEXT DD DSNAME=TEST.TWO,DISP=(OLD,DELETE)
//
//STEP1 EXEC PGM=....
//DD1 DD DSN=OLD.SMS.DATASET,DISP=SHR
//DD2 DD DSN=FIRST,DISP=(NEW,CATLG,DELETE),VOL=REF=*.STEP1.DD1
3、SPACE :為新建數據集分配磁盤空間,對於磁帶卷不起作用。請求空間分配一般有兩種方法:一是告知系統所需空間大小,由系統來分配合適的空間;二是請求系統分配某個特定的空間,如:從某個特定磁道到另一個特定磁道。
當用第一種方法時,用戶告訴系統所要分配空間的存貯單位及存貯空間單位的數量。存貯單位可以是磁道(TRK)、柱面(CYL)、塊長及記錄長。不同類型的磁盤設備其磁道、柱面容量也不同,所以為數據集分配空間時,要清楚用戶所用的設備類型及磁道、柱面的容量。
格式(由系統分配空間):
SPACE=({TRK,}(初次分配數量[,再次分配數量][,目錄空間])[,RLSE][,CONTIG][,ROUND])
({CYL,}[,][,索引][,][,MXIG ])
({塊長度, }[,ALX ]
({記錄長度,}[, ]
Notes:SPACE的子參數均為位置參數
說明:
TRK:表示系統以磁道為單位分配空間。
CYL:表示系統以柱面為單位分配空間。
塊長度:用來指定數據的平均塊長度(字節),塊長度是0~65535的一個十進制數,這里指定的塊長度用來作為空間分配的單位。
記錄長度:在SMS環境下用來指定數據的平均記錄長度(字節),記錄長度是0~65535的一個十進制數。這里指定的字節數用來作為空間分配的單位。當記錄長為0時,將不對存儲空間進行分配。
初 次分配數量:初次為數據集分配的空間的大小,單位為磁道、柱面等。如果使用TRK或CYL作為單位為一個分區數據集分配空間,則初次分配的空間包含了目錄 空間;如果使用塊長度或記錄長度作為單位為一個分區數據集分配空間,則初次分配的空間不包含目錄空間,系統另外分配目錄空間。所要求的卷必須有足夠的空間 用於初次分配,否則作業將失敗。
再次分配數量:當初始量指定的空間大小不能滿足需要時,系統會根據追加量為用戶分配附加的存儲空間。這種分配是動態分配,所以空間可以不連續,最多可以追加15次。
目錄空間:用於指定分區數據集目錄區的空間大小,以256字節為塊單位進行分配,每個塊長可以包含5個成員名。索引:對於一個索引順序數據集的索引來說,用來指定索引區所需的空間,以磁道或柱面為單位,指定的磁道數應該等於一個或多個柱面。
RLSE:表示在數據集關閉時,那些分配給數據集但沒有被使用的空間將會被釋放。前提條件是數據集必須為了輸出被打開並且最后一個操作為寫操作。
CONTIG:指定分配給數據集的空間必須是連續的,這個子參數僅僅影響初次分配。
ROUND:當存儲單位為“塊長度”時,表示分配的空間必須等於整數柱面,其它情況下忽略這個子參數。
MXIG:要求為數據集分配的空間必須1.是卷上最大的連續空間;2.大於或等於初次分配的空間大小。這個子參數僅僅影響初次分配。
ALX:作業在分配空間時將獲得卷上最多5個最大的連續空間,並且每一個空間都應大於或等於初次分配的空間大小。這個子參數僅僅影響初次分配。
格式(申請特定的磁道):
SPACE=(ABSTR,(初次分配數量,地址[,目錄空間]))
[,索引]
格式:僅請求目錄空間:
SPACE=(,(,,目錄空間))
說明(申請特定磁道):
ABSTR:表示將在卷上特定的位置為數據集分配空間。初次分配數量:指定為數據集分配的磁道數,要求卷上必須有足夠的空間。地址:指定分配的第一個磁道的磁道號,第一個柱面上第一個磁道的磁道號為0。
例子:
//DD2 DD DSNAME=PDS12,DISP=(,KEEP),
// UNIT=3350,
// VOLUME=SER=25143,
// SPACE=(CYL,(10,1,10),,CONTIG)
在DD語句中定義了一個新的分區數據集,系統將為這個數據集分配10個柱面,其中創建10個256字節的記錄作為目錄。由於指定了CONTIG子參數,系統將在卷上為數據集分配10個連續的柱面.
//REQUEST1 DD
// DSNAME=EXM,DISP=NEW,
// UNIT=3330,VOLUME=SER=606674,
// SPACE=(1024,75),DCB=KEYLEN=8
在本例的DD語句中根據塊長分配空間,數據的平均塊長為1024字節,需要申請75個數據塊,每一個數據塊前都需要有一個8個字節長的鍵,系統將會根據UNIT參數指定的設備計算需要多少個磁道。
下面我們以3380磁盤為例,來看看space參數的使用情況,計算我們實際分配給數據集的空間大小:例1:Space=(CYL,3)3*15*47476=2136420字節
例2:Space=(TRK,3)3*47476=142428字節
例3:Space=(800,300)800*300=240000字節
4、DISP :向系統描述數據集的狀態,並且可以設定系統在作業步或作業結束時如何處理相應的數據集。
格式:
{DISP=狀態}
{DISP=([狀態][,正常結束參數][,非正常結束參數])}
DISP= ([NEW] [,DELETE ] [,DELETE ])
[OLD][,KEEP ][,KEEP ]
[SHR][,PASS ][,CATLG ]
[MOD] [,CATLG ][,UNCATLG]
[, ][,UNCATLG]
[,]
Notes:所有的子參數均為位置參數。
狀態參數說明:
NEW—表示在當前作業步中創建一個新的數據集。
OLD—表示該數據集在當前作業步運行之前已經存在,並且當前作業步將以獨占的方式使用這個數據集。
SHR—表示該數據集在當前作業步運行之前已經存在,並且當前作業步將以共享的方式使用這個數據集,也就是說其它的作業也可以同時使用這個數據集。這個參數值也可以寫成SHARE。
MOD—表示下列兩種情況之一:1.數據集已經存在,記錄將被添加到數據集的結尾,這個數據集必須是順序的;2.一個新的數據集將被創建,在任何一種情況下數據集都將以獨占的方式被使用
正常結束參數說明:
DELETE—表示在作業步正常結束后,該數據集將不再需要而被刪除,所占用的空間將會被釋放。KEEP—表示在作業步正常結束后,該數據集仍將繼續保留在相應的卷上,它是缺省值。
PASS—表示該數據集將會被保留傳遞到同一作業的后續作業步中被使用。
CATLG—在作業步正常結束后,系統將對數據集進行編目,在系統編目或用戶編目中設置相應的入口指針指向該數據集。
UNCATLG—在作業步正常結束后,系統解除對數據集的編目,在系統編目或用戶編目中刪除相應的入口指針和索引。
•DISP參數缺省:
•NO DISP : DISP=(NEW,DELETE,DELETE)
•DISP=OLD : DISP=(OLD,KEEP,KEEP)
•DISP=(,CATLG): DISP=(NEW,CATLG,CATLG)
•DISP=NEW : DISP=(NEW,DELETE,DELETE)
•DISP=SHR : DISP=(SHR,KEEP,KEEP)
•DISP=MOD : DISP=(MOD,KEEP,KEEP)
例子:
DISP//IXSAMP06 JOB ‘MZ’,’GZ’,…
//…
//STEP0X EXEC PGM=PROGRAM1,PARM=(…,…)
//DS1 DD DSN=TE02.DS1,DISP=NEW
這里把DISP=NEW相當於DISP=(NEW,DELETE,DELETE)。也就是說當作業步第一次訪問這個數據集的時候,系統會試圖創建這個數據集,如果作業步正常結束或者不正常結束則刪除該數據集
5、DCB :數據控制塊參數,用於描述數據集的屬性特征,包括記錄長度,格式和記錄塊大小等,新建數據集時必須設置該參數。
格式:
[ DCB=(子參數[,子參數]...)]
[ DCB= ( {數據集名}[,子參數]...)]
[( {*.DD語句名})]
[( {*.作業步名.DD語句名})]
[( {*.作業步名.過程作業步名.DD語句名})]
子參數介紹:
RECFM:用於指定記錄格式。
RECFM=FB(定長組塊記錄)F (定長不組塊記錄)VB(變長組塊記錄)V (變長不組塊記錄)
LRECL:用於指定數據集的記錄長度。LRECL=bytes對於定長記錄,LRECL的值為實際記錄的長度;對於變長記錄,LRECL的值為最大記錄長加上4個字節的控制信息。
BLKSIZE:指定數據集記錄塊的大小。BLKSIZE=bytes最大的塊長為32K,對於定長組塊記錄,BLKSIZE的值必須是LRECL的整數倍。對於變長組塊記錄,情況復雜一些,要多8個字節的控制信息。
例1//DD1 DD DSNAME=ALP,DISP=(,KEEP),// VOLUME=SER=44321, UNIT=3400-6,// DCB=(RECFM=FB,LRECL=240,BLKSIZE=960)DD語句DD1中定義了一個名為ALP的新的數據集。在DCB參數中包含了用 以完成數據控制塊的必要信息。
例:
//DD4 DD DSNAME=JST,
// DISP=(NEW,KEEP),UNIT=SYSDA,
// SPACE=(CYL,(12,2)),DCB=(A.B.C,KEYLEN=8)
DD語句DD4中定義了一個名為JST的新的數據集,並且要求系統參照一個已編目的數據集A.B.C的DCB信息來確定本語句中的DCB參數的值,通過指定子參數KEYLEN來將相應的定義覆蓋。
6、SYSOUT : 通過SYSOUT參數可以將相應的數據集標志為一個系統輸出數據集,同時SYSOUT參數還可以完成以下的定義:(1)將這個系統輸出數據集與一個輸出類 關聯起來;(2)不通過JES而是要求一個外部的書寫器程序來處理這個系統輸出數據集;(3)指定這個數據集被打印輸出的格式;(4)引用JES2的 /*OUTPUT語句。
系統輸出數據集根據下面的輸出定義順序被處理:(1)在SYSOUT DD語句中指定的選項;(2)參考JCL的OUTPUT語句中指定的選項;(3)參考JES2的/*OUTPUT語句中指定的選項或(4)JES3的 //*FORMAT語句中指定的選項;(5)相關的輸出類的缺省值。
格式:
SYSOUT= { 輸出類}
{ * }
{ ([輸出類] [,書寫器名] [,格式名]) }
[,INTRDR ] [,代碼名]
SYSOUT=(,)
說明:
輸出類:為數據集指定的輸出類,輸出類為一個字符:A~Z或0~9。
*—表示輸出類與在JOB語句中MSGCLASS參數的定義相同。
(,)—指定輸出類為空值。當引用JCL的OUTPUT語句中CLASS參數的定義時必須指定輸出類為空值
書寫器名:確定一個系統書寫器程序的名字(1~8個字符)。一個外部書寫器程序是系統中一個用來處理輸出的已啟動的任務,每一個外部書寫器程序有一個用戶標識符與其相關聯。通過在DD語句中指定外部書寫器的名字來使用該書寫器程序處理輸出。(暈。。。。。)
NTRDR:通知JES將這個系統輸出數據集作為輸入作業流送到內部讀卡機。
格式名:確定打印輸出的格式,格式名為1~4個字符,可以為字母、數字或特殊字符($、#、@)。
代碼名:用來確定JES2獲得處理屬性的JES2 /*OUTPUT語句,代碼名必須與JES2的/*OUTPUT語句中的CODE參數相同。代碼名僅僅被JES2系統支持,當作業或作業步中包含了一個缺省的JCL OUTPUT語句時不要使用代碼名。
例:
//DD5 DD SYSOUT=(F, ,2PRT)
在本例的DD語句中指定JES將系統輸出數據集寫到處理F類輸出的設備上,數據集將會按照名為2PRT的輸出格式被打印。
7、SYSIN :通常,我們使用SYSIN DD語句作為一個內部流數據集的開始。內部流數據集以DD *或DD DATA語句開頭,這樣的DD語句可以有任何一個有效的名字,包括SYSIN。如果在內部流數據之前省略這樣的DD語句,系統會自動提供一個名為SYSIN的DD *語句。
格式:
//SYSIN DD 參數[,參數]... [說明]
說明:第一個參數為*或DATA,用以指出后面緊跟的是內部流數據。這條語句必須且只能夠位於內部流數據前。
8、DSNAME :指定一個數據集的名字,該數據集可以是已經存在,或者是新建的。
格式:{DSNAME}=名字
{DSN}
如果是新建的數據集的話,一般后面要跟相關的關鍵字參數:DISP,SPACE,UNIT,VOLUME,DCB。如果是已經存在的數據集,則后面一般跟DISP。
9、JOBCAT :
通過DD語句JOBCAT可以為作業定義一個私有的VSAM用戶編目或完整的編目功能。系統可以在搜索主編目或搜索與數據集名的第一部分相關聯的私有編目前先搜索本語句中定義的私有編目。
當作業中引用了一個SMS數據集時不要使用JOBCAT語句,因為SMS僅僅訪問那些在系統編目中進行編目的SMS數據集。
格式:
//JOBCAT DD DISP={OLD},
// DSNAME=私有編目名[,參數]... [說明]
{SHR}
說明:
不要指定任何UNIT和VOLUME參數,系統將會從主編目中獲取私有編目的位置。
可以通過在JOBCAT語句后立即跟有省略了語句名的DD語句的方法為作業指定多個這樣的私有編目。應當將JOBCAT語句放置在JOB語句之后,並且位於第一個EXEC語句之前。
如果作業中包含了JOBLIB語句,應當放置在JOBCAT語句之前。
//EXAMPLE JOB WILLIAMS,MSGLEVEL=1
//JOBLIB DD DSNAME=USER.LIB,DISP=SHR
//JOBCAT DD DSNAME=LYLE,DISP=SHR
//STEP1 EXEC PGM=SCAN
在這個例子中,JOBCAT語句指定了一個私有編目LYLE,並且JOBCAT語句位於JOBLIB語句之后。
10、JOBLIB :通過JOBLIB DD語句用戶可以創建一個私有庫或為作業指定一個私有庫。系統將會首先搜索所指定的私有庫去查找那些在EXEC語句的PGM參數中使用的程序,只有在私有庫中沒發現相匹配的程序時系統才會去搜索系統庫。
一個私有庫實際上是一個位於一個直接訪問設備上的分區數據集(PDS)或分區數據集擴展(PDSE),其中的每一個成員都是一個用戶的可執行程序。
格式://JOBLIB DD 參數[,參數]... [參數]
說明:
定義已編目的庫:指定DSNAME參數;指定DISP參數,其中的狀態子參數必須為OLD或SHR;不需要指定VOLUME或UNIT參數。
定義未編目的庫:指定DSNAME參數;指定DISP參數,參數值必須為DISP=(OLD,PASS)或DISP=(SHR,PASS);其中SHR表示這個數據集是已經存在的並允許其它作業使用這個庫;指定UNIT參數;指定VOLUME參數。
創 建一個庫:指定DSNAME參數,作為庫的名字;指定UNIT參數,注意一個庫必須建立在一個直接訪問設備上;指定VOLUME參數,非特定卷的情況例 外;指定SPACE參數,為整個庫分配足夠的空間,並為PDS的目錄分配空間;指定DISP參數,其中的狀態子參數必須為NEW。
向庫中 添加成員:DSNAME參數包含相應的成員名,例如,DSNAME=LIBRARY(PROGRAM);將DISP參數中的狀態子參數指定為MOD,如果 在創建庫時已經編目則不需要其它子參數,否則指定為PASS或CATLG;不要指定SPACE參數。其它參數:如果在數據集標簽中不包含數據控制塊信息則 需要指定相應的DCB參數,但不要指定FREE=CLOSE。
例1
//PAYROLL JOB JONES,CLASS=C
//JOBLIB DD DSNAME=PRIVATE.LIB4,
// DISP=(OLD,PASS)
//STEP1 EXEC PGM=SCAN
//STEP2 EXEC PGM=UPDATE
//DD1 DD DSNAME=*.JOBLIB,
// DISP=(OLD,PASS)
在 本例中JOBLIB DD語句中所指定的私有庫已經被編目,所以無需指定UNIT和VOLUME參數。系統首先搜索私有庫PRIVATE.LIB4去查找程序SCAN和 UPDATE,其次才查找系統庫SYS1.LINKLIB。在DD1語句中引用了JOBLIB DD語句中指定的私有庫。
例2
//PAYROLL JOB FOWLER,CLASS=L
//JOBLIB DD DSNAME=PRIV.DEPT58,
// DISP=(OLD,PASS),
// UNIT=3350,VOLUME=SER=D58PVL
//STEP1 EXEC PGM=DAY
//STEP2 EXEC PGM=BENEFITS
//DD1 DD DSNAME=*.JOBLIB,
// VOLUME=REF=*.JOBLIB,DISP=(OLD,PASS)
因 為在本例中JOBLIB DD語句中所指定的私有庫沒有被編目,所以必須指定UNIT和VOLUME參數。系統首先搜索私有庫PRIV.DEPT58去查找程序DAY和 BENEFITS,其次才查找系統庫SYS1.LINKLIB。在DD1語句中引用了JOBLIB DD語句中指定的私有庫。
例4
//PAYROLL JOB BIRDSALL,TIME=1440
//JOBLIB DD DSNAME=KRG.LIB12,
// DISP=(OLD,PASS)
// DD DSNAME=GROUP31.TEST,
// DISP=(OLD,PASS)
// DD DSNAME=PGMSLIB,UNIT=3350,
// DISP=(OLD,PASS),VOLUME=SER=34568
通過三個DD語句為作業定義了三個相連接的私有庫,系統將按照下面的順序查找每一個程序:KRG.LIB12;GROUP31.TEST;PGMSLIB;SYS1.LINKLIB。
11、STEPCAT :通過DD語句STEPCAT可以為作業步定義一個私有的VSAM用戶編目或完整的編目功能。系統可以在搜索主編目或搜索與數據集名的第一部分相關聯的私有編目前先搜索本語句中定義的私有編目。
當作業步中引用了一個SMS數據集時不要使用STEPCAT語句,因為SMS僅僅訪問那些在系統編目中進行編目的SMS數據集。
格式
//STEPCAT DD DISP={OLD},
// DSNAME=私有編目名[,參數]... [說明]
{SHR}
說明:
不要指定任何UNIT和VOLUME參數,系統將會從主編目中獲取私有編目的位置。可以通過在STEPCAT語句后立即跟有省略了語句名的DD語句的方法為作業指定多個這樣的私有編目。
通過下面的語句可以在一個特定的作業步中用主編目覆蓋JOBCAT中定義的私有編目://STEPCAT DD DISP=OLD,DSNAME=主編目名。在一個作業步中可以將STEPCAT語句放在DD語句中的任何一個位置。
//STEP2 EXEC PROC=SNZ12
//STEPCAT DD
//DSNAME=BETTGER,DISP=SHR
STEPCAT語句為這個作業步定義了一個私有編目BETTGER。
12、STEPLIB :STEPLIB 語句的作用與JOBLIB相似,主要區別在於作用的范圍分別是作業步和作業。同一個作業中后續作業步可以引用在STEPLIB DD語句中定義的私有庫,同樣,可以將一個STEPLIB DD語句放在內部流或編目過程中,但不能將JOBLIB DD語句放在內部流或編目過程中。
格式:
//STEPLIB DD 參數[,參數]... [說明]
13、IF-THEN-ELSE-ENDIF :條件語句
//IXSAMP23 JOB ‘AC’,’GZ’,CLASS=A,MSGCLASS=A,MSGLEVEL=(1,1),
//…
//STEP01 EXEC PGM=PROGRAM1, PARM=(10,’2008-01-29’)
//…
//TESTSTEP IF (STEP01.RC = 8) THEN
//STEP0X EXEC PGM=PROGRAMX
//…
// ELSE
//STEP0Y EXEC PGM=PROGRAMY
//…
// ENDIF
如果作業步STEP01的執行返回碼為8,那么條件為真,執行作業步STEP0X,否則執行作業步STEP0Y
小結:
TNND,這個JCL真惡心。本來做這篇筆記的初衷是記錄些重點,怎奈JCL貌似都是重點,細節的東東太多了。做到后來的DD語句時,都有點想放棄,郁悶,后來沒辦法,只好把老師的PDF拷過來。TNND,這哪是筆記啊,都成幫助文檔了。