前回:JCL記載方法まとめ 【初心者編】1
https://qiita.com/nano357/items/65d69af412db32ae6267
④データの定義(DDステートメント)
DDステートメントは、ジョブステップで使用するデータセット(ジョブまたはジョブステップで使用するデータの集まり)や装置についての定義を行う。
識別名(DD名)や以下の、DSN・DISP・UNITT・SPACE・DCB・SYSOUT などデータセットの定義を指定。
※プログラムはデータにアクセスする際、JCLに記載された識別名(DD名)とデータセットの定義を参照する。
サンプルJCL(COBOLプログラム内の SYSUT1 の場合 イメージ)
//STEP16 EXEC PGM=COBOLPGM
//SYSUT1 DD DISP=(NEW,DELETE,DELETE),DSN=OUT171,
// UNIT=SYSDA,SPACE=(80,(20,2)),AVGREC=K,DCB=(BLKSIZE=400)
サンプルCOBOL(COBOLプログラム内の SYSUT1 の場合 イメージ)
**************************************************************************
IDENTIFICATION DIVISION.
**************************************************************************
PROGRAM-ID. TESTPRGM.
ENVIRONMENT DIVISION.
*
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT IN-FILE ASSIGN TO SYSUT1
* >ASSIGN 文節 は 識別名(DD名)に対応
ORGANIZATION IS SEQUENTIAL
* >改行されたデータを読み込むための設定
ACCESS MODE IS SEQUENTIAL
* >順呼び出しを指定
STATUS INPUT-FST.
* >ステータスを管理する領域を設定
**************************************************************************
DATA DIVISION.
**************************************************************************
FILE SECTION.
*
FD IN-FILE.
* >FILE-CONTROL 記入項目は FD 記入項目に対応
01 IN-FILE-R.
03 IN-FILE-REC PIC X(80).
.
.
.
OPEN INPUT IN-FILE.
.
.
.
CLOSE IN-FILE.
STOP RUN.
形式(COBOLプログラム)
SELECT ファイル名(COBOL内で使用) ASSIGN TO データ名(JCL側と接続)
※JCLにどのようなDD名でDDステートメントを定義しなければ
ならないかはプログラムのオペレーション・マニュアルなどに明記される。
※__COBOL__については以下「COBOL記載方法まとめ 【初心者編】1~ 」を参照。
https://qiita.com/nano357/items/462a3ec523a3e624340b
サンプルJCL(DD名)
//INPUT DD DSN=TESTDATA,DISP=SHR
(1) 識別名(DD名)(3桁目~11桁目に記載)
1~8文字の英数字または各国用文字 (#@¥)など
・プログラムがデータにアクセスする際のDD名に合わせてファイル名や
アクセス名を指定することで、その用途を明示する。
・プログラムがアクセスしないデータセットを
定義するDD名であればJCL作成者が自由に決めることが出来る。
また、「IEFBR14プログラム」など、アクセスを伴わずデータセットの
アロケーション(作成)したり、削除したりするプログラムの実行などでも、
DD名は自由に決めることが出来る。
※以下の予約済みDD名はデータアクセス用には使用できない。
JOBLIB、STEPLIB、および SYSUDUMP、SYSABEND、SYSMDUMP
※SYSUDUMP DD ステートメント
SYSABEND DD ステートメント
・ジョブステップがABENDした際に、調査のためのダンプリストを作成。
・ダンプは__定様式__(リスト形式)なので、直接印刷できます。
SYSUDUMPは__ユーザー領域__
(プログラムに関連したメモリー領域)をダンプ
SYSABENDは__ユーザー領域__および
__システム領域などを含めた広い領域__をダンプ
※SYSMDUMP DD ステートメント
・ジョブステップがABENDした際に、調査のためのダンプリストを作成。
・ダンプは定様式にフォーマットされずに、不定様式(バイナリデータ)のまま出力されるのでダンプ出力に要する時間を短縮できる。
※使用する際には対話式問題制御システム (IPCS) で印刷する必要があります。
※JOBLIB、 STEPLIB については以下「JCL記載方法まとめ 【初心者編】1」を参照。
https://qiita.com/nano357/items/65d69af412db32ae6267
サンプルJCL(DSN)
//INPUT DD DSN=TESTDATA,DISP=SHR
(2) DSN(DSNAME)
DSN=のあとに続くものがデータセットの定義
※メンバー名の指定
区分データセットのメンバ名を直接指定することが出来る。
サンプルJCL(DSN)(メンバ名の指定)
//TMYMEM DD DSN=MYLIB.TESTLIB(MEM01),DISP=SHR
・区分データセット名(メンバ名)のように指定し、
指定されたメンバーは1つ順次データセットとして処理できる。
※区分データセットは複数の順次ファイルを
1つのデータセットにまとめて格納できるようにしたもので、
データセット内の1つ1つの順次ファイルをメンバーと呼びます。
詳細は参考文献:サイト様の「07.データセットの種類とアクセス方式」を参照。
※一時的データセットの名前
サンプルJCL(DSN)(一時的データセット)
//TMYDSN DD DSN=&&MYDS,
// DISP=NEW,UNIT=SYSDA,SPACE(TRK,10)
&&ddname は1つのジョブ内で作成し、削除するデータセットであり、一時的データセット(Z/OSのマニュアルでは一時データセット)という。
※逆方向参照
サンプルJCL(DSN)(逆方向参照:同一ステップ内の先行DDステートメント)
//TMYDSN1 DD DSN=&&MYDS,
// DISP=NEW,UNIT=SYSDA,SPACE(TRK,10)
//TMYDSN2 DD DSN=*.TMYDSN1
・逆方向参照とはジョブの中で、すでに出てきたステートメントを参照する。
・同一ステップ内の先行DDステートメントを参照する場合は次のような形で指定します。
*.ddname
サンプルJCL(DSN)(逆方向参照:先行ステップ内のDDステートメント)
//STEP21 EXEC PGM=TESTPGM1
//TMYDSN3 DD DSN=&&MYDS001,
// DISP=(,PASS),UNIT=SYSDA,SPACE(TRK,10)
//*
//STEP22 EXEC PGM=TESTPGM2
//TMYDSN4 DD DSN=*.STEP21.TMYDSN3
・先行ステップ内のDDステートメントを参照する場合は次のような形で指定します。
*.stepname.ddname
・なお、先行ステップが呼び出したプロシージャ内のDDステートメントを参照する場合は次のような形で指定します。
*.stepname.procstepname.ddname
※ダミーデータセット
サンプルJCL(ダミーデータセット)
//OUTDD1 DD DUMMY,DSN=TESTDATA,UNIT=3380,
// SPACE=(TRK,(10,2)),DISP=(,CATLG)
・出力もしくは入力のデータセットに空のデータセットを
指定する場合、DDステートメントに__DUMMY__を設定するか、
DSNパラメータに__NULLFILE__を指定する。
(3) DISPパラメータ
サンプルJCL(DISP)
//INPUT DD DSN=TESTDATA,DISP=SHR
・プログラムがデータセットをどう処理するかを指示するために
DISPパラメータで状況と後始末を指定する。
DISP=(データセットの状況,正常終了時の処理,[異常終了時の処理])
1.データセットの状況
・NEW データセットを新しく作成するときに指定。
・OLD データセットが存在していて、更新するために排他的に使用する場合に指定。
・SHR データセットが既に存在していて、他のプログラムと共有するときに指定。
・MOD 順次データセットが既に存在していれば、ファイルの終わりにレコード追加 拡張する。
存在していなければ新しく作成する。
※省略時は「NEW」が指定される。
2.データセットの使用後の終了時の処理
・KEEP データセットを保存する。OSのカタログは変更されない(その後のジョブで使用するため保存したい場合に指定)
・CATLG OSのカタログにデータセットの装置およびボリュームの情報を登録させる。
・UNCATLG OSのカタログからデータセットの装置およびボリュームの情報を削除させる。
・PASS ジョブ内の後続のジョブステップで使用するためにOSに装置および ボリュームの情報を記憶させる場合に指定(データセットを後続ステップへ渡す)。
・DELETE データセットを削除する。
※省略時は、データセットが新規作成された場合は削除。
既存のデータセットの場合は実行前と同じ状態に保つよう処理される。
(4) 装置の指定
サンプルJCL(UNIT)
//TESTMYDS DD DSN=&&MYDS,DISP=OLD,UNIT=(3480)
UNIT = 装置アドレス/装置タイプ/グループ名
・プログラム上でDASD(直接アクセス記憶装置)またはテープ上の
データセットを使用する場合は、装置を割り振らなければならない。
・装置アドレス(UNIT = OOF)
データセットに対して特定装置アドレスを指定。
(各装置には、導入された際に決定される3桁のアドレスを持っています。)
・装置タイプ(UNIT = 3380)
データセットに対して装置の種類を指定。
DASD(3390,3380,3375など)
TAPE(3490,3480など)
・グループ名(UNIT = SYSDA)
システム作成時に入出力装置をグループ化して定義してあるものを指定。
(5) スペースの割り振り
SPACEパラメーターの例
// SPACE(TRK,(10,2),RLSE)
SPACE = (割り振り単位,(1次数量[,2次数量][,ディレクトリブロック数]),[RLSE][,CONTIG][,ROUND])
データセットを作成するとき、DASDボリューム上に必要なスペースを指定する。
上記の場合は、順次データセットの割り当て。
最初に10トラック、増分として2トラック割り当てる。未使用スペースは開放される。
・割り振り単位
・TRK
トラック単位にスペースを割り振る。
・CYL
シリンダ単位にスペースを割り振る。(1シリンダーは15トラック)
・blklgth (数値) (AVGREC の指定がない場合に限る)
データセットの平均ブロック長でスペースを割り振る。
・reclgth (数値) (AVGREC の指定があり、SMS がアクティブ)
データセットの平均レコード長を示す。
指定されたレコード長と、DCBパラメーター(データセットの属性定義)の
BLKSIZE(ブロックサイズ)値から、必要なスペース量(トラック数)が算出される。
DCBパラメーターが指定されてない場合は、システムが決定したブロック・サイズか
デフォルト値の 4096に基づき計算される。
レコード長で指定する場合、同時にAVGRECパラメーターの指定が必要。
・1次数量
データセットを作成する際に、最初に要求するスペース量を指定する。
2次数量を指定しておらず、容量を超えた場合は異常終了。
・2次数量
データセットに対する追加スペース。
スペースが足りないとき、最高16回まで2次数量分のスペースを確保できる。
それでも容量が足りない場合は異常終了。
・ディレクトリブロック数
区分データセットのディレクトリブロック数。
・RLSE
データセットをクローズするときに未使用領域を開放する。
・CONTIG
データセットに必ず連続したスペースを割り振るように要求します。
1次スペース割り振りのみに作用します。
CONTIG を指定しているにもかかわらず連続したスペースが
使用可能でない場合、システムはそのジョブ・ステップを終了します。
(データセット内のレコードのDASD 上の位置を、OSによらず自分で直接計算して直接アクセスするような、一部のシステム・ソフトウェアなどで使用します。一般のデータセットがCONTIG を指定する必要はありません。)
・ROUND
ブロック長やレコード長でスペースを割り当てる場合、必要なスペース量をトラック単位ではなくシリンダー単位にします。
※AVGRECパラメーター
SPACE パラメーターとともに AVGREC を使用する場合、
SPACE パラメーターの最初 のサブパラメーター (レコード長) では、
レコードの平均レコード長を指定する必要があります。
・AVGREC = SPACE パラメーターで指定した 1次数量および 2次数量 が表すレコード数の単位を指定
・U そのままのレコード数(1 の倍数)であることを示します。
・K 千単位のレコード数(1024 の倍数)であることを示します。
・M 百万単位のレコード数(1048576 の倍数)であることを示します。
AVGRECパラメーターを指定した場合のシステムが確保する
スペースの量はMVS(z/OS)のマニュアル「平均レコード長」を参照。
SPACEパラメーターの例(区分データセットの割り当て)
// SPACE(CYL,(10,,40))
上記の場合は、区分データセットの割り当て。
最初に10シリンダーを割り当て、増分はなし。ディレクトリブロック数は40。
SPACEパラメーターの例(順次データセットの割り当て AVGREC の指定あり)
// SPACE(256,(100000,10000)),AVGREC=U
上記の場合は、順次データセットの割り当て。
256 バイトのレコードが、100000レコード分格納できるスペース量(トラック単位)で割り当て、
不足時は、10000レコード分格納できるスペースが追加される。
SPACEパラメーターの例(順次データセットの割り当て シリンダー単位 AVGREC の指定あり)
// SPACE(200,(100,10),,,ROUND),AVGREC=K
上記の場合は、順次データセットの割り当て。
200 バイトのレコードが、100×1024 レコード分格納できるスペース量(シリンダ単位)で割り当て、
不足時は、10×1024 レコード分格納できるスペースが追加される。
※ブロック長で指定する際の考え方
(DASD容量を1TRKに2ブロック格納可能な最大長を指定する方法で見積もる流れ)
データのレコード長とデータ件数からDASD容量を見積もってから決定します。
キー長が0で固定長の順編成ファイルであれば、
下記の計算式でブロック長を算出することになります。
1.1 ブロック長の見積もり
1.2 ブロック長 = レコード長 × ブロック化因数
1.3 ブロック化因数 = 23476 × レコード長(小数点以下切捨て)
<メモ>
ブロック長は1ブロックの大きさのことである。
ブロックは、何レコードかをひとまとめにしたもののことである。
ブロック化因数は1ブロックに何レコードが含まれるかを表している。
ブロックとブロックの間には、ブロック間隔という空間が確保される。
そのため、ブロック長は正確には、
ブロック長 = レコード長 × ブロック化因数 × ブロック間隔
2.1 DASD容量(TRK単位)
2.2 トラック単位の容量 = ブロック数 ÷ 2 (少数点以下切上げ)
2.3 ブロック数 = データ件数 ÷ ブロック化係数 (少数点以下切上げ)
SPACEオペランドで指定する初期量には、
上記の算出値を指定しデータ件数の変動に備え増分値を指定する。
なおAVGRECパラメーターを使用することにより、論理レコード長と
格納したいレコード数で、必要なスペースを指定することが出来る。
ただし、区分データセットの場合、
その後メンバの更新や追加が出来なくなってしまうこともあるため。
まとまった量をシリンダー単位で割り当てることもよく行われる。
SPACEパラメーターの特殊な例(初期値3シリンダー、増分値3シリンダー、作成後未使用領域解放)
// SPACE(CYL,(3,3),RLSE)
このようにしておくと出来たファイルは未使用領域をトラック単位で解放してくれる。
なお、巨大な容量のデータの場合は増分エラーとなるのでエラーなった時点で初期値を大きく。
(6) VOLパラメーター
サンプルJCL(VOLパラメーター)
//TESTMYDS DD DSN=NEWDASD,
// DISP=(,CATLG,DELETE),UNIT=3350,
// VOL=SER=335006,SPACE=(CYL,(10,5))
VOLパラメーターはUNITで指定した装置の中からどのボリュームを使用するのかを指定する。
ボリュームの指定には、特例ボリュームと不特定ボリュームの2種類がある。
特定ボリュームのserial-numberを使用する場合は次のような形で指定します。
VOL=SER=serial-number
特定ボリュームのserial-number1とserial-number2の順に使用する場合は次のような形で指定します。
VOL=SER=(serial-number1,serial-number2)
特定ボリュームのOUT1 DDステートメントで使用されたボリュームを使用する場合は次のような形で指定します。
VOL=REF=*.OUT1
不特定ボリュームを最大10ボリューム使用する場合は次のような形で指定します。
VOL=(,,,10)
※不特定ボリュームが一時的データセットなら「SCRTCH」それ以外は、「PRIVAT」)
※省略した場合はDASDの場合は、ストレージボリュームからシステムが選択。TAPEの場合は「SCRTCH」か「PRIVAT」マウントとなり、利用者が任意のボリュームを選びます。(「PRIVAT」の場合、装置番号もしくは総称名を指定)
(7) データセットの属性定義
サンプルJCL(データセットの属性定義)
//TESTMYDS DD DSN=ALP,DISP=(,KEEP),
// VOLUME=SER=44321,UNIT=3400-6,
// DCB=(DSORG=PS,RECFM=FB,
// LRECL=240,BLKSIZE=960)
DCB = (DSORG = データセットの編成種別,RECFM = レコード形式,
LRECL = レコードサイズ,BLKSIZE = ブロックサイズ)
PGM中のコーディング・JCLステートメントのコーディング・データセットが既に存在しているとき、データラベルの3つの情報源から収集した情報が入る。
データセットがOPENされるとき、OSによって情報が埋められる。
※ データセットの編成種別
PS:順次データセット
PO:区分データセット
※ レコード形式
・F/FB
固定長。非ブロック化レコード(F)/__ブロック化レコード(FB)__で、
データセットを構成するレコードの長さが一定のもの。
F : LRECLとBLKSIZEが等しいことを意味する。
FB : BLKSIZEはLRECLの倍数であることを意味する。
・V/VB
可変長。非ブロック化レコード(V)/__ブロック化レコード(VB)__で、
データセットを構成する各論理レコードの長さが異なるもの。
V : LRECLは最長のデータレコード長 + 4バイト。
BLKSIZEはLRECLと等しいことを意味する。
VB : LRECLは最長のデータレコード長 + 4バイト。
BLKSIZEはLRECLと等しいもしくはそれ以上であることを意味する。
・U
不定長。データセットを構成する各論理レコードの長さが異なり、
レコードの長さの情報を持っておらず、ブロック化もできないことを意味する。
※FA/FBA/VA/VBA
レコードに、ISO/ANSI制御文字が入っていることを示す。
※FM/FBM/VM/VBM
レコードに、機械コード制御文字が入っていることを示す。
※ レコードサイズ 、ブロックサイズ
サンプルJCL(レコードサイズ、ブロックサイズ)
//TESTMYDS DD DSN=MYDS2.PGM,DISP=(NEW,KEEP),
// DCB=(LRECL=256,BLKSIZE=0)
上記の場合、レコードサイズは256 バイト。
・レコードサイズは1から32760までで指定し、ブロックサイズ以下とする。
・ブロックサイズはFBの場合は32760が最大、VBの場合、32756が最大。
BLKSIZEに0を指定してアロケーションすれば、
レコード形式、レコード長、デバイスの特性に応じてOSが最適なサイズを設定する。
(BLKSIZE=0がサポートされているOSの場合)
※ブロックサイズを設定する場合は、ディスクのハードウェアマニュアルに載っているトラックに書き込めるブロックサイズ(物理レコードサイズ)とレコード数の早見表などを参考に、データセットのレコード長からブロックサイズを設定する。
詳細は参考文献:サイト様の「DASDタイプ別最適化ブロックサイズ」を参照。
(9) SYSOUTパラメータ
サンプルJCL(SYSOUTパラメータ)
//PROGOUT DD SYSOUT=*
1.データセットの状況
SYSOUT = クラス名[、プログラム名][、用紙名orコード名]
出力データセットに出力クラスを割り当てる。
SYSOUT=*
JOBステートメントのMSGCLASSと同じクラスを割り当てる。
2.SYSPRINT
サンプルJCL(SYSPRINT)
//SYSPRINT DD SYSOUT=*
__SYSPRINT__はユーティリティなどの出力結果をデータセットに出力したいときにデータセットの情報を指定すると、出力結果をデータセットに出力したりすることができる。
(10) SYSINデータセット
サンプルJCL(SYSIN)
//SYSIN DD *
AAA ~ BBB
CCC ~ DDD
/*
出力の__SYSOUT__に対して、入力データセットとなるのが__SYSIN__です。
SYSINデータ(ストリーム内データセット)はJCLのDDステートメントに
DSNパラメーターの代わりに「 * 」または DATAを指定することで、
次の行からJCLステートメントではなく、
プログラムへ渡す入力データ(ストリーム内データセット)を記述することができる。
DDステートメントを省略してSYSINデータを書き始めると
SYSIN DD *が書かれたのと同じ扱いになる。
詳細は参考文献:サイト様の「SYSINデータセットとは」を参照。
(11) DD ステートメントの連結(コンカチネーション)
サンプルJCL(DD ステートメントの連結)
//INPUT DD DSN=TSTDATA1,DISP=SHR
// DD DSN=TSTDATA2,DISP=SHR
・複数のデータセットを1つのファイル(連結データセット)として定義する。
読み取り専用となるが、複数のデータセットに分かれて
格納されているデータをまとめて処理できる。
・固定長レコードの場合、
各データセットのレコード長は同じである必要がある。
・可変長レコードの場合、
最も大きなレコードサイズを持つデータセットを連結の先頭に置くか、先頭のDDステートメントに最も大きなレコードサイズを指定した、データセットの属性定義を追加する。
異なるブロックサイズを持つものがあっても構いません
区分データセット、順次データ・セットなどはブロック・サイズの順序に関係なく連結できる。
プログラムのアクセス方法によっては、ブロックサイズが最大のデータセットを連結の先頭に置く必要があります。(先頭のDD ステートメントの BLKSIZE には、このデータセットの実際のブロックサイズにかかわらず、最大のブロックサイズにあたる値を指定することができることに注意してください。)
参考文献:JCL関連情報サイト様
https://arteceed.squares.net/
http://yfuku.sakura.ne.jp/mvs/mvsindex.html
http://superbassist.fc2web.com/hp2/study/jcl/jclb.html
MVS JCL 解説書 - IBM Documentation:正式な構文は以下を参照
https://www.ibm.com/docs/ja/zos/2.3.0?topic=SSLTBW_2.3.0/com.ibm.zos.v2r3.ieab600/toc.htm
原典:日本アイ・ビー・エム株式会社
GC28-1757-00
OS/390 MVS JCL Reference
(一部改変)
OS/VS2 MVS JCL
(一部改変)