Jcl-conditional-processing

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

JCL-条件付き処理

ジョブ入力システムは、2つのアプローチを使用して、JCLで条件付き処理を実行します。 ジョブが完了すると、実行ステータスに基づいてリターンコードが設定されます。 戻りコードは、0(実行の成功)から4095(非ゼロはエラー状態を示します)の間の数値です。 最も一般的な従来の値は次のとおりです。

  • 0 =通常-すべてOK
  • 4 =警告-軽微なエラーまたは問題。
  • 8 =エラー-重大なエラーまたは問題。
  • 12 =重大なエラー-重大なエラーまたは問題。結果は信頼できません。
  • 16 =ターミナルエラー-非常に深刻な問題。結果を使用しないでください。

ジョブステップの実行は、このチュートリアルで説明した COND パラメーターと IF-THEN-ELSE コンストラクトを使用して、前のステップのリターンコードに基づいて制御できます。

CONDパラメーター

*COND* パラメーターは、JCLのJOBまたはEXECステートメントでコーディングできます。 これは、先行するジョブステップのリターンコードのテストです。 テストがtrueと評価された場合、現在のジョブステップの実行はバイパスされます。 バイパスはジョブステップの省略であり、異常終了ではありません。 1つのテストで、最大8つの条件を組み合わせることができます。

構文

JCL CONDパラメーターの基本構文は次のとおりです。

COND=(rc,logical-operator)
or
COND=(rc,logical-operator,stepname)
or
COND=EVEN
or
COND=ONLY

使用されるパラメーターの説明は次のとおりです。

  • rc :これは戻りコードです
  • logical-operator :これは、GT(より大きい)、GE(より大きいまたは等しい)、EQ(等しい)、LT(より小さい)、LE(より小さいまたは等しい)、またはNE(等しくない)のいずれかです。 )。
  • stepname :これは、テストで戻りコードが使用されるジョブステップです。

最後の2つの条件(a)COND = EVENおよび(b)COND = ONLYは、このチュートリアルで以下で説明されています。

CONDは、JOBステートメントまたはEXECステートメントのいずれかでコーディングできます。どちらの場合も、以下で説明するように動作が異なります。

JOBステートメント内のCOND

CONDがJOBステートメントでコーディングされると、ジョブステップごとに条件がテストされます。 特定のジョブステップで条件が真である場合、それに続くジョブステップとともに条件がバイパスされます。 以下はその例です。

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID,COND=(5,LE)
//*
//STEP10 EXEC PGM=FIRSTP
//* STEP10 executes without any test being performed.

//STEP20 EXEC PGM=SECONDP
//* STEP20 is bypassed, if RC of STEP10 is 5 or above.
//* Say STEP10 ends with RC4 and hence test is false.
//* So STEP20 executes and lets say it ends with RC16.

//STEP30 EXEC PGM=SORT
//* STEP30 is bypassed since 5 <= 16.

EXECステートメント内のCOND

CONDがジョブステップのEXECステートメントでコーディングされ、真であることが判明した場合、そのジョブステップのみがバイパスされ、実行は次のジョブステップから継続されます。

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.

//STP02 EXEC PGM=MYCOBB,COND=(0,EQ,STP01)
//* In STP02, condition evaluates to TRUE and step bypassed.

//STP03 EXEC PGM=IEBGENER,COND=((10,LT,STP01),(10,GT,STP02))
//* In STP03, first condition fails and hence STP03 executes.
//* Since STP02 is bypassed, the condition (10,GT,STP02) in
//* STP03 is not tested.

COND = EVEN

COND = EVENをコーディングすると、前のステップのいずれかが異常終了した場合でも、現在のジョブステップが実行されます。 COND = EVENとともに他のRC条件がコーディングされている場合、どのRC条件も真でない場合、ジョブステップが実行されます。

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.

//STP02 EXEC PGM=MYCOBB,COND=(0,EQ,STP01)
//* In STP02, condition evaluates to TRUE and step bypassed.

