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。

廣告