JCL-手順

ザ・ JCL Procedures特定の機能を実行するためにグループ化されたJCL内のステートメントのセットです。通常、JCLの固定部分はプロシージャーでコーディングされます。ジョブのさまざまな部分は、JCL内でコーディングされます。

プロシージャを使用して、複数の入力ファイルを使用してプログラムを並列実行できます。入力ファイルごとにJCLを作成でき、入力ファイル名をシンボリック・パラメーターとして渡すことにより、単一のプロシージャーを同時に呼び出すことができます。

構文

以下は、JCLプロシージャー定義の基本構文です。

//*
//Step-name EXEC procedure name

プロシージャの内容は、インストリームプロシージャ用にJCL内に保持されます。内容は、カタログ化されたプロシージャーのために、基本ライブラリーの異なるメンバー内に保持されます。この章では、JCLで使用できる2種類のプロシージャについて説明し、最後に、さまざまなプロシージャをネストする方法を説明します。

インストリーム手順

プロシージャが同じ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は、プロシージャーの呼び出し中に異なる値でコーディングでき、これらは次のように呼び出されます。symbolic parameters。ファイル名、データカード、PARM値など、JCLへのさまざまな入力は、シンボリックパラメーターとしてプロシージャに渡されます。

シンボリックパラメーターをコーディングするときは、シンボル名としてKEYWORDS、PARAMETERS、またはSUB-PARAMETERSを使用しないでください。例:TIME =&TIMEを使用しないでください。ただし、TIME =&TMを使用できます。これは、シンボリックをコーディングする正しい方法と見なされます。

ユーザー定義のシンボリックパラメーターは呼び出されます JCL Symbols。と呼ばれる特定の記号がありますsystem symbols、ログオンジョブの実行に使用されます。通常のユーザーがバッチジョブで使用する唯一のシステムシンボルは&SYSUID これは、JOBステートメントのNOTIFYパラメーターで使用されます。

カタログ化された手順

プロシージャーがJCLから分離され、別のデータストアにコーディングされている場合、それは Cataloged Procedure。PROCステートメントは、カタログ化されたプロシージャーでコーディングする必要はありません。以下は、CATLPROCプロシージャーを呼び出すJCLの例です。

//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を取得することに注意してください。

ネストされた手順

プロシージャ内からプロシージャを呼び出すことは、 nested procedure。プロシージャは最大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に渡されます。

A SET statementジョブステップまたは手順全体で一般的に使用されるシンボリックを定義するために使用されます。シンボリック名の以前の値を初期化します。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になります。