//STP03 EXEC PGM=IEBGENER,COND=((10,LT,STP01),EVEN)
//* In STP03, condition (10,LT,STP01) evaluates to true,
//* hence the step is bypassed.

COND = ONLY

COND = ONLYをコーディングすると、前のステップのいずれかが異常終了した場合にのみ、現在のジョブステップが実行されます。 COND = ONLYとともに他のRC条件がコーディングされている場合、RC条件のいずれも真ではなく、以前のジョブステップのいずれかが異常に失敗すると、ジョブステップが実行されます。

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=SORT
//* Assuming STP01 ends with RC0.

//STP02 EXEC PGM=MYCOBB,COND=(4,EQ,STP01)
//* In STP02, condition evaluates to FALSE, step is executed
//* and assume the step abends.

//STP03 EXEC PGM=IEBGENER,COND=((0,EQ,STP01),ONLY)
//* In STP03, though the STP02 abends, the condition
//* (0,EQ,STP01) is met. Hence STP03 is bypassed.

IF-THEN-ELSEコンストラクト

ジョブ処理を制御する別のアプローチは、IF-THEN-ELSE構造を使用することです。 これにより、条件処理の柔軟性と使いやすさが向上します。

構文

JCL IF-THEN-ELSE構成体の基本的な構文は次のとおりです。

//name IF condition THEN
list of statements//* action to be taken when condition is true
//name ELSE
list of statements//* action to be taken when condition is false
//name ENDIF

以下は、上記のIF-THEN-ELSEコンストラクトで使用される用語の説明です。

  • name :これはオプションであり、名前にはアルファベット、#、$、または@で始まる1〜8文字の英数字を使用できます。
  • 条件:条件の形式は KEYWORD OPERATOR VALUE で、 KEYWORDS はRC(戻りコード)、ABENDCC(システムまたはユーザー完了コード)、ABEND、RUN(ステップ開始実行)のいずれかです。 OPERATOR には、論理演算子(AND(&)、OR(|))または関係演算子(、> =、<>)を使用できます。

以下は、IF-THEN-ELSEの使用法を示す簡単な例です。

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//PRC1   PROC
//PST1     EXEC PGM=SORT
//PST2     EXEC PGM=IEBGENER
//      PEND
//STP01  EXEC PGM=SORT
//IF1    IF STP01.RC = 0 THEN
//STP02     EXEC PGM=MYCOBB1,PARM=123
//      ENDIF
//IF2    IF STP01.RUN THEN
//STP03a    EXEC PGM=IEBGENER
//STP03b    EXEC PGM=SORT
//      ENDIF
//IF3    IF STP03b.!ABEND THEN
//STP04     EXEC PGM=MYCOBB1,PARM=456
//      ELSE
//      ENDIF
//IF4    IF (STP01.RC = 0 & STP02.RC <= 4) THEN
//STP05     EXEC PROC=PRC1
//      ENDIF
//IF5    IF STP05.PRC1.PST1.ABEND THEN
//STP06     EXEC PGM=MYABD
//      ELSE
//STP07     EXEC PGM=SORT
//      ENDIF

上記のプログラムを見て、もう少し詳しく理解してみましょう。

  • STP01の戻りコードは、IF1でテストされています。 0の場合、STP02が実行されます。 そうでない場合、処理は次のIFステートメント(IF2)に進みます。
  • IF2では、STP01が実行を開始すると、STP03aとSTP03bが実行されます。
  • IF3では、STP03bが異常終了しない場合、STP04が実行されます。 ELSEには、ステートメントはありません。 これはNULL ELSEステートメントと呼ばれます。
  • IF4では、STP01.RC = 0およびSTP02.RC ⇐ 4がTRUEの場合、STP05が実行されます。
  • IF5では、ジョブステップSTP05 ABENDでPROC PRC1のproc-step PST1が実行されると、STP06が実行されます。 それ以外の場合は、STP07が実行されます。
  • IF4が偽と評価された場合、STP05は実行されません。 その場合、IF5はテストされず、ステップSTP06、STP07は実行されません。

