Jcl-procedures
JCL-手順
- JCLプロシージャ*は、特定の機能を実行するためにグループ化された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シンボル*と呼ばれます。 ログオンジョブの実行に使用される*システムシンボル*と呼ばれる特定のシンボルがあります。 通常のユーザーがバッチジョブで使用する唯一のシステムシンボルは*&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を取ることに注意してください。
ネストされた手順
プロシージャ内からプロシージャを呼び出すことは、*ネストされたプロシージャ*と呼ばれます。 プロシージャは、最大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を初期化します。
- INSTPRC1がJCLのJSTEP1で呼び出されると、DSNM1 = MYDATA.URMI.INPUT1およびDSNM2 = OUTPUT1。、つまり、SETステートメントで初期化された値は、ジョブステップ/手順のいずれかに設定された値でリセットされます。
- INSTPRC1のSTEP2でINSTPRC2が呼び出された場合、DSNM1 = MYDATA.URMI.INPUT1およびDSNM2 = MYDATA.URMI.OUTPUT2。