Jcl-quick-guide

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

JCL-概要

JCLを使用する場合

JCLは、メインフレーム環境で、プログラム(例:COBOL、アセンブラー、またはPL/I)とオペレーティングシステム間の通信として機能するために使用されます。 メインフレーム環境では、プログラムをバッチモードおよびオンラインモードで実行できます。 バッチシステムの例としては、VSAM(仮想ストレージアクセス方式)ファイルを介して銀行取引を処理し、対応するアカウントに適用することができます。 オンラインシステムの例としては、銀行のスタッフが口座を開設するために使用するバックオフィス画面があります。 バッチモードでは、プログラムは、JCLを介してジョブとしてオペレーティングシステムに送信されます。

バッチ処理とオンライン処理は、入力、出力、およびプログラム実行要求の側面が異なります。 バッチ処理では、これらの側面がJCLに送られ、JCLはオペレーティングシステムによって受信されます。

ジョブ処理

ジョブは、多くのジョブステップで構成できる作業単位です。 各ジョブステップは、一連のジョブ制御ステートメントを通じて、ジョブ制御言語(JCL)で指定されます。

オペレーティングシステムは* Job Entry System(JES)*を使用して、ジョブをオペレーティングシステムに受け取り、処理のスケジュールを設定し、出力を制御します。

ジョブ処理は、以下に示す一連のステップを経ます。

ジョブ処理

  • ジョブ送信- JCLをJESに送信します。
  • ジョブ変換- JCLとPROCは、JESが理解できるように解釈されたテキストに変換され、SPOOLと呼ばれるデータセットに保存されます。
  • ジョブキューイング- JESは、JOBステートメントのCLASSおよびPRTYパラメータに基づいてジョブの優先順位を決定します(link:/jcl/jcl_job_statement [JCL-JOBステートメント]の章で説明)。 エラーがない場合、JCLエラーがチェックされ、ジョブはジョブキューにスケジュールされます。
  • *ジョブの実行-*ジョブが最高の優先度に達すると、ジョブキューからの実行に使用されます。 JCLはSPOOLから読み取られ、プログラムが実行され、出力はJCLで指定された対応する出力先にリダイレクトされます。
  • * Purging-*ジョブが完了すると、割り当てられたリソースとJES SPOOLスペースが解放されます。 ジョブログを保存するには、SPOOLからリリースする前に、ジョブログを別のデータセットにコピーする必要があります。

JCL-環境設定

Windows/LinuxでのJCLのインストール

サンプルJCLの記述と学習に使用できるWindows用の無料のメインフレームエミュレータは多数あります。

そのようなエミュレーターの1つにHerculesがあります。これは、以下に示すいくつかの簡単な手順に従ってWindowsに簡単にインストールできます。

  • Herculesエミュレーターをダウンロードしてインストールします。これはHerculesのホームサイトから入手できます-:http://www.hercules-390.eu [www.hercules-390.eu] JCLを作成して実行するためのさまざまなコマンドの完全なガイドは、URL www.jaymoseley.com/hercules/installmvs/instmvs2 *にあります。

Herculesは、最新の64ビットz/Architectureに加えて、メインフレームシステム/370およびESA/390アーキテクチャのオープンソースソフトウェア実装です。 Herculesは、Linux、Windows、Solaris、FreeBSD、およびMac OS Xで動作します。

メインフレームでのJCLの実行

ユーザーは、シンクライアント、ダミーターミナル、仮想クライアントシステム(VCS)、仮想デスクトップシステム(VDS)など、さまざまな方法でメインフレームサーバーに接続できます。

すべての有効なユーザーには、Z/OSインターフェース(TSO/EまたはISPF)に入るためのログインIDが与えられます。 Z/OSインターフェースでは、JCLをコーディングして、Partitioned Dataset(PDS)のメンバーとして保管できます。 前の章のジョブ処理セクションで説明されているように、JCLが送信されると実行され、出力が受信されます。

JCLの構造

一般的なステートメントを使用したJCLの基本構造を以下に示します。

//SAMPJCL JOB 1,CLASS=6,MSGCLASS=0,NOTIFY=&SYSUID          (1)
//*                                                        (2)
//STEP010  EXEC PGM=SORT                                   (3)
//SORTIN   DD DSN=JCL.SAMPLE.INPUT,DISP=SHR                (4)
//SORTOUT  DD DSN=JCL.SAMPLE.OUTPUT,                       (5)
//        DISP=(NEW,CATLG,CATLG),DATACLAS=DSIZE50
//SYSOUT   DD SYSOUT=*                                     (6)
//SYSUDUMP DD SYSOUT=C                                     (6)
//SYSPRINT DD SYSOUT= *(6)
//SYSIN    DD* (6)
  SORT FIELDS=COPY
  INCLUDE COND=(28,3,CH,EQ,C'XXX')
