業務用アプリケーション・プログラムでは、先行ステップで作成したデータセットを後続ステップで読み込んで、さらに別の処理を行う、といった手法は大変よく利用されています。この際に、データ内容をステップ間でのみ受け渡し、ジョブが終われば保管の必要がない作業用データであれば、一時的データセットとして割り当てることができます。一般に、一時的データセット(1つのジョブ内でのみ有効なテンポラリー・ファイル)と言えば、順次編成データセットを使うことが多いでしょう。場合によっては区分データセットを割り振ることもありますが、COBOL言語などで作成される一般的なアプリケーションプログラムでは直接区分データセットを使うことは少なく、使ったとしてもJCLにメンバー名まで指定してメンバー自身を順次編成ファイルとしてアクセスすることの方が多いのではないかと思います。
ところがプログラムの処理として、一時的データとはいえ、キーによるアクセスなどを行いたい時は、順次データセットでは思うようにいきません。そのため先行ステップでAMSユーティリティーを実行して、VSAMデータセットを作成し、後続ステップでアクセスした後、最終ステップで削除したり、ボリューム上にそのまま残しておき、次の実行時に割り振り前に削除をする、などを行っていることもよくあります。
MVS(z/OS)ではこのような場合、AMSユーティリティーでVSAMを事前割り振りしなくても、PSやPDS同様にVSAMファイルも一時的データセットとして割り振り使用することができます。この方法を使うとJCLもすっきりしますから知っておいて損はありません。
従来からよく使われるAMSユーティリティーを組み合わせるJCL例
先行のSTEP001で、キー付きレコードの作業用ファイルを作り、後続のSTEP002およびSTEP003で、そのファイルを読んで帳票データを作るジョブがあるとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
//ALLOCATE EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DELETE UAP123.WORK.VSAM DEFINE CLUSTER(NAME(UAP123.WORK.VSAM) - VOLUMES(WORK01) CYL(10 5) - RECORDSIZE(256 256) KEYS(32 0)) IF LASTCC = 8 THEN SET MAXCC = 0 //* //STEP001 EXEC PGM=UAP123WK //LIST DD SYSOUT=* //OUTWORK DD DISP=OLD,DSN=UAP123.WORK.VSAM //* //STEP002 EXEC PGM=UAP123P1 //LIST DD SYSOUT=* //INPUT DD DISP=OLD,DSN=UAP123.WORK.VSAM //OUTDATA DD DISP=(,CATLG),DSN=UAP123.PRINT.DATA1, // UNIT=SYSDA,VOL=SER=DATA10,SPACE=(TRK,(100,20),RLSE), // DCB=(RECFM=FBA,LRECL=133) //* //STEP003 EXEC PGM=UAP123P2 //INPUT DD DISP=OLD,DSN=UAP123.WORK.VSAM //OUTPUT DD SYSOUT=(K,,AP78) //* //DELETE EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DELETE UAP123.WORK.VSAM // |
一時的VSAMデータセットを使用するJCL例
同じことは、次のようなJCLに置き換えることができます。もちろん、JCLの変更に伴ってプログラムを修正する必要はありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//STEP001 EXEC PGM=UAP123WK //LIST DD SYSOUT=* //OUTWORK DD DISP=(,PASS),UNIT=SYSDA,SPACE=(CYL,(10,5)), // RECORG=KS,KEYLEN=32,KEYOFF=0,LRECL=256 //* //STEP002 EXEC PGM=UAP123P1 //LIST DD SYSOUT=* //INPUT DD DISP=(OLD,PASS),DSN=*.STEP001.OUTWORK //OUTDATA DD DISP=(,CATLG),DSN=UAP123.PRINT.DATA1, // UNIT=SYSDA,VOL=SER=DATA10,SPACE=(TRK,(100,20),RLSE), // DCB=(RECFM=FBA,LRECL=133) //* //STEP003 EXEC PGM=UAP123P2 //INPUT DD DISP=(OLD,PASS),DSN=*.STEP001.OUTWORK //OUTPUT DD SYSOUT=(K,,AP78) // |
STEP003でもDISP=PASSを指定していますが、割り振った一時的VSAMデータセットは、ジョブ・エンドの際にパージされます。DISP=(OLD,DELETE)としてもかまいません。
REPROの代わりにGENERで初期レコードを読み込ませるJCL例
割り振るVSAMデータセットに、初期レコードのローディングが必要な場合、AMSユーティリティーのREPROを使わなくとも、GENER(ICEGENER)で同じことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//REPRO EXEC PGM=ICEGENER //SYSPRINT DD SYSOUT=* //SYSIN DD DUMMY //SYSUT2 DD DISP=(,PASS),UNIT=SYSDA,SPACE=(CYL,(10,5)), // RECORG=KS,KEYLEN=16,KEYOFF=0,LRECL=64 //SYSUT1 DD * KEY00001ABCDEFGH-----DATA-RECORD-1-----------------------------Z KEY00002ABCDEFGH-----DATA-RECORD-2-----------------------------Z KEY00003ABCDEFGH-----DATA-RECORD-3-----------------------------Z KEY00004ABCDEFGH-----DATA-RECORD-4-----------------------------Z KEY00005ABCDEFGH-----DATA-RECORD-5-----------------------------Z KEY00006ABCDEFGH-----DATA-RECORD-6-----------------------------Z KEY00007ABCDEFGH-----DATA-RECORD-7-----------------------------Z //* //STEP001 EXEC PGM=UAP123WK //LIST DD SYSOUT=* //OUTWORK DD DISP=(OLD,PASS),DSN=*.REPRO.SYSUT2 //* : : |
JCL内ストリームデータ(DD *)ですが、入力レコードの80バイトのうち、出力先VSAMデータセットのレコード長64バイトに合わせて、先頭の64文字分だけが書き込まれます。80より長いレコードであれば、初期レコードが格納された別の順次データセットなどを指定します。
AMSユーティリティーを使わないVSAMの割り振りやコピーは、特別に新しい機能ではなく、MVS/DFPがDFSMSに変わったときからサポートされていたようです。MVS/ESAの頃は、SMS自体の運用はオプションだったので、日本ではまだ一般的ではありませんでしたが、現在のz/OSではSMSは標準でアクティブでなっていますから、当たり前に利用できる機能になっています。しかし、運用に乗ってしまっているジョブのJCLの場合、あえて変える必要もないため、今でもAMSユーティリティーによる割り振りやコピーがよく利用されています。もしご存じでなかったら、何かの機会のときにでも試してみて下さい。なお、私が知る限りでは、同じ機能はMSPとVOS3にはありませんでした。最新のMSPとVOS3でも恐らく同じかと思います。