■  「はじめに」の前の前に・・・


IBM汎用機の歴史や、「S/3x0」って何?「MVS」って何?、、、なんていうことは当サイトでは解説しません。
他サイトでお調べください。
ちなみに・・・
「システム360」の360は、「360度どのような方向でも使える」という意味からきているそうです。

ちなみに、MVSとz/OSの違いは・・・
z/OSは、MVSの後継OSです。アドレッシングは64ビットで、UNIX互換環境もあります。
過去のコマンドやJCLは、z/OS上でそのまま使えますが、アドレッシングが64ビットなもんで、一部の機械語が 変更になっています。

■ 「はじめに」の前に・・・

JCLとは、ジョブ制御言語(JOB Control Language)の略で汎用機に対してのプログラムの実行を指示するための 制御言語です。WindowsでいうバッチファイルやWindowsスクリプト、UNIXでいうシェルに相当するイメージのモノです。
こ〜んな感じのテキストファイルです⇒JCLサンプル
汎用機では、プログラムの実行は全てJCLにプログラム名を記述し、そのJCLを起動することでプログラムが実行されます。
パソコンのように、何かをダブルクリック(そもそも汎用機にマウスなんてないよ)するわけじゃありません。
JCLを起動するには、コンソール(オペレータ操作卓)からコマンドで実行するか、JCLをエディターで開いてコマンドを入力して 起動します。
こ〜んな感じです⇒実行サンプル

■ はじめに

オペレーティング・システムにプログラムを処理させるためには、プログラマーがある種のジ ョブ制御のための作業を行わなければなりません。この作業は、次の制御ステートメン トを用いて行います。
1つのJOBは、下記のジョブ制御ステートメントで構成されています。==>解説はこちらです。

上記も含めてジョブ制御ステートメントの全ての種類は下記のとおりです。

ジョブ制御ステートメント
ステートメント名前目的
JCLステートメント
// コマンドJCL コマンド 入力ストリームから、MVSシステム操作員コマンドを入力します。コマンド・ス テートメントは、主に操作員が使用します。JESコマンドはJCLコマンド・ステートメントではなく、 COMMANDステートメントを使用してください。
このJCLサンプルはこちらにあります。

注:JES3は、JCLコマン ド・ステートメントを無視します。
//  COMMAND コマンド JCLを変換するとき、システムが出すMVSコマンドまたはJES2コマンドを指定します。 JCLコマンド・ステートメントでコマンドを指定する方法よりも望ましいコマンドの指定方法です。
このJCLサンプルはこちらにあります。