/*                                                         (7)

プログラムの説明

番号付きのJCLステートメントについては、以下で説明しています。

(1)JOBステートメント-ジョブの完了時に通知されるジョブID、実行の優先度、ユーザーIDなど、ジョブのスプールに必要な情報を指定します。

(2)//*ステートメント-これはコメントステートメントです。

(3)EXECステートメント-実行するPROC/プログラムを指定します。 上記の例では、SORTプログラムが実行されています(つまり、入力データを特定の順序で並べ替えています)

(4)入力DDステートメント-(3)で述べたプログラムに渡される入力のタイプを指定します。 上記の例では、物理シーケンシャル(PS)ファイルが共有モードの入力として渡されます(DISP = SHR)。

(5)出力DDステートメント-実行時にプログラムによって生成される出力のタイプを指定します。 上記の例では、PSファイルが作成されます。 ステートメントが行の70番目の位置を超える場合、次の行に続きます。この行は、「//」で始まり、その後に1つ以上のスペースが続く必要があります。

  • (6)*プログラムに追加情報を指定する(上記の例:SORT条件はSYSIN DDステートメントで指定される)他のタイプのDDステートメントがあり、エラー/実行ログの宛先を指定する(例: SYSUDUMP/SYSPRINT)。 DDステートメントは、上記の例にあるように、データセット(メインフレームファイル)またはストリームデータ(JCL内にハードコードされた情報)に含めることができます。

(7) / *は、ストリームデータの終わりを示します。

ストリームデータを除くすべてのJCLステートメントは//で始まります。 JOB、EXEC、およびDDキーワードの前後に少なくとも1つのスペースが必要です。ステートメントの残りの部分にはスペースを入れないでください。

JOBパラメータタイプ

各JCLステートメントには、オペレーティングシステムがプログラムの実行を完了するのに役立つ一連のパラメーターが付属しています。 パラメーターには次の2つのタイプがあります。

位置パラメータ

  • ステートメント内の事前定義された位置と順序で表示されます。 例:アカウンティング情報パラメーターは、 JOB キーワードの後、プログラマー名パラメーターおよびキーワードパラメーターの前にのみ表示できます。 位置パラメータを省略する場合、コンマで置き換える必要があります。
  • 定位置パラメーターは、JOBおよびEXECステートメントに存在します。 上記の例では、PGMは EXEC キーワードの後に​​コーディングされた定位置パラメーターです。

キーワードパラメータ

  • これらは定位置パラメーターの後にコーディングされますが、任意の順序で表示できます。 必要でない場合、キーワードパラメータは省略できます。 一般的な構文はKEYWORD = _value_です。 例:MSGCLASS = X、つまり、ジョブログは、ジョブの完了後に出力SPOOLにリダイレクトされます。
  • 上記の例では、CLASS、MSGCLASS、およびNOTIFYはJOBステートメントのキーワードパラメーターです。 EXECステートメントにもキーワードパラメータを含めることができます。

これらのパラメーターは、適切な例とともに後続の章で詳しく説明されています。

JCL-JOBステートメント

JOBステートメントは、JCLの最初の制御ステートメントです。 これにより、スプールおよびスケジューラーのオペレーティングシステム(OS)にジョブのIDが与えられます。 JOBステートメントのパラメーターは、オペレーティングシステムが適切なスケジューラーを割り当て、CPU時間を必要とし、ユーザーに通知を発行するのに役立ちます。

構文

JCL JOBステートメントの基本構文は次のとおりです。

//Job-name JOB Positional-param, Keyword-param

説明

上記のJOBステートメント構文で使用される用語の説明を見てみましょう。

職種名

これにより、ジョブをOSに送信するときにジョブにIDが付与されます。 長さは1〜8の英数字で、//の直後から始まります。

JOB

これは、JOBステートメントとして識別するためのキーワードです。

位置パラメータ

次の2つのタイプの位置パラメータがあります。

Positional Parameter Description
Account information This refers to the person or group to which the CPU time is owed. It is set as per the rules of the company owning the mainframes. If it is specified as (*), then it takes the id of the user, who has currently logged into the Mainframe Terminal.
Programmer name This identifies the person or group, who is in charge of the JCL. This is not a mandatory parameter and can be replaced by a comma.

キーワードパラメータ

以下は、JOBステートメントで使用できるさまざまなキーワードパラメーターです。 要件に基づいて1つ以上のパラメーターを使用でき、それらはコンマで区切られます。

Keyword Parameter Description
CLASS

Based on the time duration and the number of resources required by the job, companies assign different job classes. These can be visualized as individual schedulers used by the OS to receive the jobs. Placing the jobs in the right scheduler will aid in easy execution of the jobs. Some companies have different classes for jobs in test and production environment.

CLASSパラメーターの有効な値は、A〜Z文字と0〜9の数字(長さ1)です。 構文は次のとおりです。

  • CLASS = 0〜9
AからZ* PRTY

To specify the priority of the job within a job class. If this parameter is not specified, then the job is added to the end of the queue in the specified CLASS. Following is the syntax:

  • PRTY = N*

Nは0から15までの数字で、数字が大きいほど優先順位が高くなります。

NOTIFY

The system sends the success or failure message (Maximum Condition Code) to the user specified in this parameter. Following is the syntax:

  • NOTIFY = "userid

&SYSUID"*

ここでは、システムはユーザー「userid」にメッセージを送信しますが、NOTIFY =&SYSUIDを使用すると、メッセージはJCLを送信するユーザーに送信されます。

MSGCLASS

To specify the output destination for the system and Job messages when the job is complete. Following is the syntax:

  • MSGCLASS = CLASS*

CLASSの有効な値は、「A」から「Z」および「0」から「9」です。 MSGCLASS = Yは、JMRにジョブログを送信するクラスとして設定できます(JOBLOG Management and Retrieval:ジョブ統計を保存するためのメインフレーム内のリポジトリ)。

MSGLEVEL

Specifies the type of messages to be written to the output destination specified in the MSGCLASS. Following is the syntax:

  • MSGLEVEL =(_ ST、MSG _)*

ST =出力ログに書き込まれるステートメントのタイプ

  • ST = 0の場合、ジョブステートメントのみ。
  • ST = 1の場合、JCLとシンボリックパラメーターが展開されます。
  • ST = 2の場合、入力JCLのみ。

MSG =出力ログに書き込まれるメッセージのタイプ。

  • MSG = 0の場合、ジョブの異常終了時に割り当ておよび終了メッセージが書き込まれます。
  • MSG = 1の場合、ジョブ完了の性質に関係なく書き込まれる割り当ておよび終了メッセージ。
TYPRUN

Specifies a special processing for the job. Following is the syntax:

  • TYPRUN =スキャン

ホールド*

SCANおよびHOLDには次の説明があります

  • TYPRUN = SCANは、JCLを実行せずに構文エラーをチェックします。 * TYPRUN = HOLDは、ジョブをジョブキューで保留にします。ジョブをリリースするには、SPOOLのジョブに対して「A」を入力して、ジョブを実行します。
TIME

Specifies the time span to be used by the processor to execute the job. Following is the syntax:

  • TIME =(mm、ss)またはTIME = ss*

ここで、mm =分、ss =秒

このパラメーターは、新しくコーディングされたプログラムをテストする際に役立ちます。 ループエラーのためにプログラムが長時間実行されないようにするために、指定されたCPU時間に達したときにプログラムが異常終了するように、時間パラメーターをコーディングできます。

REGION

Specifies the address space required to run a job step within the job. Following is the syntax:

  • REGION = nK

nM*

ここで、_region_はnKまたはnMとして指定できます。nは数値、Kはキロバイト、Mはメガバイトです。

REGION = 0Kまたは0Mの場合、実行のために最大のアドレス空間が提供されます。重要なアプリケーションでは、アドレス空間の無駄を避けるために0Kまたは0Mのコーディングは禁止されています。

//URMISAMP JOB (*),"tutpoint",CLASS=6,PRTY=10,NOTIFY=&SYSUID,
//  MSGCLASS=X,MSGLEVEL=(1,1),TYPRUN=SCAN,
//  TIME=(3,0),REGION=10K

ここでは、JOBステートメントが行の70番目の位置を超えて拡張されているため、「//」で始まり1つ以上のスペースが続く次の行に進みます。

その他のパラメーター

JOBステートメントで使用できる他のパラメーターはほとんどありませんが、頻繁には使用されません。

ADDRSPC Type of storage used: Virtual or Real
BYTES Size of data to be written to output log and the action to be taken when the size is exceeded.
LINES Maximum number of lines to be printed to output log.
PAGES Maximum number of pages to be printed to output log.
USER User id used to submit the job
PASSWORD Password of the user-id specified in the USER parameter.
COND and RESTART These are used in conditional job step processing and are explained in detail while discussing conditional Processing.

JCL-EXECステートメント

各JCLは、多くのジョブステップで構成できます。 各ジョブステップは、プログラムを直接実行するか、1つ以上のプログラム(ジョブステップ)を順番に実行するプロシージャを呼び出すことができます。 ジョブステップのプログラム/手順情報を保持するステートメントは、* EXECステートメントです。*

EXECステートメントの目的は、ジョブステップで実行されるプログラム/手順に必要な情報を提供することです。 このステートメントでコーディングされたパラメーターは、実行中のプログラムにデータを渡し、JOBステートメントの特定のパラメーターをオーバーライドし、EXECステートメントがプログラムを直接実行する代わりにプロシージャーを呼び出す場合、パラメーターをプロシージャーに渡すことができます。

構文

JCL EXECステートメントの基本構文は次のとおりです。

//Step-name EXEC Positional-param, Keyword-param

説明

上記のEXECステートメント構文で使用される用語の説明を見てみましょう。

STEP-NAME

これにより、JCL内のジョブステップが識別されます。 長さは1〜8で、英数字を使用できます。

EXEC

これは、EXECステートメントとして識別するためのキーワードです。

定位置パラメーター

これらは定位置パラメーターであり、2つのタイプがあります。

Positional Parameter Description
PGM This refers to the program name to be executed in the job step.
PROC This refers to the procedure name to be executed in the job step. We will discuss it a separate chapter.

KEYWORD-PARAM

以下は、EXECステートメントのさまざまなキーワードパラメーターです。 要件に基づいて1つ以上のパラメーターを使用でき、それらはコンマで区切られます。

Keyword Parameter Description
PARM

Used to provide parametrized data to the program that is being executed in the job step. This is a program dependant field and do not have definite rules, except that the PARM value has to be included within quotation in the event of having special characters.

以下の例では、値「CUST1000」が英数字値としてプログラムに渡されます。 プログラムがCOBOLの場合、JCLのPARMパラメーターを介して渡された値は、プログラムのLINKAGE SECTIONで受信されます。

ADDRSPC

This is used to specify whether the job step require virtual or real storage for execution. Virtual storage is pageable whereas real storage is not and is placed in the main memory for execution. Job steps, which require faster execution can be placed in real storage. Following is the syntax:

  • ADDRSPC = VIRT

リアル*

ADDRSPCがコーディングされていない場合、VIRTがデフォルトです。

ACCT

EXECおよびJOBステートメントの共通キーワードパラメーター

Keyword Parameter Description
ADDRSPC ADDRSPC coded in JOB statement overrides the ADDRSPC coded in EXEC statement of any job step.
TIME If TIME is coded in an EXEC statement, then it applies to that job step only. If it is specified in both JOB and EXEC statement, then both will be in effect and can cause time-out error due to either of it. It is not recommended to use TIME parameter in both the JOB and EXEC statement together.
REGION

If REGION is coded in an EXEC statement, then it applies to that job step only.

JOBステートメントでコーディングされたREGIONは、ジョブステップのEXECステートメントでコーディングされたREGIONをオーバーライドします。

COND

Used to control the job step execution based on the return-code of the previous step.

CONDパラメーターがジョブステップのEXECステートメントでコーディングされている場合、JOBステートメントのCONDパラメーター(存在する場合)は無視されます。 CONDパラメーターを使用して実行できるさまざまなテストについては、条件付き処理で説明しています。

以下は、JCLスクリプトの簡単な例とJOBおよびEXECステートメントです。

//TTYYSAMP JOB 'TUTO',CLASS=6,MSGCLASS=X,REGION=8K,
//     NOTIFY=&SYSUID
//*
//STEP010 EXEC PGM=MYCOBOL,PARAM=CUST1000,
//     ACCT=(XXXX),REGION=8K,ADDRSPC=REAL,TIME=1440

JCL-DDステートメント

データセットは、特定の形式で整理されたレコードを持つメインフレームファイルです。 データセットは、メインフレームのダイレクトアクセスストレージデバイス(DASD)またはテープに保存され、基本的なデータストレージ領域です。 これらのデータをバッチプログラムで使用/作成する必要がある場合、ファイル(およびデータセット)の物理名とファイル形式および編成がJCLでコーディングされます。

JCLで使用される各データセットの定義は、* DDステートメント*を使用して与えられます。 ジョブステップに必要な入力および出力リソースは、データセットの編成、ストレージ要件、レコード長などの情報とともにDDステートメント内に記述する必要があります。

構文

JCL DDステートメントの基本構文は次のとおりです。

//DD-name DD Parameters

説明

上記のDDステートメント構文で使用される用語の説明を見てみましょう。

DD-NAME

DD-NAMEは、データセットまたは入力/出力リソースを識別します。 これがCOBOL/Assemblerプログラムで使用される入出力ファイルである場合、ファイルはプログラム内でこの名前で参照されます。

DD

これは、DDステートメントとして識別するためのキーワードです。

パラメーター

以下は、DDステートメントのさまざまなパラメーターです。 要件に基づいて1つ以上のパラメーターを使用でき、それらはコンマで区切られます。

Parameter Description
DSN

The DSN parameter refers to the physical dataset name of a newly created or existing dataset. The DSN value can be made up of sub-names each of 1 to 8 characters length, separated by periods and of total length of 44 characters (alphanumeric). Following is the syntax:

  • DSN =物理データセット名*

一時データセット*は、ジョブの期間だけストレージを必要とし、ジョブの完了時に削除されます。 そのようなデータセットは、 *DSN =&name として、または単にDSNを指定せずに表されます。

ジョブステップによって作成された一時データセットが次のジョブステップで使用される場合、 DSN = 。stepname.ddname *として参照されます。 これは*後方参照*と呼ばれます。

DISP

The DISP parameter is used to describe the status of the dataset, disposition at the end of the job step on normal and abnormal completion. DISP is not required in a DD statement only when the dataset gets created and deleted in the same job step (like the temporary datasets). Following is the syntax:

  • DISP =(ステータス、正常後処理、異常後処理)*

    *status* の有効な値は次のとおりです。
  • NEW :データセットは、ジョブステップによって新しく作成されます。 上記の例のOUTPUT1。

  • OLD :データセットは既に作成されており、ジョブステップで上書きされます。 ジョブステップはデータセットに対する排他的なアクセス権を取得し、ジョブステップが完了するまで他のジョブはこのデータセットにアクセスできません。

  • SHR :データセットは既に作成されており、ジョブステップで読み取られます。 データセットは、同時に複数のジョブで読み取ることができます。 例:INPUT1およびINPUT2。

  • MOD :データセットはすでに作成されています。 この処理は、既存のデータセットに新しいレコードを追加する必要がある場合に使用されます(既存のレコードは上書きされません)。

    *normal-disposition* パラメーターは、次の値のいずれかを取ることができます
  • CATLG、UNCATLG、DELETE、PASS、KEEP

    *abnormal-disposition* パラメーターは、次の値のいずれかを取ることができます
  • CATLG、UNCATLG、DELETE、KEEP

CATLG、UNCATLG、DELETE、PASS、およびKEEPパラメーターの説明は次のとおりです。

  • CATLG :データセットは、システムカタログのエントリとともに保持されます。
  • UNCATLG :データセットは保持されますが、システムカタログエントリは削除されます。
  • KEEP :データセットは、カタログエントリを変更せずに保持されます。 KEEPは、VSAMファイルの唯一の有効な後処理です。 これは、永続的なデータセットにのみ使用されます。
  • DELETE :データセットはユーザーおよびシステムカタログから削除されます。
  • PASS :これは通常の処理でのみ有効です。 これは、JCLの次のジョブステップでデータセットが渡されて処理されるときに使用されます

DISPのサブパラメーターが指定されていない場合、デフォルト値は次のとおりです。

  • status :NEWはデフォルト値です。
  • normal-disposition :ステータスがNEWの場合、デフォルトのnormal-dispositionはDELETEであり、それ以外の場合はKEEPです。
  • abnormal-disposition :通常の処理と同じです。
*DCB *a

The Data Control Block (DCB) parameter details the physical characteristics of a dataset. This parameter is required for datasets that are newly created in the job step.

LRECLは、データセット内に保持されている各レコードの長さです。

RECFMは、データセットのレコード形式です。 RECFMは、FB、V、またはVBの値を保持できます。 FBは、1つ以上の論理レコードが単一のブロック内にグループ化される固定ブロック組織です。 Vは、1つの可変長論理レコードが1つの物理ブロック内に配置される変数編成です。 VBは、1つまたは複数の可変長論理レコードが1つの物理ブロック内に配置される可変ブロック構成です。

BLKSIZEは、物理ブロックのサイズです。 ブロックが大きいほど、FBまたはVBファイルのレコード数が多くなります。

DSORGは、データセット編成のタイプです。 DSORGは、PS(物理シーケンシャル)、PO(パーティション組織)、およびDA(直接組織)の値を保持できます。

同じジョブステップまたはJCL内で1つのデータセットのDCB値を別のデータセットに複製する必要がある場合、DCB =* 。stepname.ddnameとして指定されます。ここで、stepnameはジョブステップの名前、ddnameは元のデータセットです。 DCBがコピーされます。

RECFM = FB、LRECL = 80がデータセットOUTPUT1のDCBを形成する以下の例を確認してください。

SPACE

The SPACE parameter specifies the space required for the dataset in the DASD (Direct Access Storage Disk). Following is the syntax:

  • SPACE =(spcunits、(pri、sec、dir)、RLSE)*

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

  • spcunits :これは、CYL(シリンダー)、TRK(トラック)、またはBLKSIZE(ブロックサイズ)のいずれかです。
  • pri :これは、データセットに必要なプライマリスペースです。
  • sec :これは、プライマリスペースが十分でない場合に必要な追加スペースです。
  • ir :これは、データセットがその中にメンバーを持つPDS(パーティションデータセット)である場合に必要なディレクトリブロックです。
  • RLSE :これは、ジョブの完了時に未使用スペースを解放するために使用されます。
UNIT

The UNIT and VOL parameters are listed in the system catalog for catalogued datasets and hence can be accessed with just the physical DSN name. But for uncataloged datasets, the DD statement should include these parameters. For new datasets to be created, the UNIT/VOL parameters can be specified or the Z/OS allocates the suitable device and volume.

UNITパラメーターは、データセットが保存されるデバイスのタイプを指定します。 デバイスタイプは、ハードウェアアドレスまたはデバイスタイプグループを使用して識別できます。 構文は次のとおりです。

  • UNIT = DASD

SYSDA*

DASDはDirect Access Storage Deviceを表し、SYSDAはSystem Direct Accessを表し、次に利用可能なディスクストレージデバイスを指します。

VOL

The VOL parameter specifies the volume number on the device identified by the UNIT parameter. Following is the syntax:

  • VOL = SER =(v1、v2)*

v1、v2はボリュームシリアル番号です。 次の構文も使用できます。

  • VOL = REF =* 。DDNAME *

REFは、JCLの先行するジョブステップのいずれかにおけるデータセットのボリュームシリアル番号への後方参照です。

SYSOUT

以下は、上記で説明したさまざまなパラメーターとともにDDステートメントを使用する例です。

//TTYYSAMP JOB 'TUTO',CLASS=6,MSGCLASS=X,REGION=8K,
//        NOTIFY=&SYSUID
//*
//STEP010  EXEC PGM=ICETOOL,ADDRSPC=REAL
//*
//INPUT1   DD DSN=TUTO.SORT.INPUT1,DISP=SHR
//INPUT2   DD DSN=TUTO.SORT.INPUT2,DISP=SHR,UNIT=SYSDA,
//        VOL=SER=(1243,1244)
//OUTPUT1  DD DSN=MYFILES.SAMPLE.OUTPUT1,DISP=(,CATLG,DELETE),
//        RECFM=FB,LRECL=80,SPACE=(CYL,(10,20))
//OUTPUT2  DD SYSOUT=*

JCL-ベースライブラリ

ベースライブラリ*は、JCLまたはプログラムで呼び出されるカタログ式プロシージャで実行されるプログラムのロードモジュールを保持するパーティションデータセット(PDS)です。 ベースライブラリは、 *JOBLIB ライブラリのJCL全体または STEPLIB ステートメントの特定のジョブステップに指定できます。

JOBLIBステートメント

*JOBLIB* ステートメントは、JCLで実行されるプログラムの場所を識別するために使用されます。 JOBLIBステートメントは、JOBステートメントの後、EXECステートメントの前に指定されます。 これは、ストリーム内のプロシージャとプログラムでのみ使用できます。

構文

JCL JOBLIBステートメントの基本構文は次のとおりです。

//JOBLIB DD DSN=dsnname,DISP=SHR

JOBLIBステートメントは、JCL内のすべてのEXECステートメントに適用できます。 EXECステートメントで指定されたプログラムは、JOBLIBライブラリで検索され、続いてシステムライブラリで検索されます。

たとえば、EXECステートメントがCOBOLプログラムを実行している場合、COBOLプログラムのロードモジュールはJOBLIBライブラリ内に配置する必要があります。

STEPLIBステートメント

ジョブステップ内で実行されるプログラムの場所を識別するために、 STEPLIB ステートメントが使用されます。 STEPLIBステートメントは、EXECステートメントの後、ジョブステップのDDステートメントの前に指定されます。

構文

JCL STEPLIBステートメントの基本構文は次のとおりです。

//STEPLIB DD DSN=dsnname,DISP=SHR

EXECステートメントで指定されたプログラムは、STEPLIBライブラリで検索され、続いてシステムライブラリで検索されます。 ジョブステップでコーディングされたSTEPLIBは、JOBLIBステートメントをオーバーライドします。

次の例は、JOBLIBおよびSTEPLIBステートメントの使用法を示しています。

//MYJCL JOB ,,CLASS=6,NOTIFY=&SYSUID
//*
//JOBLIB DD DSN=MYPROC.BASE.LIB1,DISP=SHR
//*
//STEP1 EXEC PGM=MYPROG1
//INPUT1 DD DSN=MYFILE.SAMPLE.INPUT1,DISP=SHR
//OUTPUT1 DD DSN=MYFILES.SAMPLE.OUTPUT1,DISP=(,CATLG,DELETE),
//          RECFM=FB,LRECL=80
//*
//STEP2 EXEC PGM=MYPROG2
//STEPLIB DD DSN=MYPROC.BASE.LIB2,DISP=SHR
//INPUT2 DD DSN=MYFILE.SAMPLE.INPUT2,DISP=SHR
//OUTPUT2 DD DSN=MYFILES.SAMPLE.OUTPUT2,DISP=(,CATLG,DELETE),
//          RECFM=FB,LRECL=80

ここでは、プログラムMYPROG1(STEP1)のロードモジュールがMYPROC.SAMPLE.LIB1で検索されます。 見つからない場合は、システムライブラリで検索されます。 STEP2では、STEPLIBがJOBLIBをオーバーライドし、プログラムMYPROG2のロードモジュールがMYPROC.SAMPLE.LIB2で検索され、次にシステムライブラリで検索されます。

INCLUDEステートメント

PDSのメンバー内でコーディングされたJCLステートメントのセットは、 INCLUDE ステートメントを使用してJCLに含めることができます。 JESがJCLを解釈すると、INCLUDEメンバー内のJCLステートメントのセットがINCLUDEステートメントを置き換えます。

構文

JCL INCLUDEステートメントの基本構文は次のとおりです。

//name INCLUDE MEMBER=member-name

INCLUDEステートメントの主な目的は再利用性です。 例えば、多くのJCLで使用される共通ファイルは、INCLUDEメンバー内のDDステートメントとしてコーディングし、JCLで使用できます。

ダミーDDステートメント、データカード仕様、PROC、JOB、PROCステートメントは、INCLUDEメンバー内にコーディングできません。 INLCUDEステートメントは、INCLUDEメンバー内でコーディングでき、さらに15レベルまでネストできます。

JCLLIBステートメント

*JCLLIB* ステートメントは、ジョブで使用されるプライベートライブラリを識別するために使用されます。 インストリームプロシージャとカタログ化プロシージャの両方で使用できます。

構文

JCL JCLLIBステートメントの基本的な構文は次のとおりです。

//name JCLLIB ORDER=(library1, library2....)

JCLLIBステートメントで指定されたライブラリーは、ジョブで使用されるプログラム、プロシージャー、およびINCLUDEメンバーを見つけるために、指定された順序で検索されます。 JCLにはJCLLIBステートメントが1つしかありません。 JOBステートメントの後、EXECおよびINCLUDEステートメントの前に指定されますが、INCLUDEメンバー内でコーディングすることはできません。

次の例では、プログラムMYPROG3およびINCLUDEメンバーMYINCLが、MYPROC.BASE.LIB1、MYPROC.BASE.LIB2、システムライブラリの順に検索されます。

//MYJCL JOB ,,CLASS=6,NOTIFY=&SYSUID
//*
//MYLIB JCLLIB ORDER=(MYPROC.BASE.LIB1,MYPROC.BASE.LIB2)
//*
//STEP1 EXEC PGM=MYPROG3
//INC INCLUDE MEMBER=MYINCL
//OUTPUT1 DD DSN=MYFILES.SAMPLE.OUTPUT1,DISP=(,CATLG,DELETE),
//          RECFM=FB,LRECL=80
//*

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。

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ステートメントがコメント化されていることに注意してください。

JCL-データセットの定義

データセット名はファイルの名前を指定し、JCLのDSNで示されます。 DSNパラメーターは、新規作成または既存のデータセットの物理データセット名を参照します。 DSN値は、ピリオドで区切られた1〜8文字の長さのサブ名と、44文字(英数字)の合計長で構成できます。 構文は次のとおりです。

DSN=&name | *.stepname.ddname

一時データセット*は、ジョブの期間だけストレージを必要とし、ジョブの完了時に削除されます。 そのようなデータセットは、 *DSN =&name として、または単にDSNを指定せずに表されます。

ジョブステップによって作成された一時データセットが次のジョブステップで使用される場合、 DSN = 。stepname.ddname *として参照されます。 これは*後方参照*と呼ばれます。

データセットの連結

同じ形式のデータセットが複数ある場合、それらを連結して、単一のDD名でプログラムへの入力として渡すことができます。

//CONCATEX JOB CLASS=6,NOTIFY=&SYSUID
//*
//STEP10    EXEC PGM=SORT
//SORTIN    DD DSN=SAMPLE.INPUT1,DISP=SHR
//         DD DSN=SAMPLE.INPUT2,DISP=SHR
//         DD DSN=SAMPLE.INPUT3,DISP=SHR
//SORTOUT   DD DSN=SAMPLE.OUTPUT,DISP=(,CATLG,DELETE),
//         LRECL=50,RECFM=FB

上記の例では、3つのデータセットが連結され、SORTIN DD名でSORTプログラムへの入力として渡されます。 ファイルはマージされ、指定されたキーフィールドでソートされ、SORTOUT DD名の単一の出力ファイルSAMPLE.OUTPUTに書き込まれます。

データセットのオーバーライド

標準化されたJCLでは、実行されるプログラムとその関連データセットは、JCLで呼び出されるカタログ式プロシージャ内に配置されます。 通常、テスト目的またはインシデント修正のために、カタログ式手順で指定されたデータセット以外の異なるデータセットを使用する必要がある場合があります。 その場合、プロシージャ内のデータセットはJCLでオーバーライドできます。

//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//JSTEP1    EXEC CATLPROC,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT
//         DATAC=MYDATA.BASE.LIB1(DATA1)
//STEP1.IN1 DD DSN=MYDATA.OVER.INPUT,DISP=SHR
//*
//* The cataloged procedure is as below:
//*
//CATLPROC PROC PROG=,BASELB=MYCOBOL.BASE.LIB1
//*
//STEP1     EXEC PGM=&PROG
//STEPLIB   DD DSN=&BASELB,DISP=SHR
//IN1       DD DSN=MYDATA.URMI.INPUT,DISP=SHR
//OUT1      DD SYSOUT=*
//SYSOUT    DD SYSOUT=*
//SYSIN     DD MYDATA.BASE.LIB1(DATA1),DISP=SHR
//*
//STEP2     EXEC PGM=SORT

上記の例では、データセットIN1は、PROCのファイルMYDATA.URMI.INPUTを使用します。これは、JCLでオーバーライドされます。 したがって、実行で使用される入力ファイルはMYDATA.OVER.INPUTです。 データセットはSTEP1.IN1として参照されることに注意してください。 JCL/PROCに1つのステップしかない場合は、DD名だけでデータセットを参照できます。 同様に、JCLに複数のステップがある場合、データセットはJSTEP1.STEP1.IN1としてオーバーライドされます。

//SAMPINST  JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//STEP      EXEC CATLPROC,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT
//         DATAC=MYDATA.BASE.LIB1(DATA1)
//STEP1.IN1 DD DSN=MYDATA.OVER.INPUT,DISP=SHR
//         DD DUMMY
//         DD DUMMY
//*

上記の例では、IN1で連結された3つのデータセットのうち、最初のデータセットはJCLでオーバーライドされ、残りはPROCに存在するものとして保持されます。

JCLでのGDGの定義

生成データグループ(GDG)は、共通の名前で相互に関連付けられたデータセットのグループです。 共通名はGDGベースと呼ばれ、ベースに関連付けられた各データセットはGDGバージョンと呼ばれます。

たとえば、MYDATA.URMI.SAMPLE.GDGはGDGベース名です。 データセットには、MYDATA.URMI.SAMPLE.GDG.G0001V00、MYDATA.URMI.SAMPLE.GDG.G0002V00などの名前が付けられます。 GDGの最新バージョンはMYDATA.URMI.SAMPLE.GDG(0)と呼ばれ、以前のバージョンは(-1)、(-2)などと呼ばれます。 プログラムで作成される次のバージョンは、JCLでMYDATA.URMI.SAMPLE.GDG(+1)として参照されます。

JCLでGDGを作成/変更する

GDGバージョンは、同じまたは異なるDCBパラメーターを持つことができます。 初期モデルDCBは、すべてのバージョンで使用されるように定義できますが、新しいバージョンを作成するときにオーバーライドできます。

//GDGSTEP1 EXEC PGM=IDCAMS
//SYSPRINT DD  SYSOUT=*
//SYSIN    DD  *
           DEFINE GDG(NAME(MYDATA.URMI.SAMPLE.GDG)   -
           LIMIT(7)                           -
           NOEMPTY                            -
           SCRATCH)
/*
//GDGSTEP2 EXEC PGM=IEFBR14
//GDGMODLD DD  DSN=MYDATA.URMI.SAMPLE.GDG,
//        DISP=(NEW,CATLG,DELETE),
//        UNIT=SYSDA,
//        SPACE=(CYL,10,20),
//        DCB=(LRECL=50,RECFM=FB)
//

上記の例では、IDCAMSユーティリティは、SYSIN DDステートメントで渡される以下のパラメーターを使用してGDGSTEP1のGDGベースを定義します。

  • NAME は、GDGベースの物理データセット名を指定します。
  • LIMIT は、GDGベースが保持できるバージョンの最大数を指定します。
  • EMPTY は、LIMITに達するとすべての世代をカタログ解除します。
  • NOEMPTY は、最も新しい世代をカタログ解除します。
  • SCRATCH は、カタログ化されていない世代を物理的に削除します。
  • NOSCRATCH はデータセットを削除しません。つまり、UNITおよびVOLパラメーターを使用して参照できます。

GDGSTEP2では、IEFBR14ユーティリティーは、すべてのバージョンで使用されるモデルDDパラメーターを指定します。

IDCAMSを使用して、LIMITの増加、EMPTYのNOEMPTYへの変更など、GDGの定義パラメーターを変更できます。SYSINコマンドを使用する関連バージョンは ALTER MYDATA.URMI.SAMPLE.GDG LIMIT(15)EMPTY です。

JCLでGDGを削除する

IEFBR14ユーティリティを使用して、GDGの単一バージョンを削除できます。

//GDGSTEP3   EXEC PGM=IEFBR14
//GDGDEL     DD  DSN=MYDATA.URMI.SAMPLE.GDG(0),
//          DISP=(OLD,DELETE,DELETE)

上記の例では、MYDATA.URMI.SAMPLE.GDGの最新バージョンが削除されます。 通常のジョブ完了のDISPパラメーターはDELETEとしてコーディングされていることに注意してください。 したがって、ジョブの実行が完了すると、データセットは削除されます。

IDCAMSは、SYSINコマンド DELETE(MYDATA.URMI.SAMPLE.GDG)GDG FORCE/PURGE を使用して、GDGおよびその関連バージョンを削除するために使用できます。

  • FORCE は、GDGバージョンとGDGベースを削除します。 GDGバージョンのいずれかに有効期限が設定されており、まだ有効期限が切れていない場合、それらは削除されないため、GDGベースが保持されます。
  • PURGE は、有効期限に関係なく、GDGバージョンとGDGベースを削除します。

JCLでGDGを使用する

次の例では、MYDATA.URMI.SAMPLE.GDGの最新バージョンがプログラムへの入力として使用され、MYDATA.URMI.SAMPLE.GDGの新しいバージョンが出力として作成されます。

//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01   EXEC PGM=MYCOBB
//IN1     DD DSN=MYDATA.URMI.SAMPLE.GDG(0),DISP=SHR
//OUT1    DD DSN=MYDATA.URMI.SAMPLE.GDG(+1),DISP=(,CALTG,DELETE)
//       LRECL=100,RECFM=FB

ここで、GDGがMYDATA.URMI.SAMPLE.GDG.G0001V00などの実際の名前で参照されていた場合、実行前に毎回JCLを変更することになります。 (0)と(+1)を使用すると、実行のためにGDGバージョンが動的に置き換えられます。

入出力メソッド

JCLを介して実行されるバッチプログラムには、データ入力が必要です。データ入力は処理され、出力が作成されます。 プログラムに入力を送り、JCLから受け取った出力を書き込む方法はいくつかあります。 バッチモードでは、ユーザーとの対話は必要ありませんが、入力デバイスと出力デバイス、および必要な組織はJCLで定義され、送信されます。

JCLでのデータ入力

JCLを使用してプログラムにデータをフィードするにはさまざまな方法があり、これらの方法は以下で説明されています。

INSTREAM DATA

プログラムへのインストリームデータは、SYSIN DDステートメントを使用して指定できます。

//CONCATEX JOB CLASS=6,NOTIFY=&SYSUID
//*Example 1:
//STEP10 EXEC PGM=MYPROG
//IN1    DD DSN=SAMPLE.INPUT1,DISP=SHR
//OUT1   DD DSN=SAMPLE.OUTPUT1,DISP=(,CATLG,DELETE),
//      LRECL=50,RECFM=FB
//SYSIN  DD*
//CUST1  1000
//CUST2  1001
/*
//*
//* Example 2:
//STEP20 EXEC PGM=MYPROG
//OUT1   DD DSN=SAMPLE.OUTPUT2,DISP=(,CATLG,DELETE),
//      LRECL=50,RECFM=FB
//SYSIN  DD DSN=SAMPLE.SYSIN.DATA,DISP=SHR
//*

例1では、MYPROGへの入力はSYSINを介して渡されます。 データはJCL内で提供されます。 データの2つのレコードがプログラムに渡されます。/*はインストリームSYSINデータの終わりを示すことに注意してください。

「CUST1 1000」はrecord1、「CUST2 1001」はrecord2です。 データの読み取り中にシンボル/*が検出されると、データの終わり条件が満たされます。

例2では、​​SYSINデータはデータセット内に保持されます。SAMPLE.SYSIN.DATAはPSファイルであり、データの1つ以上のレコードを保持できます。

ファイルを介したデータ入力

前の章のほとんどの例で述べたように、プログラムへのデータ入力は、PS、VSAM、またはGDGファイルを介して、関連するDSN名とDISPパラメーターとともにDDステートメントで提供できます。

例1では、SAMPLE.INPUT1はデータがMYPROGに渡される入力ファイルです。 プログラム内ではIN1と呼ばれます。

JCLでのデータ出力

JCLの出力は、データセットにカタログ化するか、SYSOUTに渡すことができます。 DDステートメントの章で述べたように、 SYSOUT = *は、JOBステートメントのMSGCLASSパラメーターで言及されたものと同じクラスに出力をリダイレクトします。

ジョブログを保存する

*MSGCLASS = Y* を指定すると、ジョブログがJMR(Joblog Management and Retrieval)に保存されます。 JOBログ全体をSPOOLにリダイレクトし、SPOOLのジョブ名に対してXDCコマンドを実行することにより、データセットに保存できます。 XDCコマンドがSPOOLで指定されると、データセット作成画面が開きます。 その後、適切なPSまたはPDS定義を指定して、ジョブログを保存できます。

SYSOUTおよびSYSPRINT用に作成済みのデータセットを指定することにより、ジョブログをデータセットに保存することもできます。 ただし、JMRまたはXDCで行われるように、ジョブログ全体をこの方法でキャプチャすることはできません(つまり、JESMSGはカタログ化されません)。

//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//STEP1    EXEC PGM=MYPROG
//IN1      DD DSN=MYDATA.URMI.INPUT,DISP=SHR
//OUT1     DD SYSOUT=*
//SYSOUT   DD DSN=MYDATA.URMI.SYSOUT,DISP=SHR
//SYSPRINT DD DSN=MYDATA.URMI.SYSPRINT,DISP=SHR
//SYSIN    DD MYDATA.BASE.LIB1(DATA1),DISP=SHR
//*
//STEP2    EXEC PGM=SORT

上記の例では、SYSOUTはMYDATA.URMI.SYSOUTにカタログされ、SYSPRINTはMYDATA.URMI.SYSPRINTにカタログされています。

JCLを使用したCOBOLプログラムの実行

COBOLプログラムのコンパイル

JCLを使用してバッチモードでCOBOLプログラムを実行するには、プログラムをコンパイルする必要があり、すべてのサブプログラムでロードモジュールが作成されます。 JCLは、実行時に実際のプログラムではなく、ロードモジュールを使用します。 ロードライブラリは連結され、 JCLLIB または STEPLIB を使用して実行時にJCLに渡されます。

COBOLプログラムのコンパイルには、多くのメインフレームコンパイラユーティリティが利用できます。 一部の企業では、 Endevor などの変更管理ツールを使用しています。これは、プログラムのすべてのバージョンをコンパイルして保存します。 これは、プログラムに加えられた変更を追跡するのに役立ちます。

//COMPILE   JOB ,CLASS=6,MSGCLASS=X,NOTIFY=&SYSUID
//*
//STEP1     EXEC IGYCRCTL,PARM=RMODE,DYNAM,SSRANGE
//SYSIN     DD DSN=MYDATA.URMI.SOURCES(MYCOBB),DISP=SHR
//SYSLIB    DD DSN=MYDATA.URMI.COPYBOOK(MYCOPY),DISP=SHR
//SYSLMOD   DD DSN=MYDATA.URMI.LOAD(MYCOBB),DISP=SHR
//SYSPRINT  DD SYSOUT=*
//*

IGYCRCTLは、IBM COBOLコンパイラユーティリティです。 コンパイラーのオプションは、PARMパラメーターを使用して渡されます。 上記の例では、RMODEは、プログラムで相対アドレス指定モードを使用するようコンパイラーに指示します。 COBOLプログラムはSYSINパラメーターを使用して渡され、コピーブックはSYSLIBのプログラムで使用されるライブラリーです。

このJCLは、実行JCLへの入力として使用される出力としてプログラムのロードモジュールを生成します。

COBOLプログラムの実行

プログラムMYPROGが入力ファイルMYDATA.URMI.INPUTを使用して実行され、スプールに書き込まれる2つの出力ファイルを生成するJCLの例の下。

//COBBSTEP  JOB CLASS=6,NOTIFY=&SYSUID
//
//STEP10    EXEC PGM=MYPROG,PARM=ACCT5000
//STEPLIB   DD DSN=MYDATA.URMI.LOADLIB,DISP=SHR
//INPUT1    DD DSN=MYDATA.URMI.INPUT,DISP=SHR
//OUT1      DD SYSOUT=*
//OUT2      DD SYSOUT=*
//SYSIN     DD *
//CUST1     1000
//CUST2     1001
/*

MYPROGのロードモジュールはMYDATA.URMI.LOADLIBにあります。 これは、上記のJCLが非DB2 COBOLモジュールにのみ使用できることに注意することが重要です。

COBOLプログラムへのデータの受け渡し

COBOLバッチプログラムへのデータ入力には、ファイル、PARAMパラメーター、およびSYSIN DDステートメントを使用できます。 上記の例では:

  • データレコードは、MYDATA.URMI.INPUTファイルを介してMYPROGに渡されます。 このファイルは、プログラム内でDD名INPUT1を使用して参照されます。 ファイルは、プログラムで開いたり、読み取ったり、閉じたりできます。
  • PARMパラメーターデータACCT5000は、そのセクション内で定義された変数のプログラムMYPROGのLINKAGEセクションで受信されます。
  • SYSINステートメントのデータは、プログラムのPROCEDURE部門のACCEPTステートメントを介して受信されます。 すべてのACCEPTステートメントは、1つのレコード全体(つまり、CUST1 1000)をプログラムで定義された作業用ストレージ変数に読み込みます。

COBOL-DB2プログラムの実行

COBOL DB2プログラムを実行するには、JCLおよびプログラムで専用のIBMユーティリティが使用されます。 DB2領域および必須パラメーターは、ユーティリティーへの入力として渡されます。

COBOL-DB2プログラムを実行するには、次の手順に従います。

  • COBOL-DB2プログラムがコンパイルされると、DBRM(データベース要求モジュール)がロードモジュールとともに作成されます。 DBRMには、COBOLプログラムのSQLステートメントが含まれており、構文が正しいことが確認されています。
  • DBRMは、COBOLが実行されるDB2領域(環境)にバインドされます。 これは、JCLでIKJEFT01ユーティリティーを使用して実行できます。
  • バインドステップの後、JCLへの入力としてロードライブラリとDBRMライブラリを使用してIKJEFT01(再度)を使用して、COBOL-DB2プログラムを実行します。
//STEP001  EXEC PGM=IKJEFT01
//*
//STEPLIB  DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR
//*
//input files
//output files
//SYSPRINT DD SYSOUT=*
//SYSABOUT DD SYSOUT=*
//SYSDBOUT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//DISPLAY  DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN  DD *
    DSN SYSTEM(SSID)
    RUN PROGRAM(MYCOBB) PLAN(PLANNAME) PARM(parameters to cobol program) -
    LIB('MYDATA.URMI.LOADLIB')
    END
/*

上記の例では、MYCOBBはIKJEFT01を使用して実行されるCOBOL-DB2プログラムです。 プログラム名、DB2サブシステムID(SSID)、DB2プラン名はSYSTSIN DDステートメント内で渡されることに注意してください。 DBRMライブラリーはSTEPLIBで指定されます。

JCL-ユーティリティプログラム

IBMデータセットユーティリティ

ユーティリティプログラムは事前に作成されたプログラムで、システムプログラマーやアプリケーション開発者がメインフレームで広く使用して、日々の要件を達成し、データを整理および維持します。 それらのいくつかをその機能とともに以下にリストします。

Utility Name Functionality
IEHMOVE Moves or copies sequential datasets.
IEHPROGM Deleting and renaming datasets; catalog or uncatalog datasets other than VSAM.<
IEHCOMPR Compares data in sequential datasets.
IEBCOPY Copy, Merge, compress, back-up or restore PDS.
IEFBR14

No operation utility. Used to return control to user and terminate. It is usually used to create empty dataset or delete an existing dataset.

たとえば、データセットがDISP =(OLD、DELETE、DELETE)を指定してIEFBR14プログラムへの入力として渡される場合、データセットはジョブの完了時に削除されます。

IEBEDIT Used to copy selected parts of a JCL. For Example, if a JCL has 5 steps and we require to execute step 1 and 3 only, then a IEBEDIT JCL can be coded with a dataset which contains the actual JCL to be executed. In the SYSIN of IEBEDIT, we can specify STEP1 and STEP3 as parameters. When this JCL is executed, it executes the STEP1 and STEP3 of the actual JCL.
IDCAMS Create, delete, rename, catalog, uncatalog datasets (other than PDS). Usually used to manage VSAM datasets.

これらのユーティリティプログラムは、指定された機能を実現するために、JCLの適切なDDステートメントで使用する必要があります。

DFSORTの概要

DFSORTは、データセットのコピー、ソート、またはマージに使用される強力なIBMユーティリティです。 SORTINおよびSORTINnn DDステートメントは、入力データセットを指定するために使用されます。 SORTOUTおよびOUTFILステートメントは、出力データを指定するために使用されます。

SYSIN DDステートメントは、ソート条件とマージ条件を指定するために使用されます。 DFSORTは通常、以下の機能を実現するために使用されます。

  • 入力ファイルをファイル内の指定されたフィールドの位置の順に並べ替えます。
  • 指定された条件に基づいて、入力ファイルからレコードをINCLUDEまたはOMITします。
  • SORT MERGE入力ファイルを、ファイル内の指定されたフィールドの位置の順に並べます。
  • SORT JOIN指定されたJOIN KEY(各入力ファイルのフィールド)に基づいて2つ以上の入力ファイルを結合します。
  • 入力ファイルで追加の処理を行う場合、USER EXITプログラムをSORTプログラムから呼び出すことができます。 たとえば、出力ファイルに追加するヘッダー/トレーラーがある場合、ユーザーが作成したCOBOLプログラムをSORTプログラムから呼び出して、この機能を実行できます。 コントロールカードを使用して、データをCOBOLプログラムに渡すことができます。
  • 逆に、SORTをCOBOLプログラムから内部的に呼び出して、処理する前に入力ファイルを特定の順序に並べることができます。 通常、これは大きなファイルのパフォーマンスの観点から推奨されません。

ICETOOLの概要

ICETOOLは、データセットに対してさまざまな操作を実行するために使用される多目的DFSORTユーティリティです。 入力および出力データセットは、ユーザー定義のDD名を使用して定義できます。 ファイル操作は、TOOLIN DDステートメントで指定されます。 追加の条件は、ユーザー定義の「CTL」DDステートメントで指定できます。

ICETOOLのユーティリティのいくつかを以下に示します。

  • ICETOOLは、1つ以上の条件でDFSORTのすべての機能を実現できます。
  • SPLICEは、SORT JOINに似ていますが、追加機能を備えたICETOOLの強力な操作です。 指定されたフィールドの2つ以上のファイルを比較し、一致するレコードを持つファイル、一致しないレコードを持つファイルなどの1つ以上の出力ファイルを作成できます。
  • 特定の位置にある1つのファイルのデータは、同じファイルまたは異なるファイルの別の位置にオーバーレイできます。
  • ファイルは、指定された条件に基づいてn個のファイルに分割できます。 たとえば、従業員の名前を含むファイルは26個のファイルに分割でき、各ファイルにはA、B、Cなどで始まる名前が含まれます。
  • ICETOOLを使用して、ツールを少し調べれば、ファイル操作のさまざまな組み合わせが可能です。

SYNCSORTの概要

SYNCSORTは、データセットを高いパフォーマンスでコピー、マージ、またはソートするために使用されます。 システムリソースを最大限に活用し、31ビットおよび64ビットのアドレス空間で効率的に動作します。

DFSORTの同じ行で使用でき、同じ機能を実現できます。 JCLによって、またはCOBOL、PL/1、またはアセンブラー言語でコーディングされたプログラム内から呼び出すことができます。 また、SYNCSORTプログラムから呼び出されるユーザー出口プログラムもサポートしています。

これらのユーティリティを使用して頻繁に使用されるソートトリックについては、次の章で説明します。 COBOL/ASSEMBLERでの膨大なプログラミングを必要とする複雑な要件は、上記のユーティリティを使用して簡単な手順で実現できます。

JCL-基本的なソートのコツ

ユーティリティプログラムを使用して達成できる企業の世界での日々のアプリケーション要件を以下に示します。

1. ファイルには100レコードがあります。 最初の10レコードを出力ファイルに書き込む必要があります。

//JSTEP020 EXEC PGM=ICETOOL
//TOOLMSG  DD SYSOUT=*
//DFSMSG   DD SYSOUT=*
//IN1      DD DSN=MYDATA.URMI.STOPAFT,DISP=SHR
//OUT1     DD SYSOUT=*
//TOOLIN   DD *
  COPY FROM(IN1) TO(OUT1) USING(CTL1)
/*
//CTL1CNTL DD *
  OPTION STOPAFT=10
/*

オプションSTOPAFTは、10番目のレコードの後に​​入力ファイルの読み取りを停止し、プログラムを終了します。 したがって、10個のレコードが出力に書き込まれます。

2. 入力ファイルには、同じ従業員番号の1つ以上のレコードがあります。 一意のレコードを出力に書き込みます。

//STEP010  EXEC PGM=SORT
//SYSOUT   DD SYSOUT=*
//SORTIN   DD DSN=MYDATA.URMI.DUPIN,DISP=SHR
//SORTOUT  DD SYSOUT=*
//SYSIN    DD *
  SORT FIELDS=(1,15,ZD,A)
  SUM FIELDS=NONE
/*

SUM FIELDS = NONEは、SORT FIELDSで指定されたフィールドの重複を削除します。 上記の例では、従業員番号はフィールド位置1,15にあります。 出力ファイルには、昇順でソートされた一意の従業員番号が含まれます。

3. 入力レコードの内容を上書きします。

//JSTEP010 EXEC PGM=SORT
//SORTIN   DD DSN= MYDATA.URMI.SAMPLE.MAIN,DISP=SHR
//SORTOUT  DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT= *
//SYSIN    DD*
 OPTION COPY
  INREC OVERLAY=(47:1,6)
/*

入力ファイルでは、位置1,6のコンテンツは位置47,6に上書きされ、出力ファイルにコピーされます。 INREC OVERLAY操作は、出力にコピーする前に入力ファイルのデータを書き換えるために使用されます。

  • 4. 出力ファイルにシーケンス番号を追加します。 *
//JSTEP010 EXEC PGM=SORT
//SORTIN   DD*
  data1
  data2
  data3
/*
//SORTOUT  DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT= *
//SYSIN    DD*
 OPTION COPY
 BUILD=(1:1,5,10:SEQNUM,4,ZD,START=1000,INCR=2)
/*

出力は次のようになります。

data1    1000
data2    1002
data3    1004

4桁のシーケンス番号が出力の位置10に追加され、1000から始まり、レコードごとに2ずつ増えます。

  • 5. ヘッダー/トレーラーを出力ファイルに追加します。 *
//JSTEP010 EXEC PGM=SORT
//SORTIN   DD*
  data1
  data2
  data3
/*
//SORTOUT  DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT= *
//SYSIN    DD*
 SORT FIELDS=COPY
  OUTFIL REMOVECC,
  HEADER1=(1:C'HDR',10:X'020110131C'),
  TRAILER1=(1:C'TRL',TOT=(10,9,PD,TO=PD,LENGTH=9))
/*

出力は次のようになります。

HDR       20110131
data1
data2
data3
TRL       000000003

TOTは、入力ファイルのレコード数を計算します。 HDRおよびTRLは、ユーザー定義のヘッダー/トレーラーに識別子として追加され、ユーザーのニーズに応じてカスタマイズできます。

  • 6. 条件付き処理 *
//JSTEP010 EXEC PGM=SORT
//SORTIN   DD*
  data1select
  data2
  data3select
/*
//SORTOUT  DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT= *
//SYSIN    DD*
  INREC  IFTHEN=(WHEN=(6,1,CH,NE,C' '),BUILD=(1:1,15),
         IFTHEN=(WHEN=(6,1,CH,EQ,C' '),BUILD=(1:1,5,7:C'EMPTY    ')
  OPTION COPY
/*

出力は次のようになります。

data1select
data2 EMPTY
data3select

ファイルの6番目の位置に基づいて、出力ファイルのビルドは異なります。 6番目の位置がSPACESの場合、テキスト「EMPTY」が入力レコードに追加されます。 そうでない場合、入力レコードはそのまま出力に書き込まれます。

7. ファイルのバックアップ

//JSTEP001 EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT= *
//SYSIN    DD*
//SYSOUT   DD SYSOUT=*
//SORTOUT  DD DUMMY
//SYSUT1   DD DSN=MYDATA.URMI.ORIG,DISP=SHR
//SYSUT2   DD DSN=MYDATA.URMI.BACKUP,DISP=(NEW,CATLG,DELETE),
//            DCB=*.SYSUT1,SPACE=(CYL,(50,1),RLSE)

IEBGENERは、SYSUT1のファイルをSYSUT2のファイルにコピーします。 SYSUT2のファイルは、上記の例のSYSUT1と同じDCBを取ることに注意してください。

  • 8. ファイル比較 *
//STEP010  EXEC PGM=SORT
//MAIN     DD*
  1000
  1001
  1003
  1005
//LOOKUP   DD *
  1000
  1002
  1003
//MATCH    DD DSN=MYDATA.URMI.SAMPLE.MATCH,DISP=OLD
//NOMATCH1 DD DSN=MYDATA.URMI.SAMPLE.NOMATCH1,DISP=OLD
//NOMATCH2 DD DSN=MYDATA.URMI.SAMPLE.NOMATCH2,DISP=OLD
//SYSOUT   DD SYSOUT= *
//SYSIN    DD*
  JOINKEYS F1=MAIN,FIELDS=(1,4,A)
  JOINKEYS F2=LOOKUP,FIELDS=(1,4,A)
  JOIN UNPAIRED,F1,F2
  REFORMAT FIELDS=(?,F1:1,4,F2:1,4)
  OPTION COPY
  OUTFIL FNAMES=MATCH,INCLUDE=(1,1,CH,EQ,C'B'),BUILD=(1:2,4)
  OUTFIL FNAMES=NOMATCH1,INCLUDE=(1,1,CH,EQ,C'1'),BUILD=(1:2,4)
  OUTFIL FNAMES=NOMATCH2,INCLUDE=(1,1,CH,EQ,C'2'),BUILD=(1:2,4)
/*
  • JOINKEYSは、2つのファイルが比較されるフィールドを指定します。
  • フィールドの再フォーマット=? 出力BUILDの最初の位置に「B」(一致したレコード)、「1」(file1に存在するがfile2には存在しない)、または「2」(file2に存在するがfile1に存在しない)を配置します。
  • JOIN UNPAIREDは、2つのファイルに対して完全な外部結合を行います。

出力は次のようになります。

MATCH File
1000
1003

NOMATCH1 File
1001
1005

NOMATCH2 File
1002

ICETOOLを使用しても同じ機能を実現できます。 Jcl-questions-answers