
- 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 過程是一組包含在 JCL 中的語句,這些語句組合在一起以執行特定功能。通常,JCL 的固定部分會編碼在過程中。作業的可變部分在 JCL 中編碼。
您可以使用過程來實現使用多個輸入檔案的程式的並行執行。可以為每個輸入檔案建立一個 JCL,並且可以透過將輸入檔名作為符號引數傳遞來同時呼叫單個過程。
語法
以下是 JCL 過程定義的基本語法
//* //Step-name EXEC procedure name
過程的內容儲存在內聯過程的 JCL 中。內容儲存在基本庫的不同成員中,用於編目過程。本章將解釋 JCL 中可用的兩種過程型別,然後我們將瞭解如何巢狀各種過程。
內聯過程
當過程在同一個 JCL 成員中編碼時,稱為內聯過程。它應該以 PROC 語句開頭,以 PEND 語句結尾。
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID //* //INSTPROC PROC //*START OF PROCEDURE //PROC1 EXEC PGM=SORT //SORTIN DD DSN=&DSNAME,DISP=SHR //SORTOUT DD SYSOUT=*MYINCL //SYSOUT DD SYSOUT=* //SYSIN DD DSN=&DATAC LRECL=80 // PEND //*END OF PROCEDURE //* //STEP1 EXEC INSTPROC,DSNME=MYDATA.URMI.INPUT1, // DATAC=MYDATA.BASE.LIB1(DATA1) //* //STEP2 EXEC INSTPROC,DSNME=MYDATA.URMI.INPUT2 // DATAC=MYDATA.BASE.LIB1(DATA1) //*
在上面的示例中,過程 INSTPROC 在 STEP1 和 STEP2 中使用不同的輸入檔案呼叫。引數 DSNAME 和 DATAC 可以在呼叫過程時使用不同的值進行編碼,這些被稱為符號引數。JCL 的可變輸入,例如檔名、資料卡、PARM 值等,作為符號引數傳遞給過程。
在編碼符號引數時,請勿使用 KEYWORDS、PARAMETERS 或 SUB-PARAMETERS 作為符號名稱。例如:不要使用 TIME=&TIME,但您可以使用 TIME=&TM,它被認為是編碼符號的正確方法。
使用者定義的符號引數稱為JCL 符號。有一些稱為系統符號的符號用於登入作業執行。普通使用者在批處理作業中使用的唯一系統符號是&SYSUID,它用於 JOB 語句中的 NOTIFY 引數。
編目過程
當過程與 JCL 分離並在不同的資料儲存中編碼時,稱為編目過程。在編目過程中,不需要強制編碼 PROC 語句。以下是 JCL 的示例,其中它呼叫 CATLPROC 過程
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID //* //STEP EXEC CATLPROC,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT // DATAC=MYDATA.BASE.LIB1(DATA1)
這裡,過程 CATLPROC 編目在 MYCOBOL.BASE.LIB1 中。PROG、DATAC 和 DSNAME 作為符號引數傳遞給過程 CATLPROC。
//CATLPROC PROC PROG=,BASELB=MYCOBOL.BASE.LIB1 //* //PROC1 EXEC PGM=&PROG //STEPLIB DD DSN=&BASELB,DISP=SHR //IN1 DD DSN=&DSNAME,DISP=SHR //OUT1 DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSIN DD DSN=&DATAC //*
在過程中,編碼了符號引數 PROG 和 BASELB。請注意,過程中的 PROG 引數會被 JCL 中的值覆蓋,因此 PGM 在執行期間取值 CATPRC1。
巢狀過程
從過程內部呼叫過程稱為巢狀過程。過程最多可以巢狀 15 層。巢狀可以完全是內聯的或編目的。我們不能在編目過程中編碼內聯過程。
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID //* //SETNM SET DSNM1=INPUT1,DSNM2=OUTPUT1 //INSTPRC1 PROC //* START OF PROCEDURE 1 //STEP1 EXEC PGM=SORT,DISP=SHR //SORTIN DD DSN=&DSNM1,DISP=SHR //SORTOUT DD DSN=&DSNM2,DISP=(,PASS) //SYSOUT DD SYSOUT=* //SYSIN DD DSN=&DATAC //* //STEP2 EXEC PROC=INSTPRC2,DSNM2=MYDATA.URMI.OUTPUT2 // PEND //* END OF PROCEDURE 1 //* //INSTPRC2 PROC //* START OF PROCEDURE 2 //STEP1 EXEC PGM=SORT //SORTIN DD DSN=*.INSTPRC1.STEP1.SORTOUT //SORTOUT DD DSN=&DSNM2,DISP=OLD //SYSOUT DD SYSOUT=* //SYSIN DD DSN=&DATAC // PEND //* END OF PROCEDURE 2 //* //JSTEP1 EXEC INSTPRC1,DSNM1=MYDATA.URMI.INPUT1, // DATAC=MYDATA.BASE.LIB1(DATA1) //*
在上面的示例中,JCL 在 JSTEP1 中呼叫過程 INSTPRC1,過程 INSTPRC2 在過程 INSTPRC1 中被呼叫。這裡,INSTPRC1 的輸出 (SORTOUT) 作為輸入 (SORTIN) 傳遞給 INSTPRC2。
SET 語句用於定義跨作業步驟或過程的常用符號。它初始化符號名稱中的先前值。它必須在 JCL 中首次使用符號名稱之前定義。
讓我們看一下下面的描述,以更好地理解上述程式
SET 引數初始化 DSNM1=INPUT1 和 DSNM2=OUTPUT1。
當在 JCL 的 JSTEP1 中呼叫 INSTPRC1 時,DSNM1=MYDATA.URMI.INPUT1 和 DSNM2=OUTPUT1.,即 SET 語句中初始化的值將重置為任何作業步驟/過程設定的值。
當在 INSTPRC1 的 STEP2 中呼叫 INSTPRC2 時,DSNM1=MYDATA.URMI.INPUT1 和 DSNM2=MYDATA.URMI.OUTPUT2。