Jcl-procedures

提供:Dev Guides
移動先:案内検索

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。