接上篇:
7.JCL 的位置參數與關鍵字參數最多隻能由兩級子參數。也就是說用於括起子參數列表的括號最多只能有兩層。
四、JCL語句的位置
在下面各節中我們將詳細討論各語句的書寫方法,爲了便於編寫 JCL,下面按照 JCL語句的放置順序來說明它們的位置:
1.JOB 語句。
2.JOBLIB 語句。
3.JOBCAT 及 SYSCHK 語句。
4.任何流內過程。
5.第一個 EXEC 語句。
6.任何的 STEPCAT、STEPLIB,或一般的屬於這一步的 DD語句。
7.任何更多的 EXEC 語句及與他們相關聯的 DD語句。
8.任何空語句。
五、JCL語法實例
作業語句 //EXPJOB JOB ,’USERNAME’,MSGLEVEL=(1,1), EXAMPLE
作業語句續行 // MSGCLASS=Q,CLASS=A
//**********************
註釋語句 //* IT IS A EXAMPLE *
//**********************
執行語句 //STEP1 EXEC PGM=IEFBR14
DD語句 //DD1 DD DSN=MJSN.TEAM01.ONE,DISP=(,CATLG),
DD語句續行 // SPACE=(TRK,(5,2)), UNIT=SYSDA
DD語句 // DD1 DD DSN=MJSN.TEAM01.TWO,DISP=(,KEEP),
DD語句續行 // SPACE=(TRK,(1,1)), UNIT=SYSDA
值得注意的是:在例中,採取了兩種註釋說明的方式,一種爲作業句中的“EXAMLE”,這是在說明區中說明的方式;另一種則是註釋語句的方式。註釋語句以第 1~3列的“//*”開始,可以將它放在 JOB 語句後的任何 JCL 語句的前面或後面來說明 JCL。
JOB語句:
JOB 語句標誌一個作業的開始、分配作業名並設置相關的位置參數及關鍵字參數,每個
作業的第一個語句必須是 JOB 語句。
JOB 語句的格式如下:
//作業名 JOB 位置參數[,關鍵字參數][,關鍵字參數]。。。[註釋說明]
一、 作業名
作業名是用戶給作業指定的名字。爲使操作系統識別作業,必須選擇確定的作業名字,
由於系統不能同時運行具有相同名字得到作業,因此只能給作業一個唯一確定的名字。一般
來說,建議用戶採用“ USERID+數字或字符”的作業名,例如用戶標識爲 JACK,則作業名可用 JACKA。
二、位置參數
作業語句中的位置參數有兩個:
1.記賬信息(accounting information):
記賬信息位於操作符“JOB”後,它用於提供用戶使用系統的合法性、機時及紙張的收
費管理等。其格式爲:
([account-number][,accounting-information]…)
account-number:用戶賬號;
accounting-information:附加的記賬信息,如房間號、部門名等等。
記賬信息參數及其子參數最多不可超過 143 個字符(包括分隔子參數的逗號,但不包括括起子參數列表的括號)。例:
//EXAMPLE1 JOB (D548-8686,’12/8/98’,PGMBIN)
//EXAMPLE2 JOB D548-8686
2.程序員名(programmer’s name)
程序員名用於標識作業的所有者(owner)信息,包括特殊字符在內,其長度不得超過
20 個字符。例:
//EXAMPLE1 JOB 2000,J.A.C.K
//EXAMPLE2 JOB 2001,JACK
//EXAMPLE3 JOB 2003,’O’’SUN’
下面是幾個位置參數不同的書寫格式的例子:
帶有全部位置參數的作業語句:
//JOBA JOB (20008,60),A.B.C,CLASS=S,…
缺省記賬信息的作業語句:
//JOBB JOB ,USER-NAME,CLASS=A,…
不帶位置參數的作業語句:
//JOBC JOB CLASS=Q,…
三: 關鍵字參數
JOB 語句中的關鍵字參數有如下幾個:
1. ADDRSPC
指明作業所需之存儲類型,它有兩個子參數:VIRT 及 REAL。VIRT 表示作業請求虛擬
頁式存貯,而 REAL 表示作業請求實存存儲空間。缺省值爲 VIRT。其格式爲:
ADDRSPC={VIRT}
{REAL}
例:
//PEH JOB ,BAKER,ADDRSPC=VIRT
//DEB JOB ,ERIC,ADDRSPC=REAL,REGION=100K
2. BYTES
指明打印作業的系統輸出數據集的最大千字節數,同時該參數還指出當超過所給出的最
大字節數時,系統對作業的處理方式。這些方式包括:取消作業(轉儲(dump)或不轉儲)
或繼續作業並向操作員發出超過最大字節數的警告信息。其格式爲:
BYTE={nnnnn}
{([nnnnnn][,CANCEL])}
{([nnnnnn][,DUMP])}
{([nnnnnn][,WARNING])}
nnnnnn:指明打印輸出的最大千字節數,例:nnnnnn 取值500,則表示500,000 字節。
nnnnnn 取值範圍爲:0 ~ 999999。
CANCEL:當作業輸出字節數超過 nnnnnn 時,系統將不轉儲而直接取消該作業。
DUMP:當作業輸出字節數超過 nnnnnn 時,系統在取消該作業前將發出轉儲請求。
WARNING:當作業輸出字節數超過 nnnnnn 時,作業繼續執行,系統將按照安裝時規
定的時間間隔不斷向操作員發送警告信息。
當 BYTE 參數或其子參數省略不寫時,系統將採用安裝時定義的默認值。
例:
//JOB1 JOB (123456),’R F B’,BYTES=(5000,CANCEL)
// JOB1 JOB (123456),’R F B’,BYTES=40
除了 BYTES參數外,JOB 語句中還有另三個參數可以限製作業輸出的最大值,其格式
及子參數的意義也與 BYTES 類似,它們是:CARDS、LINES 及 PAGES。上述三個參數與
BYTES不同之處在於子參數 nnnnnn的單位不同,分別是:卡數、行數及頁數,讀者可以類
推使用。
3. CLASS
CLASS 參數規定了作業的類別,JCL 中可選用的作業類別有 36 個,用字母 A~Z 及數
字 0~9 表示。相同類別的作業處於同一輸入隊列等待執行(如圖 4-1),並具有相同的處理
屬性。作業類別的屬性定義在 JES 中。當 CLASS 參數缺省時,JES 將會根據安裝時的缺省
值賦予該作業一個缺省的 CLASS值。
格式:CLASS=jobclass
4.MSGCLASS
用於爲作業日誌(job log)設置輸出類別。作業日誌是爲程序員提供的與作業相關信息
的記錄。當該參數省略時,系統將會採用默認值。
格式:
MSGCLASS=class
class:定義作業日誌的類別。與輸入隊列相似,class 是一個 A~Z 的字母或一個 0~9 的
數字。 例:
//EXMP1 JOB ,GEORGE,MSGCLASS=F
5.MSGLEVEL
用於控制 JCL 作業輸出清單的內容,用戶可以要求系統打印出如下內容: JCL 語句; 輸入流中的所有控制語句,即:所有的 JCL 語句及 JES2 或JES3 語句; 任何作業步調用的流內過程和編目過程語句; 作業控制語句的信息; JES及操作員對作業的處理信息:設備和卷的分配、作業步及作業的執行和終止、
數據集的處理等。
格式:
MSGLEVEL=([statements][,messages])
tatements:指明在 JCL 作業輸出清單中應打印出的作業控制語句的類型,取值範圍爲:
0 ~ 2。
取值 0:僅打印出作業的 JOB 語句;
取值 1:打印出作業中包括過程語句在內的所有JCL 語句;
取值 2:輸入流中的所有控制語句。
messages:指明在 JCL作業輸出清單中應打印出信息的類型,取值範圍爲:0 ~ 1。
取值 0:只有在作業異常終止時,打印出有關 JCL、JES、操作員及 SMS的處理信息;
取值 1:無論作業是否異常終止,都打印出有關 JCL、JES、操作員及 SMS的處理信息。
例:
//EXMP3 JOB ,MSGLEVEL=(2,1)
//EXMP4 JOB ,MENTLE,MSGLEVEL=0
//EXMP5 JOB ,MIKE,MSGLEVEL=(,0)
6.NOTIFY
用於請求系統在後臺作業處理完畢時給指定用戶發送信息。如果作業完成時,該用戶未
在系統登錄,則系統所發送的信息將會保留到此用戶下次登錄。
格式:
NOTIFY={userid}
userid:必須以字母或通配符開頭的 1~7 個字母、數字或通配符組成,其值必須是一個
存在的 TSO用戶標識。 例:
//SIGN JOB ,TLOMP,NOTIFY=TSOUSER
7.PRTY
用於爲相應的輸入隊列中的作業分配優先級。系統根據作業優先級的高低來選擇來選擇
作業執行,對於同一級的作業的選擇將採取“
格式:
PRTY=priority
priority:用數字量來表示優先級,數字越大表示優先級越高。根據作業進入子系統的
類型,其取值範圍是 JES2:0~15;JES3:0~14。 例:
//JOBA JOB 1,’JIM WEBSTER’,PRTY=12
8.REGION
用於指定作業所需的實存或虛存空間的大小,系統將在該作業中的每一作業步使用該
值。所需空間大小必須包含以下內容:
運行所有程序所需的空間
在運行期間,程序中宏指令 GETMAIN所需的所有附加空間
任務初始化和終止時需要的自由空間
如果 JOB 語句中的 REGION 參數省略不寫的話,系統將採用每條 EXEC語句中所定義
的 REGION 參數,當 EXEC 語句中的REGION 參數省略不寫時,系統將採用安裝缺省值。
格式:
REGION={valueK}
={valueM}
valueK:以千字節(Kb)爲單位指出所需空間大小,
value可取 1~7 位的十進制數,其
取值範圍爲 1~2096128。系統以每 4k爲一存儲單位分配空間,所以 value值應取 4 的倍數,如 REGION=68K。當value 值不是4 的倍數時,系統會將其增至一最爲接近的 4 的倍數的值。
valueM:以兆字節(Mb)爲單位指出所需空間大小,value 可取 1~4 位的十進制數,
其取值範圍爲 1~2047
注:REGION 值必須是有效的存儲空間,如果取值爲 0 或任何大於系統極限的值時都有可能會引起存儲問題。當系統未定義極限值時,value 值不能超過 16384K 或 16M。
例:
//ACCT1 JOB A23,SMITH,REGION=100K,ADDRSPC=REAL
//ACCT2 JOB 175,FRED,REGION=250K
9.TIME
用於指定作業佔用處理器的最長時間並可通過一些信息得知該作業佔用處理器的時間。
當作業佔用處理器時間超過指定值時,系統將終止該作業。通常情況下,此參數不用設置。
當作業所需處理器時間長於系統缺省值時,或出於某種測試目的才設置此參數。
格式:
TIME={([minutes][,seconds])}
={1440 }
={NOLIMIT }
={MAXIMUM }
minutes:指定作業可佔用處理器最長時間的分鐘數,取值範圍爲 0~357912(248.55 天)。
不可以將 TIME 參數寫作 TIME=0,這樣將導致不可預知的後果。
Seconds:作爲 minutes 的補充,定義指定作業可佔用處理其最長時間的秒鐘數,取值
範圍爲 0~59。
NOLIMIT:表明作業的運行無時間限制,等同於TIME=1440。
1440:表明表明作業的運行無時間限制,即 24小時。
MAXIMUM:表示作業的運行時間爲 357912 分鐘。
當 JOB 語句中的 TIME參數沒有指明時,每作業步的運行時間限制由以下值決定: EXEC語句中 TIME 參數的值。 EXE 語句中沒有設置 TIME 參數時,採用默認的時間限制值(也就是 JES 默認作業步時間限制值)。
例 1:
//STD1 JOB ACCT271,TIME=(12,10)
例 2:
//STD2 JOB ,GOR,TIME=(,30)
例 3:
//FIRST JOB ,SMITH,TIME=2
//STEP1 EXEC PGM=READER,TIME=1
。
。
。
//STEP2 EXEC PGM=WRITER,TIME=1
在上例中,JOB 語句中規定了 2 分鐘的作業運行時間限制,每個作業步允許 1 分鐘,如果任何一個作業步的執行時間超過 1 分鐘,作業將會異常終止。
例 4:
//SECOND JOB ,JONES,TIME=3
//STEP1 EXEC PGM=ADDER,TIME=2
。
。
。
//STEP2 EXEC PGM=PRINT,TIME=2
上例中,JOB 語句中規定了 3 分鐘的作業運行時間限制,每個作業步允許 2 分鐘,如果任何一個作業步的執行時間超過 2分鐘,作業將會異常終止。但兩個作業步的總共運行時間不得超過作業運行時間限制 3 分鐘,也即:如果作業步 1 的運行時間爲 1.56 分鐘,則作業步 2 的運行時間不得超過 1.44 分,否則作業也會異常終止。
10.TYPRUN
用於請求特殊的作業處理。TYPRUN可以告知系統如下要求: JES2 中,將輸入作業流直接拷貝到系統輸出數據集並對其進行輸出處理。 JES2 或 JES3 中,掛起一個作業,直至某特定事件發生。當該特定事件發生時,操作員根據用戶的要求釋放該作業,並允許系統選擇該作業執行。使用 JES2 中的/*MASSAGE 語句或 JES3中的//*OPERATOR 語句通知操作員釋放該作業。 JES2 或JES3 中,對作業的 JCL進行語法檢查。
值得注意的是:不能對已經開始的任務(task)設置該參數,否則該作業將會出錯。
格式:
TYPRUN={COPY }
{HOLD }
{JCLHOLD }
{SCAN }
子參數說明:
COPY(僅支持 JES2): 請求 JES2 將輸入作業流直接拷貝到系統輸出數據集並對其進
行輸出處理。系統並不執行該作業。系統輸出數據集的類別與該作業JOB語句中MSGCLASS參數定義的信息類別(massage class)相同 。
HOLD:請求系統在執行作業之前將其掛起,等待某特定事件發生後,請求操作員將其
釋放。如果在作業的輸入過程中出現錯誤,JES將不會掛起該作業。
JCLHOLD(僅支持 JES2):請求 JES2在 JCL 執行前將其掛起,直到操作員將其釋放。
SCAN:請求系統只對作業的 JCL 進行語法檢查,不執行也不爲其分配設備。
例:
//UPDTAE JOB ,HUBBARD
//STEP1 EXEC PGM=LIBUTIL
。
。
。
//LIST JOB ,HUBBARD,TYPRUN=HOLD
//STEPA EXEC PGM=LIBLIST
。
。
。
上例中,作業 UPDATE 與 LIST 在同一個作業流中被提交執行。作業 UPDATE 的功能
是在庫中增加一個成員再刪除一個成員;作業 LIST 則列出該庫的成員目錄。顯然,LIST 應
在 UPDATE 之後在執行。作業 LIST 的 JOB 語句中設置的 TYPRUN=HOLD 使得保證了這一
執行順序。
如果輸入流中或操作員已執行了MONITOR JOBNAMES的命令,當UPDATE執行完後系統會通知控制檯操作員。操作員釋放作業後,系統可以選擇該作業執行。
11.其他參數
在 JCL 的 JOB 語句中的關鍵字參數還有:
COND、GROUP、PASSWORD、PERFORM、RD、RESTART、SECLABEL、USER,
由於本書篇幅有限,在這裏就不再一一介紹了,詳細的使用方法讀者可以參考《MVS JCL
Reference》一書。
EXEC語句:
EXEC 語句標明作業或過程中的每一作業步的開始,並告知系統如何執行該作業步。包括所有在 EXEC 語句中調用的過程中的所有作業步在內,一個作業最多可以有 255 個作業步。
EXEC 語句格式如下:
//[作業步名] EXEC 位置參數[,關鍵字參數]…[符號參數=值]… [註釋]
一、作業步名
作業步名是可以省略不寫的,如需標明作業名時,該作業名必須在該作業內以及該作業
調用的所有過程中是唯一的,它由 1~8 個字母或通配符開頭的字符數字構成。
二、位置參數
EXEC 語句中的位置參數有兩個:PGM 和 PROC。每條 EXEC 語句必須有且僅有一個
位置參數或過程名。
1. PGM
PGM 參數用於指明所要執行的程序名。該程序必須是一個分區數據集(PDS)的成員
或用作系統庫(system library)、私有庫(private library)及臨時庫(temporary library)的
擴充分區數據集(PDSE)的成員。程序名的調用方法分爲直接調用和間接調用。
格式:
PGM={program-name}
{*.stepname.ddname}
{*.stepname.procstepname.ddname}
program-name:program-name(程序名)指明要執行程序的成員名或別名。程序名由
由 1~8 個字母或通配符開頭的字符數字構成。
*.stepname.ddname:表示要執行的程序名由本 stepname”的作業步內名爲“ddname”的 DD語句的 DSN 參數決定。
*.stepname.procstepname.ddname:表示要執行的程序名由本 stepname”的作業步裏所調用過程內名爲“procstepname”的過程步中相應名爲“ddname”DD 語句DSN 參數決定。
在上述三種程序調用方法中,第一種爲直接調用,而後兩種爲間接調用,間接調用採用
向後參考的方法,這裏的“後”指在本作業步讀入之前,已先讀入系統的本作業其它 JCL
語句。當需調用的程序在系統庫(如 SYS1.LINKLIB)或私有庫(由作業中的JOBLIB DD 語句或本作業步中的 STEPLIB DD 定義)中時使用第一種調用方法;而當需調用的程序在本作業步前的某一作業步創建的臨時庫中時採用後兩種調用方法。
例:
//JOBC JOB ,JOHN,MSGCLASS=H
//STEP2 EXEC PGM=UPDT
//DDA DD DSNAME=SYS1.LINKLIB(P40),DISP=OLD
//STEP3 EXEC PGM=*.STEP2.DDA
在上例中,名爲 STEP3 的EXEC 語句採用程序間接調用方式,所調用的程序名由作業
步 STEP2 中的名爲DDA 的DD 語句決定,在該DD 語句中定義了系統庫 SYS1.LINKLIB,
程序 P40 是該庫的一個成員。“P40”即STEP3 中要調用執行的程序名。關於DD 語句的詳
細情況我們將在後面討論。
2. PROC
指明作業步所要運行的過程名。
格式:
{PROC=procedure-name}
{procedure-name }
procedure-name:需要調用的過程名,過程名由1~8 個字母或通配符開頭的字符數字構成。所調用的過程名可以是:
·編目過程的成員名或別名。
·由PROC 語句定義的流內過程的過程名,該流內過程必須在本作業內且本作業步前定義。
在設定該參數時,可直接寫出過程名。
例:
//SP EXEC PROC=PAYWRKS
//BK EXEC OPERATE
三、 關鍵字參數
EXEC 語句的關鍵字參數是可選的,這些參數製作用於本作業步。當EXEC 語句的位置
參數指定程序名時,關鍵字參數的寫法同 JOB 語句;當 EXEC 語句的位置參數指定編目或
流內過程時,EXEC 語句的關鍵字參數將覆蓋所調用過程中各EXEC 語句的關鍵字參數。因
此如果想僅覆蓋過程中的某個 EXEC 語句的關鍵字參數,則應在設置關鍵字參數時,同時指出所調用過程的相關過程步的名字。書寫形式如下:
關鍵字參數.過程步名=值
下面將分別介紹EXEC語句中常用的關鍵字參數:
1. ACCT
指明作業步所需的一個或多個記賬信息子參數。記賬信息參子參數最多不可超過 142
個字符(包括分隔子參數的逗號,但不包括括起子參數列表的括號)。
格式:
ACCT[.過程步名]=(記賬信息)
例:
//STP3 EXEC PROC=LOOKUP,ACCT=(‘/83468’)
2.ADDRSPC
指明作業步所需之存貯類型,它有兩個子參數:VIRT 及REAL。VIRT 表示作業步請求
虛擬頁式存貯,而REAL 表示作業步請求實存空間,不能進行頁式處理。缺省值爲VIRT 。
EXEC 語句中的 ADDRSPC 參數僅在本作業步中起作用,JOB 語句中的 ADDRSPC 參數會
覆蓋該作業中的所有EXEC 語句中的ADDRSPC 參數。
格式:
ADDRSPC[.過程步名]={VIRT}
{REAL}
例:
//CAC1 EXEC PGM=A,ADDRSPC=VIRT
//CAC2 EXEC PROC=B,ADDRSPC=REAL,REGION=100K
3.REGION
用於指定作業步所需的實存或虛存空間的大小,系統僅在本作業步中使用該值。
格式:
REGION[.過程步名]={valueK}
={valueM}
EXEC 語句中REGION 的子參數定義與JOB 語句中相同。
例:
//MKBOYLE EXEC PROC=A,REGION=100K,ADDRSPC=REAL
//STEP6 EXEC PGM=CONT,REGION=250K
4. TIME
用於指定作業步佔用處理器的最長時間,並可通過作業輸出清單得知該作業步佔用處理器的時間。當作業步佔用處理器時間超過指定值時,系統將終止該作業。
格式:
TIME[.過程步名]={([minutes][,seconds])}
={1440 }
={NOLIMIT }
={MAXIMUM }
EXEC 語句與JOB 語句中的TIME 參數的子參數的設置方法基本相同。值得注意的是:
在JOB 語句中不可設置TIME=0,而在EXEC 語句中則可以設置TIME=0,當TIME=0 時表
示本作業步的執行時間由前面作業步的剩餘執行時間決定。
例 1:
//STP1 EXEC PGM=ACCT,TIME=(12,10)
例2:
//STP2 EXEC PGM=PAY,TIME=(,30)
例3:
//FIRST JOB ,SMITH MSGLEVEL=(1,1)
//STEP1 EXEC PGM=READER,TIME=1
·
·
·
//STEP2 EXEC PGM=WRITER
·
在上例中,STEP1 規定了 1 分鐘的執行時間,STEP2 的運行時間將由STEP1 決定,也
即STEP2 的執行時間爲:(1 分鐘 – STEP2 實際運行時間)。
5. COND
用於對先前作業步執行的返回碼(return code )進行測試,以決定是否執行本作業步。
用戶可以對特定作業步的返回碼進行測試也可以對每一執行完畢的的返回碼都進行測試。如
果測試條件不滿足,系統執行本作業步;如果測試條件滿足系統則不執行該作業步。作業中
的第一個EXEC 語句中的 COND 參數將被系統忽略。注意,當測試條件滿足時,系統並非
不正常終止該作業步,而只是跳過該作業步,該作業仍將正常執行。
格式:
(1)COND[.過程步名]=(code,operator)
(2)COND[.過程步名]=((code,operator[,作業步名][,過程步名])
[,(code,operator[,作業步名][,過程步名])]…[,EVEN])
[,ONLY]
(3)COND=EVEN
COND=ONLY
利用COND 參數最多可以有 8 個返回碼測試,如果有EVEN 或ONLY 時,最多有7 個
測試。格式(1)只有在先前作業步沒有非正常終止時,才能進行該測試。格式(2 )、(3)
測試決定於EVEN 和ONLY 的設置。
code:系統使用code (測試碼)與先前作業步或某特定作業步的返回碼進行比較。Code 的取值範圍爲:0~4095。
operater:表示code 與返回碼的比較類型,這些比較的操作符是:GT (大於)、GE (大
於等於)、EQ (等於)、NE (不等於)、LT (小於)、LE (小於等於)。
作業步名:指定先前某一作業步,並用該作業步的返回碼與本作業步的測試碼進行比較。
當省略作業步名時,表示本作業步的測試碼將與先前所有作業定額的返回碼進行比較測試。
作業步名.過程步名:指定先前某一作業步調用過程的過程步。系統將用該過程步的返
回碼與給定的測試碼進行比較。其中該作業步由“作業步名”指定,而過程步由“過程步名” 指定。
EVEN:表示無論即使先前作業步異常終止,本作業步都要執行。當EVEN 子參數設定
時:
EVEN/ ONLY |
先前作業步是否異常終止? |
測試條件是否滿足? |
本作業步是否 執行? |
EVEN |
否 |
否 |
是 |
EVEN |
否 |
是 |
否 |
EVEN |
是 |
否 |
是 |
EVEN |
是 |
是 |
否 |
ONLY |
否 |
否 |
否 |
ONLY |
否 |
是 |
否 |
ONLY |
是 |
否 |
是 |
ONLY |
是 |
是 |
否 |
例 1.
//STEP6 EXEC PGM=DISKUTIL,COND=(4,GT,STEP3)
在本例中如果 STEP3 的返回碼小於4,系統將不執行STEP6。由於沒有設置EVEN 或
ONLY,如果先前的作業步異常終止,系統將不會執行本作業步。
例2.
//TEST2 EXEC PGM=DUMPINT,COND=(16,GE),(90,LE,STEP1),ONLY)
由於設置了ONLY 子參數,系統只在以下兩種情況滿足時執行本作業步:
(1)先前作業步異常終止;
(2 )返回值的測試條件都不滿足。
那麼對於本例來說,系統將會在以下三種情況都滿足的情況下執行本作業步:
·一個先前作業步異常終止。
·所有先前作業步的返回碼大於等於17。
·STEP1 的返回碼小於等於89。
例3.
//STEP1 EXEC PGM=CINDY
·
·
·
//STEP2 EXEC PGM=NEXT,COND=(4,EQ,STEP1)
·
·
·
//STEP3 EXEC PGM=LAST ,COND=((8,LT,STEP1),(8,GT,STEP2))
·
在本例中,如果 STEP1 的返回碼爲4,STEP2 將不被執行。在 STEP3 執行前,系統將執行第一個返回碼測試。而由於 STEP2 並未被執行,所以將不會進行第二個返回碼的測試。 由於8 大於4 所以 STEP3 被執行。
例4.
//STP4 EXEC PROC=BILLING,COND.PAID=((20,LT),EVEN),
// COND.LATE=(60,GT,FIND),
// COND.BILL=((20,GE),(30,LT,CHGE))
在本例中的EXEC 語句調用了一個名叫BILLING 的過程。這條語句中定義了幾個不同
的分別對過程步PAID、LATE、BILL 的返回碼的測試。由於設置了EVEN 子參數,除非相應的返回值測試滿足條件,那麼即使先前作業步異常終止,過程步PAID 都將被執行。
6. PARM
用於向本作業步執行的程序傳遞變量信息。該程序必須有相應的指令接收這些信息,並
使用它們。
格式:
PARM[.過程步名]= 子參數
PARM[.過程步名]=( 子參數, 子參數)
PARM[.過程步名]=(‘子參數’, 子參數)
PARM[.過程步名]=’子參數, 子參數’
包括所有的逗號、撇號以及括號在內,所有子參數的總長度不得超過 100 個字符。當某子參數中含有特殊字符或空格時,可以將該子參數用撇號括起來,在其它子參數一起用括號括起來,或將所有在參數用撇號括起來。
子參數:包含傳遞給程序的變量信息。
例 1.
//RUN3 EXEC PGM=APG22,PARM=’P1,123,P2=5’
在本例中,系統將參數P1、123 及P2=5 傳遞給程序APG22 。
例2.
// STP6 EXEC PROC=ASFCLG,PARM.LKED=(MAP,LET)
在本例中系統將MAP、LET 傳遞到過程ASFCLG 中名爲LKED 的過程步。
DD 語句 :
數據定義語句(DD 語句)用於定義一個數據集以及該數據集所需的輸入輸出資源。DD
語句相對與前面介紹過的 JOB 語句和 EXEC 語句來說,其參數的定義、子參數的設置要復
雜一些,在本小節內我們將僅討論DD 語句的一般規則以及部分位置參數,關於DD 語句的
一些常用參數以及特殊用法我們將用單獨的一節討論。
一、 格式:
//[dd 名 ] DD [位置參數][,關鍵字參數]… [註釋]
[過程步名.dd 名]
//[dd 名 ] DD
[過程步名.dd 名]
二、dd 名
“dd 名”是爲 DD 語句定義的名字,它由 1~8 個字母或通配符開頭的字符數字構成。
在一個作業步內可以有多個 DD 語句,但每個 DD 語句的 dd 名在本作業步中應該是唯一確定的。“dd 名”可以由系統定義也可以由用戶自己定義,當用戶需要調用公用程序時,需根據公用程序的具體要求選用系統定義的“dd 名”。用戶自定義的“dd 名”不可與系統定義“dd名”相重複。系統定義“dd”名有如下幾個:
JOBCAT SYSCHK
JOBLIB SYSCKEOV
STEPCAT SYSIN
STEPLIB SYSMDUMP
SYSBEND SYSDUMP
JES2 子系統中:
JESJCLIN JESMSGLG
JESJCL JESYSMSG
JES3 子系統中:
JCBIN JESJCL JS3CATLG
JCBLOCK JESMSGLG J3JBINFO
JCBTAB JOURNAL J3SCINFO
JESJCLIN JOURNAL J3STINFO
JESInnnn JESYSMSG STCINRDR
TSOINRDR
用戶子定義“dd 名”可以根據數據的用途,遵循“dd 名”的規則來命名,當爲應用程序輸入輸出結果定義數據集時,“dd 名”的命名規則取決於程序所用語言的類型。彙編語言由DCB 宏指令指定;COBOL 語言由ASSIGN 子名指定;PL/1 語言由DECLARE 語句指定;
FORTRAN 語言由READ 或WRITE 語句中的通道號構成。
三、參數
DD 語句的參數也分爲位置參數及關鍵字參數,這些參數都是可選的。每個DD 語句只能有一個位置參數,但根據需要可以有個關鍵字參數。位置參數有“* ”、“DATA ”和
“DUMMY”。在本小節中將只介紹位置參數的使用,關鍵字參數將在下一節中介紹。
1.參數“*”
參數“*”用於開始一個流內數據集。數據記錄跟在“DD ”語句之後,其第一、二列不能是“// ”或“/*”;該記錄可以是任何編碼,如EDCBIC。下列符號表明流內數據記錄的結束:
·輸入流中的“/* ”。
·表示另一個JCL 語句開始的“// ”。
當數據記錄中需以“// ”開始時,就必須使用DATA 參數來代替“*”參數。
格式:
//dd 名 DD *[,參數]… [註釋]
例 1.
//INPUT1 DD *
·
·
data
·
//INPUT2 DD *
·
·
data
·
/*
例2.
//INPUT3 DD *,DSNAME=&&INP3
·
data
·
/*
例3.
//STEP2 EXEC PROC=FRESH
//SETUP.WORK DD UNIT=3400-6,LABEL=(,NSL)
//SETUP.INPUT1 DD *
·
·
data
·
/*
//PRINT.FRM DD UNIT=180
//PRINT.INP DD *
·
·
data
·
/*
例 3 在輸入流中定義了兩組數據。DD 語句“SETUP.INPUT1”定義的輸入數據將被編
目過程中名爲“SETUP”的過程步使用。而DD 語句“PRINT.INP”定義的輸入數據將被編
目過程中名爲“PRINT”的過程步使用。
2. DATA
用作一個流內數據集的開始,該流內數據集裏含有以“// ”開頭的語句。數據記錄緊跟在“DD DATA”語句之後;該數據記錄可以是BCD 或EDCBIC 編碼。數據記錄將以“/* ”
作爲結束。
格式:
//dd 名 DD DATA[,參數]… [註釋]
例 1.
//GROUP1 DD DATA
·
·
data
·
//GROUP2 DD DATA
·
·
data
·
/*
例2.
//GROUP3 DD DATA,DSNAME=&&GRP3
·
data
·
/*
例3.
//STEP2 EXEC PROC=UPDATE
//PREP.DD4 DD DSNAME=A.B.C,UNIT=3350,VOLUME=SER=D88230
// SPACE=(TRK,(10,5)),DISP=(,CATLG,DELETE)
//PREP.IN1 DD DATA
·
·
data
·
/*
//ADD.IN2 DD *
·
·
data
·
/*
3. DUMMY
DUMMY 參數用於標明:
(1) 沒有設備或外存空間分配給該數據集。
(2 ) 對該數據集不進行狀態處理。
(3) 對BSAM (Basic Sequential Access Method )或QSAM (Queued Sequential Access Method )來說,不對該數據集作輸入輸出操作。
用戶使用 DUMMY 參數對程序進行測試。當測試完成時,如果用戶希望恢複對數據集
的輸入輸出操作時,只需將DD DUMMY 參數替換成完整的數據集定義DD 語句。DUMMY
的另一個用途是在編目或流內過程中,這將會在本章後續節中討論。
格式:
//dd 名 DD DUMMY[,參數]…
所有在DUMMY 語句中的參數必須在語法上是正確的。系統將對他們進行語法檢查。
例 1.
//OUTDD1 DD DUMMY,DSNAME=X.X.Z,UNIT=3380,
// SPACE=(TRK,(10,2)),DISP=(,CATLG)
本例中 DD 語句“OUTDD1”定義了一個空數據集。該語句中除DUMMY 以外的參數將接受系統語法檢查但並不起作用。
DD語句的關鍵字參數
DD 語句的關鍵字參數及其相關內容相對JOB 語句和EXEC 語句來說比較複雜,所以在
這裏作爲單獨的一節講述。DD 語句的關鍵字參數有很多,但總體上可分爲兩大類,一類與
設備相關,另一類則與數據集或數據相關,與設備相關的參數有 UNIT、 VOLUME、SPACE、
LABEL 等,與數據集、數據相關的參數有 DSNAME、 DISP、 DCB、RECORG、EXPDT、
RETPD、PROTECT、SYSOUT、HOLD 等。在實際應用中,這兩類參數是配合使用的,沒有一個絕對的分界線。DD 語句通過這些參數完成下述任務:
(1)定義順序數據集(sequential data set)或分區數據集(partitioned data set )名;
(2)描述數據集狀態、屬性及保留期限;
(3)描述設備類型、數量;
(4)設置數據集的記錄格式、佔用空間;
(5)描述作業的處理方式。
DD 語句的關鍵字參數很多,在本節中我們僅討論一些最常用的參數,並介紹一些基本
概念及實例,以便於大家進一步的學習。
1. UNIT
UNIT 參數用於請求物理設備,用戶通過設置設備地址或設備類型或設備組名等子參數
確定設備;通過設置設備數或P 等子參數確定設備數量。
格式:
{UNIT=([三位設備地址 ] [,設備數] [,DEFER])}
[/三位設備地址] [,P ]
[/四位設備地址] [, ]
[設備類型 ]
[設備組名 ]
{UNIT=AFF=DD 名}
設備地址:通過設備地址指定設備。設備地址是在系統安裝時建立的,它由一個3 位的十進制數或 4 位十六進制數構成。如用戶請求的某設備其地址爲 340 時,參數設置爲
UNIT=340 。
設備類型:通過設備類型名稱指定設備,這個名稱通常是數字的,如通過 3480、3422
指定磁帶機,通過3340、3375、3380、3390 指定磁盤機。如用戶請求設備是3380 磁盤機時,參數設置UNIT=3380 。
設備組名:通過設備組名請求一臺或一組設備。被定義在一組中的設備可以是相同的,
也可以可以是不同的。如一組設備中可以包含磁盤設備也可包含磁帶設備。但通常都是將一
類設備作爲一個設備組,具體的設備組名在系統安裝時定義。設備組名由 l—8 個字母符號構成,常見的有 SYSDA、DASD、TAPE、CART 等。如需要直接訪問的存儲設備時,參數
設置爲:UNIT=DASD 。
設備數:指定數據集所需的設備數量,取值範圍爲1~59。
SER:SER 子參數的設置方式有兩種:“SER=卷標號”和“SER=(卷標號[,卷標號]...)”,
卷標號由 l~6 位的數字字母、通配符或特殊字符構成。用戶通過 SER 定義數據集已佔用或 將佔用的卷標號。在一個 DD 語句中最多可以有 255 個互不相同的卷標號。但需要注意的 是:卷標號不能取作 SCRTCH、PRIVAT、 Lnnnnn(字母 L 帶5 個數)或MIGAT。
REF :REF 子參數的設置方式有如下四種:“REF=數據集名”、“REF=* .DD 名”、
“REF=*.作業步名.DD 名”及“REF= *.作業步名.過程步名. DD 名”。通過 REF 子參數可以從其它已知數據集或本語句前某個DD 語句中獲得所需的卷標號。
(1)“REF=數據集名”表示從其它已知數據集所在卷獲得卷標號,定義中的數據集可
以是編目數據集,也可以是由本語句前某個DISP 參數傳過來的數據集,但它不能是生成數
據集(GDG)或 其成員。
(2 )“REF=*.DD 名”表示從本作業步中的由“DD 名”指定的 DD 語句中獲得卷標號。
(3)“REF=*.作業步名.DD 名”表示由指定的作業步中指定的 DD 語句獲得所需卷標,其中作業步與DD 語句分別由“作業步名”與“DD 名”指定。
(4 )“REF=*.作業步名.過程步名.DD 名”表示從相關過程步中的相關 DD 語句中獲得卷標,這個過程是由指定的作業步調用的。其中作業步、過程步、及DD 語句分別由“作業步名”、“過程步名”及“DD 名”指定。
例 1.
//STEP2 EXEC PGM=POINT
//DDX DD DSNAME=EST,DISP=MOD,VOLUME=SER=(42569,42570),
// UNIT=(3480,2)
//DDY DD DSNAME=ERAS,DISP=OLD,UNIT=3480
//DDZ DD DSNAME=RECK,DISP=OLD,
// VOLUME=SER=(40653,13262),UNIT=AFF=DDX
DD 語句DDX 請求分配兩個 3480 設備,DD 語句DDZ 申請分配與DDX 相同的兩個設備。DD 語句DDY 申請分配一個3480 設備。
例2.
//DD2 DD DSNAME=X.Y.Z,DISP=OLD,UNIT=(,2)
本例中的DD 語句定義了一個已編目的數據集,並且要求系統賦予兩個設備給這個數據集,設備類型可以從相應的編目中獲得。
例3.
//DD3 DD DSNAME=COLLECT,DISP=OLD,
// VOLUME=SER=1095,UNIT=(3590,,DEFER)
在本例中定義了一個位於磁帶捲上的已存在的數據集,並且請求系統分配一個 3590 磁帶設備。由於指定了DEFER 子參數,相應的磁帶卷直到數據集被打開時纔會裝載。
例4
//STEPA DD DSNAME=FALL,DISP=OLD,UNIT=237
對於這個數據集來說,系統將會從相應的編目中檢索它的卷和設備類型。由於UNIT 參數被指定爲設備237,這將覆蓋數據集在編目中的設備類型定義,因此要求設備237 應該與
編目中的定義相同。
2. VOLUME
通過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=序列號
SER=(序列號[,序列號]...)
通過卷的序列號用來確定數據集佔用或將佔用那些卷。一個卷的序列號爲 1~6 個字符可以包含字母、數字和$、#、@等特殊字符。不足6 位的序列號將被空格填滿。
在一條 DD 語句中最多可以指定 255 個卷序列號。不要在一個 SER 子參數中指定
重複的序列號,無論是磁帶卷還是磁盤卷,每個卷都應該有唯一的卷序列號。
不要將序列號指定爲 SCRTCH、PRIVAT 或Lnnnnn (L 後有五個數字),這些名字已
經被用在請求操作員裝載卷的消息中;不要將序列號指定爲 MIGRAT ,這個名字被
DFHSM(Data Facility Hierarchical Storage Manager)用來做數據集的移植。
REF=數據集名
REF=*.DD 語句名
REF=*.作業步名.DD 語句名
REF=*.作業步名.過程作業步名.DD 語句名
用來表示系統將從其它的數據集或前面的DD 語句中獲得卷序列號的信息。
例 1
//DD1 DD DSNAME=DATA3,UNIT=3340,DISP=OLD,
// VOLUME=(PRIVATE,SER=548863)
在這個DD 語句中指定了一個已存在的數據集,這個數據集位於一個直接訪問的捲上,
卷的序列號爲 548863。由於指定了PRIVATE,系統將不會將這個卷分配給另外一個申請非
特定卷的數據集,在當前作業結束時系統將會釋放這個卷。
例2
//DD2 DD DSNAME=QUET,DISP=(MOD,KEEP),UNIT=(3400-5,2),
// VOLUME=( , , ,4,SER=(96341,96342))
這條DD 語句中指定了一個已存在的數據集,這個數據集跨越兩個卷,卷的序列號分別爲96341 和96342。如果需要,可以在VOLUME 參數中指定4 個卷,當需要更多的空間時系統會分配第三和第四個卷。
例3
//DD3 DD DSNAME=QOUT,UNIT=3400-5
這個DD 語句中定義了一個在作業步中創建並在同一作業步中被刪除的數據集。通過不指定VOLUME 參數表明在卷的分配上採用非特定卷的方式。
例4
//DD4 DD DSNAME=NEWDASD,DISP=(,CATLG,DELETE),UNIT=3390,
// VOLUME=SER=335006,SPACE=(CYL,(10,5))
創建了一個新的數據集,這個數據集位於序列號爲 335006 的捲上,這個卷是位於特定的3390 設備上的永久卷。
例 5
//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)
在DD 語句 OUTDD 中創建了一個多卷數據集並且對這個數據集進行編目,當然如果這個數據集不需要這麼多卷的話,可以使用較少的卷。在 DD 語句 NEXT中刪除了這個數據集。
如果用戶在多個捲上對數據集進行編目而實際上數據集僅使用了減少的卷的話,那麼當
系統刪除這個數據集時下列信息將會被加入到作業日誌中。
IEF285I TEST.TWO DELETED
IEF285I VOL SER NOS=333001,333003.
IEF283I TEST.TWO NOT DELETED
IEF283I VOL SER NOS=333002 1.
IEF283I TEST.TWO UNCATALOGED
IEF283I VOL SER NOS=333001,333002,333003.
但如果數據集使用了所有分配給它的卷的話,當系統刪除這個數據集時作業日誌中將會包含下列信息。
IEF285I TEST.TWO DELETED
IEF285I VOL SER NOS=333001,333002,333003.
例 6
//STEP1 EXEC PGM=....
//DD1 DD DSN=OLD.SMS.DATASET,DISP=SHR
//DD2 DD DSN=FIRST,DISP=(NEW,CATLG,DELETE),VOL=REF=*.DD1
//STEP2 EXEC PGM=...
//DD3 DD DSN=SECOND,DISP=(NEW,CATLG,DELETE),VOL=REF=*.STEP1.DD1
在作業步 STEP1 中的DD 語句 DD1 標誌了一個 SMS 數據集 OLD.SMS.DATASET,在
作業步STEP1 中的DD 語句DD2 和STEP2 中的DD 語句DD3 分別創建了一個SMS 數據集,
數據集的屬性引用在DD1 中標誌的數據集的屬性。
3. SPACE
SPACE 參數用於爲新建數據集分配磁盤空間,對於磁帶捲不起作用。請求空間分配一
般有兩種方法:一是告知系統所需空間大小,由系統來分配合適的空間;二是請求系統分配
某個特定的空間,如:從某個特定磁道到另一個特定磁道。
通常用第一種情況。用此種方法,用戶告訴系統所要分配空間的存貯單位及存貯空間單位的數量。空間存貯單位可以是磁道(TRK)、柱面(CYL)、塊長及記錄長。不同類型的磁盤
設備磁道、柱面容量也不同,所以爲數據集分配空間時,要清楚用戶所用的設備類型及磁道、
柱面的容量。以 3380 爲例,共有 885 個柱面,每個柱面有 15 個磁道,每個磁道的容量爲47476 字節。
格式:
由系統分配空間:
SPACE=({TRK,}(初次分配數量[,再次分配數量][,目錄空間])[,RLSE][,CONTIG][,ROUND])
({CYL,} [, ][,索引 ] [, ][,MXIG ]
({塊長度, } [,ALX ]
({記錄長度,} [, ]
請求特定的磁道:
SPACE= (ABSTR,(初次分配數量,地址[,目錄空間])
[,索引 ]
僅請求目錄空間:
SPACE=(,(,,目錄空間))
由系統分配空間:
TRK:表示系統以磁道爲單位分配空間。
CYL:表示系統以柱面爲單位分配空間。
塊長度:用來指定數據的平均塊長度(字節),塊長度是0~65535 的一個十進制數。這裏 指定的塊長度用來作爲空間分配的單位。(僅在AVGREC 沒有指定的情況下使用)
記錄長度:在 SMS 環境下用來指定數據的平均記錄長度(字節),記錄長度是 0~65535
的一個十進制數。這裏指定的塊長度用來作爲空間分配的單位。(僅在指定AVGREC 和 SMS
激活的情況下使用)
初次分配數量:初次爲數據集分配的空間的大小,單位爲磁道、柱面等。如果使用TRK
或 CYL 作爲單位爲一個分區數據集分配空間,則初次分配的空間包含了目錄空間;如果使
用塊長度或記錄長度作爲單位爲一個分區數據集分配空間,則初次分配的空間不包含目錄空
間,系統另外分配目錄空間。所要求的卷必須有足夠的空間用於分配,否則作業將失敗。
再次分配數量:當爲數據集所分配的空間用完時,指定再次爲數據集分配空間的數量。
目錄空間:指定在一個分區數據集中用來作爲目錄的長度爲256 字節的記錄的數量。
索引:對於一個索引順序數據集的索引來說,用來指定所需的磁道或柱面,所需的磁道數應該等於一個或多個柱面。
RLSE:表示在數據集關閉時,那些分配給數據集但沒有被使用的空間將會被釋放。前
提條件是數據集必須爲了輸出被打開並且最後一個操作爲寫操作。
CONTIG:指定分配給數據集的空間必須是連續的,這個子參數僅僅影響初次分配。
MXIG:要求爲數據集分配的空間必須 1、是捲上最大的連續空間 2、大於或等於初次
分配的空間大小。這個子參數僅僅影響初次分配。
ALX:作業在分配空間是將獲得捲上最多 5 個最大的連續空間,並且每一個空間都應
大於或等於初次分配的空間大小。這個子參數僅僅影響初次分配。
ROUND:只有在第一個子參數指定爲塊長度時表示分配的空間必須等於整數柱面,其
它情況下忽略這個子參數。
申請特定的磁道:
ABSTR:表示將在捲上特定的位置爲數據集分配空間。
初次分配數量:指定爲數據集分配的磁道數,要求捲上必須有足夠的空間。
地址:指定分配的第一個磁道的磁道號,第一個柱面上第一個磁道的磁道號爲0。
例 1
//DD1 DD DSNAME=&&TEMP,UNIT=MIXED,SPACE=(CYL,10)
在這個DD 語句中定義了一個臨時數據集。UNIT 參數爲數據集申請任何有效的磁帶或
直接訪問設備卷,其中MIXED 是一組磁帶和直接訪問設備的安裝名。如果獲得的是磁帶卷
的話,SPACE 參數被忽略;如果獲得的是直接訪問設備卷的話,SPACE 參數被用來爲數據
集分配空間。在本例中 SPACE 參數通過子參數指定了分配的單位和初次分配的數量:10 個
柱面。
例2
//DD2 DD DSNAME=PDS12,DISP=(,KEEP),UNIT=3350,
// VOLUME=SER=25143,SPACE=(CYL,(10,,10),,CONTIG)
在 DD 語句中定義了一個新的分區數據集,系統將爲這個數據集分配 10 個柱面,其中 創建 10 個256 字節的記錄作爲目錄。由於指定了CONTIG 子參數,系統將在捲上爲數據集分配 10 個連續的柱面。
例3
//REQUEST1 DD DSNAME=EXM,DISP=NEW,UNIT=3330,VOLUME=SER=606674,
// SPACE=(1024,75),DCB=KEYLEN=8
//REQUESTA DD DSNAME=EXQ,DISP=NEW,UNIT=3380,
// SPACE=(1024,75),DCB=KEYLEN=8
在本例的DD 語句中根據塊長分配空間。數據的平均塊長爲 1024 字節,需要申請75 個數據塊,每一個數據塊前都需要有一個 8 個字節長的鍵,系統將會根據UNIT 參數指定的設備計算需要多少個磁道。
例4
//REQUEST2 DD DSNAME=PET,DISP=NEW,UNIT=3330,VOLUME=SER=606674,
// SPACE=(ABSTR,(5,1))
在本例中,SPACE 參數指定系統從捲上的第2 個磁道起爲數據集分配 5 個磁道。
例 5
//DD3 DD DSNAME=MULTIVOL,UNIT=3350,DISP=(,CATLG),
// VOLUME=SER=(223344,223345),SPACE=(CYL,(554,554))
這是一個在兩個完整的捲上創建一個多卷數據集的例子,在這兩個捲上不包含任何其它
的數據集。一個3350 設備上的捲包含555 個柱面,未非配的柱面用來存放VTOC 。
4. DSNAME
DSNAME 參數被用來指定一個數據集的名字。對於一個新建的數據集來說 DSNAME
參數給定新數據集的名字;對於已存在的數據集來說,通過DSNAME 參數來定位這個數據
集。
格式:
{DSNAME} = 名字
{DSN }
例 1.
//DD1 DD DSNAME=ALPHA,DISP=(,KEEP),
// UNIT=3420,VOLUME=SER=389984
在 DD 語句 DD1 中定義了一個名字爲ALPHA 的新數據集,隨後的作業步或作業中的DD 語句可以通過指定DSNAME、UNIT 和VOLUME 參數來引用這個數據集。
例2
//DDSMS1 DD DSNAME=ALPHA.PGM,DISP=(NEW,KEEP),DATACLAS=DCLAS1,
// MGMTCLAS=MCLAS1,STORCLAS=SCLAS1
在 DD 語句 DDSMS1 中定義了一個名字爲ALPHA.PGM 的新 SMS 數據集,隨後的作業步或作業中的 DD 語句可以通過指定 DSNAME 參數爲ALPHA.PGM 來引用這個 SMS 數據集。
例3
//DD2 DD DSNAME=LIB1(PROG12),DISP=(OLD,KEEP),UNIT=3350
// VOLUME=SER=882234
DD 語句DD2 中引用分區數據集LIB1 中的數據集成員PROG12 。
例4
//DDIN DD DATA,DSNAME=&&PAYIN1
.
數據
.
/*
在DD 語句DDIN 中指定PAYIN1 作爲系統爲內部流數據集產生的數據集名的最後一個
部分,這個數據集的名字將會是下面這種形式:
用戶ID.作業名.作業ID.D 數據集號.PAYIN1
例 5
//DDOUT DD DSNAME=&&PAYOUT1,SYSOUT=P
在DD 語句DDOUT 中指定PAYOUT1 作爲系統爲系統輸出數據集產生的數據集名的最
後一個部分,這個數據集的名字將會是下面這種形式:
用戶ID.作業名.作業ID.D 數據集號.PAYOUT1
例 6
//DD3 DD DSNAME=&&WORK,UNIT=3420
在 DD 語句 DD3 中定義了一個臨時數據集。一般來說由於臨時數據集將在作業步結束時被刪除,所有用戶可以在DD 語句中省略DSNAME 參數。
例 7
//STEP1 EXEC PGM=CREATE
//DD4 DD DSNAME=&&ISDATA(PRIME),DISP=(,PASS),UNIT=(3350,2),
// VOLUME=SER=334859,SPACE=(CYL,(10,,2),,CONTIG),DCB=DSORG=IS
//STEP2 EXEC PGM=OPER
//DD5 DD DSNAME=*.STEP1.DD4,DISP=(OLD,DELETE)
在 STEP1 的DD 語句DD4 中定義了一個名爲ISDATA 的臨時的索引順序數據集,這條
DD 語句爲這個索引順序數據集定義了所有的區域。在 STEP2 中的DD 語句 DD5 通過引用
前面作業步中的 DD 語句的方式來引用這個數據集,因此這個臨時數據集並不會在 STEP1
結束時被刪除。