
- JCL 教程
- JCL 首頁
- JCL - 概述
- JCL - 環境
- JCL - JOB 語句
- JCL - EXEC 語句
- JCL - DD 語句
- JCL - 基本庫
- JCL - 過程
- JCL - 條件處理
- JCL - 定義資料集
- JCL - 輸入/輸出方法
- JCL - 執行 COBOL 程式
- JCL - 實用程式
- JCL - 基本排序技巧
- JCL 有用資源
- JCL - 問題與解答
- JCL - 快速指南
- JCL - 有用資源
- JCL - 討論
JCL - 定義資料集
資料集名稱指定檔名稱,在 JCL 中用 DSN 表示。DSN 引數指的是新建立或現有資料集的物理資料集名稱。DSN 值可以由多個子名稱組成,每個子名稱的長度為 1 到 8 個字元,用句點分隔,總長度為 44 個字元(字母數字)。以下是語法
DSN=&name | *.stepname.ddname
臨時資料集僅在作業持續時間內需要儲存空間,並在作業完成後刪除。此類資料集表示為DSN=&name 或根本不指定 DSN。
如果作業步驟建立的臨時資料集需要在下一個作業步驟中使用,則將其引用為DSN=*.stepname.ddname。這稱為向後引用。
連線資料集
如果有多個相同格式的資料集,則可以將它們連線起來,並作為單個 DD 名稱傳遞給程式作為輸入。
//CONCATEX JOB CLASS=6,NOTIFY=&SYSUID //* //STEP10 EXEC PGM=SORT //SORTIN DD DSN=SAMPLE.INPUT1,DISP=SHR // DD DSN=SAMPLE.INPUT2,DISP=SHR // DD DSN=SAMPLE.INPUT3,DISP=SHR //SORTOUT DD DSN=SAMPLE.OUTPUT,DISP=(,CATLG,DELETE), // LRECL=50,RECFM=FB
在上面的示例中,三個資料集被連線起來,並作為輸入傳遞給 SORTIN DD 名稱中的 SORT 程式。這些檔案被合併,根據指定的鍵欄位排序,然後寫入 SORTIN DD 名稱中的單個輸出檔案 SAMPLE.OUTPUT。
覆蓋資料集
在標準化的 JCL 中,要執行的程式及其相關資料集放置在已編目過程中,該過程在 JCL 中呼叫。通常,出於測試目的或為了解決事件,可能需要使用與已編目過程中指定的資料集不同的資料集。在這種情況下,可以在 JCL 中覆蓋過程中的資料集。
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID //* //JSTEP1 EXEC CATLPROC,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT // DATAC=MYDATA.BASE.LIB1(DATA1) //STEP1.IN1 DD DSN=MYDATA.OVER.INPUT,DISP=SHR //* //* The cataloged procedure is as below: //* //CATLPROC PROC PROG=,BASELB=MYCOBOL.BASE.LIB1 //* //STEP1 EXEC PGM=&PROG //STEPLIB DD DSN=&BASELB,DISP=SHR //IN1 DD DSN=MYDATA.URMI.INPUT,DISP=SHR //OUT1 DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSIN DD MYDATA.BASE.LIB1(DATA1),DISP=SHR //* //STEP2 EXEC PGM=SORT
在上面的示例中,資料集 IN1 在 PROC 中使用檔案 MYDATA.URMI.INPUT,該檔案在 JCL 中被覆蓋。因此,執行中使用的輸入檔案是 MYDATA.OVER.INPUT。請注意,資料集被稱為 STEP1.IN1。如果 JCL/PROC 中只有一個步驟,則資料集可以用 DD 名稱引用。類似地,如果 JCL 中有多個步驟,則資料集需要覆蓋為 JSTEP1.STEP1.IN1。
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID //* //STEP EXEC CATLPROC,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT // DATAC=MYDATA.BASE.LIB1(DATA1) //STEP1.IN1 DD DSN=MYDATA.OVER.INPUT,DISP=SHR // DD DUMMY // DD DUMMY //*
在上面的示例中,在 IN1 中連線的三個資料集中,第一個在 JCL 中被覆蓋,其餘保持與 PROC 中相同。
在 JCL 中定義 GDG
生成資料組 (GDG) 是透過公共名稱相互關聯的資料集組。公共名稱稱為 GDG 基名稱,與基名稱關聯的每個資料集稱為 GDG 版本。
例如,MYDATA.URMI.SAMPLE.GDG 是 GDG 基名稱。資料集的名稱為 MYDATA.URMI.SAMPLE.GDG.G0001V00、MYDATA.URMI.SAMPLE.GDG.G0002V00 等。GDG 的最新版本稱為 MYDATA.URMI.SAMPLE.GDG(0),先前版本稱為 (-1)、(-2) 等。將在程式中建立的下一個版本在 JCL 中稱為 MYDATA.URMI.SAMPLE.GDG(+1)。
在 JCL 中建立/更改 GDG
GDG 版本可以具有相同或不同的 DCB 引數。可以定義一個初始模型 DCB 供所有版本使用,但在建立新版本時可以覆蓋它。
//GDGSTEP1 EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DEFINE GDG(NAME(MYDATA.URMI.SAMPLE.GDG) - LIMIT(7) - NOEMPTY - SCRATCH) /* //GDGSTEP2 EXEC PGM=IEFBR14 //GDGMODLD DD DSN=MYDATA.URMI.SAMPLE.GDG, // DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA, // SPACE=(CYL,10,20), // DCB=(LRECL=50,RECFM=FB) //
在上面的示例中,IDCAMS 實用程式在 GDGSTEP1 中定義了 GDG 基名稱,並在 SYSIN DD 語句中傳遞了以下引數
NAME 指定 GDG 基名稱的物理資料集名稱。
LIMIT 指定 GDG 基名稱可以容納的最大版本數。
EMPTY 在達到 LIMIT 時取消編目所有世代。
NOEMPTY 取消編目最近的世代。
SCRATCH 在取消編目時物理刪除世代。
NOSCRATCH 不刪除資料集,即可以使用 UNIT 和 VOL 引數引用它。
在 GDGSTEP2 中,IEFBR14 實用程式指定所有版本使用的模型 DD 引數。
IDCAMS 可用於更改 GDG 的定義引數,例如增加 LIMIT、將 EMPTY 更改為 NOEMPTY 等,以及使用 SYSIN 命令更改其相關版本,命令為ALTER MYDATA.URMI.SAMPLE.GDG LIMIT(15) EMPTY。
在 JCL 中刪除 GDG
使用 IEFBR14 實用程式,我們可以刪除 GDG 的單個版本。
//GDGSTEP3 EXEC PGM=IEFBR14 //GDGDEL DD DSN=MYDATA.URMI.SAMPLE.GDG(0), // DISP=(OLD,DELETE,DELETE)
在上面的示例中,刪除了 MYDATA.URMI.SAMPLE.GDG 的最新版本。請注意,正常作業完成時的 DISP 引數被編碼為 DELETE。因此,作業完成執行時資料集將被刪除。
IDCAMS 可用於刪除 GDG 及其相關版本,使用 SYSIN 命令 DELETE(MYDATA.URMI.SAMPLE.GDG) GDG FORCE/PURGE。
FORCE 刪除 GDG 版本和 GDG 基名稱。如果任何 GDG 版本都設定了尚未過期的失效日期,則這些版本不會被刪除,因此 GDG 基名稱將被保留。
PURGE 刪除 GDG 版本和 GDG 基名稱,無論失效日期如何。
在 JCL 中使用 GDG
在以下示例中,MYDATA.URMI.SAMPLE.GDG 的最新版本用作程式的輸入,並建立 MYDATA.URMI.SAMPLE.GDG 的新版本作為輸出。
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID //* //STP01 EXEC PGM=MYCOBB //IN1 DD DSN=MYDATA.URMI.SAMPLE.GDG(0),DISP=SHR //OUT1 DD DSN=MYDATA.URMI.SAMPLE.GDG(+1),DISP=(,CALTG,DELETE) // LRECL=100,RECFM=FB
在這裡,如果 GDG 透過實際名稱(如 MYDATA.URMI.SAMPLE.GDG.G0001V00)引用,則每次執行前都需要更改 JCL。使用 (0) 和 (+1) 使其動態替換執行的 GDG 版本。