IF-THEN-ELSEは、ユーザーがジョブをキャンセルしたり、ジョブの有効期限が切れたり、バイパスされたステップを後方参照したりするなど、ジョブが異常終了した場合には実行されません。

チェックポイントの設定

DDステートメントである SYSCKEOV を使用して、JCLプログラム内にチェックポイントデータセットを設定できます。

*CHKPT* は、DDステートメントのマルチボリュームQSAMデータセット用にコーディングされたパラメーターです。 CHKPTがCHKPT = EOVとしてコーディングされている場合、入出力マルチボリュームデータセットの各ボリュームの終わりにあるSYSCKEOVステートメントで指定されたデータセットにチェックポイントが書き込まれます。
//CHKSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01     EXEC PGM=MYCOBB
//SYSCKEOV  DD DSNAME=SAMPLE.CHK,DISP=MOD
//IN1       DD DSN=SAMPLE.IN,DISP=SHR
//OUT1      DD DSN=SAMPLE.OUT,DISP=(,CATLG,CATLG)
//         CHKPT=EOV,LRECL=80,RECFM=FB

上記の例では、出力データセットSAMPLE.OUTの各ボリュームの終わりに、データセットSAMPLE.CHKにチェックポイントが書き込まれます。

処理を再開する

  • RDパラメーター*を使用した自動化された方法または* RESTARTパラメーター*を使用した手動を使用して、etherの処理を再開できます。
  • RDパラメーター*は、JOBまたはEXECステートメントでコーディングされ、JOB/STEPの自動再起動に役立ち、R、RNC、NRまたはNCの4つの値のいずれかを保持できます。
  • RD = R は自動再起動を許可し、DDステートメントのCHKPTパラメーターでコーディングされたチェックポイントを考慮します。
  • RD = RNC は自動化された再起動を許可しますが、CHKPTパラメーターをオーバーライド(無視)します。
  • RD = NR は、ジョブ/ステップを自動的に再起動できないことを指定します。 ただし、RESTARTパラメーターを使用して手動で再起動すると、CHKPTパラメーター(存在する場合)が考慮されます。
  • RD = NC は、自動再始動およびチェックポイント処理を許可しません。

特定の異常終了コードに対してのみ自動再始動を行う必要がある場合は、IBMシステムparmlibライブラリーの SCHEDxx メンバーで指定できます。

  • RESTARTパラメーター*はJOBまたはEXECステートメントでコーディングされ、ジョブの失敗後のJOB/STEPの手動再始動に役立ちます。 RESTARTにはチェックIDを伴うことができます。チェックIDは、SYSCKEOV DDステートメントでコーディングされたデータセットに記述されたチェックポイントです。 チェックIDがコーディングされている場合、SYSLIBのDDステートメントは、JOBLIBステートメント(存在する場合)の後、またはJOBステートメントの後のチェックポイントデータセットを参照するようにコーディングする必要があります。
//CHKSAMP JOB CLASS=6,NOTIFY=&SYSUID,RESTART=(STP01,chk5)
//*
//SYSCHK    DD DSN=SAMPLE.CHK,DISP=OLD
//STP01     EXEC PGM=MYCOBB
//*SYSCKEOV DD DSNAME=SAMPLE.CHK,DISP=MOD
//IN1       DD DSN=SAMPLE.IN,DISP=SHR
//OUT1      DD DSN=SAMPLE.OUT,DISP=(,CATLG,CATLG)
//         CHKPT=EOV,LRECL=80,RECFM=FB

上記の例では、chk5がチェックIDです。つまり、チェックポイント5でSTP01が再起動されます。 チェックポイントの設定セクションで説明した前のプログラムでは、SYSCHKステートメントが追加され、SYSCKEOVステートメントがコメント化されていることに注意してください。