注:JES3は、JCL COMMANDステートメントを無視します。
//*  注釈 注釈 注釈を入れます。注釈ステートメントは、主にプログラムおよびその資源要件を 文書化しておくために使用します。
//  CNTL 制御 1つまたは複数のプログラム制御ステートメントの始まりを示します。
//  DD データ定義 データ・セットを指定し記述します。
/* 区切り文字 入力ストリーム内に置かれたデータの終わりを示します。
注:ユーザーは、任意の2文字を区切り文字に指定 することができます。
//  ENDCNTL 制御終了 1つまたは複数のプログラム制御ステートメントの終わりを示します。
//  EXEC 実行 ジョブ・ステップの始まりを示し、ステップに名前を割り当て、このステップで 実行するプログラムやカタログ式プロシージャーまたはストリーム内プロシージャーを指定します。
//  IF/THEN/ELSE/ENDIF IF/THEN/ELSE/ENDIF
ステートメント構成
ジョブ内のジョブ・ステップの条件付き実行を指定します。
//  INCLUDE 組込み ジョブ・ストリームに組み込む JCLステートメントが入っている区分データ・ セット (PDS) または拡張区分データ・セット(PDSE) のメンバーを指定します。
//  JCLLIB JCLライブラリー システムが次のものを探すライブラリーを指定します。
INCLUDEグループ 、EXEC ステートメントで指定したプロシージャー
//  JOB ジョブ ジョブの始まりを示し、そのジョブに名前を割り当てます。
// 空白 ジョブの終わりを示します。
//  OUTPUT 出力JCL SYSOUTデータ・セットの印刷のためにジョブ入力サブシステムが使用する処理 オプションを指定します。
//  PEND プロシージャー終了 ストリーム内プロシージャーまたはカタログ式プロシージャーの終わりを示します。
//  PROC プロシージャー ストリーム内プロシージャーの始まりを示します。カタログ式プロシージャーの 始まりを示すこともあります。また、プロシージャーで定義されているパラメーターに 省略時値を割り当てます。
//  SET 設定 JCLステートメントの処理時に使用する記号パラメーターに初期値を定義し、割り当てます。 記号パラメーターに割り当てられている値を変更するか空白にします。
//  XMIT 伝送 入力ストリーム・レコードをあるノードから他のノードに伝送します。

注:XMIT JCLステートメントは、JES3システムでのみ有効です。
赤字のステートメントがよく使うステートメントです。

JCLステートメントは、1つまたは複数の80バイト単位のレコードで構成されています。
各JCLステートメントは、論理的に以下の5つのフィールドに分かれます。 ただし、これら5つのフィールドがすべてのステートメントにあるわけではありません。
(1行のJCLステートメントのことを「カード」と表現する場合があります(←オジサンに多い)。 これは、大昔は1行のJCLステートメントを紙カードで読み込ませていたからです。)



識別子フィールド
  識別子フィールドにより、ステートメントがJCLステートメントであり、データではな いことをシステムに知らせます。識別子フィールドの構成は、以下のとおりです。

  • 区切りステートメントを除くすべてのJCLステートメントには、1桁目と2桁目に //を入れます。

  • 区切りステートメントの1桁目と2桁目には、/*を入れるか、 またはDLMパラメーターを用いて区切り文字と指定した2つの文字を入れます。

  • JCL注釈ステートメントの1桁目から3桁目には、//*を入れます。

名前フィールド
  名前フィールドでは、特定のステートメントに名前を付けて、他のステートメントおよび システムからそのステートメントを参照できるようにします。JCLステートメントでは、名前を以下の方法で指定します。

  • 名前は3桁目から始める必要があります。

  • 名前には、1文字から8文字までの英数字または国別文字 ($、#、@) を用います。

  • 先頭文字は英字または国別文字 ($、#、@) でなければなりません。

  • 名前の後には、少なくとも1個のブランクを続けなければなりません。

命令フィールド
  命令フィールドには、ステートメントのタイプ、またはコマンド・ステートメントの場合 はコマンドを指定します。命令フィールドは、以下の方法で指定します。

  • 命令フィールドには、そのステートメントで使用できる構文ボックスで定めた文字から指定します。

  • 命令は、名前フィールドの後に続けて指定します。

  • 命令の前後には、少なくとも 1 個のブランクが必要です。

パラメータフィールド
  パラメーター・フィールドには、各種パラメーターをコンマで区切って指定します。パラ メーター・フィールドは、以下の方法で指定します。

  • パラメーター・フィールドは、命令フィールドの後に続けて指定します。

  • パラメーター・フィールドの前には、少なくとも 1 個のブランクが必要です。

注釈欄
  注釈欄には、制御ステートメントをコーディングするときに役立ちそうなメモ書きを入れ ます。注釈欄は以下の方法でコーディングします。

  • 注釈欄は、パラメーター・フィールドの後に続けます。

  • 注釈欄の前には、少なくとも 1 個のブランクが必要です。

◆ 世界で一番短いJCLサンプル(何もしないJOB)

//jobname JOB
//stepname EXEC PGM=IEFBR14

        ↓  もうちょっと丁寧に書くと

//jobname JOB CLASS=x,MSGCLASS=x,MSGLEVEL=(1,1),NOTIFY=usrname
//stepname EXEC PGM=IEFBR14
/*
//

◆ 典型的なJCLのパターン

//jobname JOB CLASS=x,MSGCLASS=x,MSGLEVEL=(1,1),NOTIFY=usrname
//stepname EXEC PGM=ABCDEFG
//INFILE  DD DSN=INFILE,DISP=SHR
//TMPINP DD DSN=&&TMPINP,DISP=(OLD,DELETE)
//OUTFILE DD DSN=OUTFILE,
//           DISP=(,CATLG),
//           UNIT=xxxxx,
//           SPACE=(CYL,(1,1),RLSE),
//           DCB=(RECFM=xx,LRECL=xxx,BLKSIZE=xxxxx)
//TMPOUT DD DSN=&&TMPOUT,
//           DISP=(,PASS),
//           UNIT=xxxxx,
//           SPACE=(CYL,(1,1),RLSE),
//           DCB=(RECFM=xx,LRECL=xxx,BLKSIZE=xxxxx)
/*
//
←JOB文はJCL内に1つだけ必須
←EXEC文はJCL内に1つ以上必須
←入力ファイルのパターン
←一時ファイル(入力)のパターン
←出力ファイルのパターン




←一時ファイル(出力)のパターン

  • 1行目:JOBの実行を指示しています。
  • 2行目:ABCDEFGというプログラムの実行を指定しています。
  • 3行目:ABCDEFGというプログラム内で入力指示をしているファイルのファイル名を指定しています。
  • 4行目:ABCDEFGというプログラム内で入力指示をしているファイルの一時ファイル名を指定しています。
  • 5行目:ABCDEFGというプログラム内で出力指示をしているファイルのファイル名を指定しています。
  • 6行目:JOBが正常終了した際には、このデータをシステムにカタログすることを指示しています。
  • 7行目:データが保存される装置名を指定しています。
  • 8行目:データが保存される容量を指定しています。
  • 9行目:保存されるデータの編成をを指定しています。
  • 10行目:ABCDEFGというプログラム内で出力指示をしているファイルの一時ファイル名を指定しています。
  • 11行目:JOBが正常終了した際には、このデータをシステムにカタログせずに次のステップに渡すことを指示しています。
  • 12行目:データが保存される装置名を指定しています。
  • 13行目:データが保存される容量を指定しています。
  • 14行目:保存されるデータの編成をを指定しています。

  • 上記のJCLに「なぜDDが4つあるか?」は考えてもわかりません。ABCDEFGというプログラムを作った人がそういうふうに設計したからです。
  • 入力ファイルがカタログされている場合は、DISP=SHR以外は不要です。入力ファイルに対してSPACE=…なんて指定しちゃだめよ。(エラーにはなりませんけど)
  • 入力ファイルに対して、DISP=OLDを指定すると、他のJOBはその資源に対して「待ち」になります。
  • 入力の一時ファイルに、DISP=SHRなんて指定してはいけません!(エラーにはなりませんけど)
  • 出力ファイルをカタログする場合は、上記のパラメータ以外で指定するのは、VOL=SERパラメータとLABEL=RETPDパラメータぐらいしかありません。
  • 出力の一時ファイルに、DISP=(,CATLG)なんて指定してはいけません!(エラーにはなりませんけど)

■ IBMのレコード形式

IBMのレコード形式はここを見て下さい。


原典:日本アイ・ビー・エム株式会社
      GC28-1757-00
      OS/390 MVS JCL Reference
      (一部改変)

TOP PAGE