一時的VSAMデータセットを使う
業務用アプリケーションプログラムでは、先行ステップで作成したデータセットを後続ステップで読み込んで、さらに別の処理を行う、といった手法は大変よく利用されています。この際に、データ内容をステップ間でのみ受け渡し、ジョブが終われば保管の必要がない作業用データであれば、一時的データセットとして割り当てることができます。一般に、一時的データセット(1つのジョブ内でのみ有効なテンポラリー・ファイル)と言えば、順次編成データセットを使うことが多いでしょう。場合によっては区分データセットを割り振ることもありますが、COBOL言語などで作成される一般的なアプリケーションプログラムでは直接区分データセットを使うことは少なく、使ったとしてもJCLにメンバー名まで指定してメンバー自身を順次編成ファイルとしてアクセスすることの方が多いのではないかと思います。
ところがプログラムの処理として、一時的データとはいえ、キーによるアクセスなどを行いたい時は、順次データセットでは思うようにいきません。そのため先行ステップでAMSユーティリティーを実行して、VSAMデータセットを作成し、後続ステップでアクセスした後、最終ステップで削除したり、ボリューム上にそのまま残しておき、次の実行時に割り振り前に削除をする、などを行っていることもよくあります。
MVS(z/OS)ではこのような場合、AMSユーティリティーでVSAMを事前割り振りしなくても、PSやPDS同様にVSAMファイルも一時的データセットとして割り振り使用することができます。この方法を使うとJCLもすっきりしますから知っておいて損はありません。
従来からよく使われるAMSユーティリティーを組み合わせるJCL例
先行のSTEP001でキー付きレコードの作業用ファイルを作り、後続のSTEP002およびSTEP003でそのファイルを読んで帳票データを作るジョブがあるとします。
//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の変更に伴ってプログラムを修正する必要はありません。
//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)で同じことができます。
//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より長いレコードであれば、初期レコードが格納された別の順次データセットなどを指定できます。
※一時的VSAMの作成先デバイスにUNIT=VIOを指定すると、SMSはアロケーションに失敗し、GENERユーティリティーがS0C4でABENDします。一時的データセットではありますが、VSAMの場合はUNIT=SYSDAを指定すれば大丈夫です。もっとも最新のz/OSではVIOがサポートされているかも知れませんが...
AMSユーティリティーを使わないVSAMの割り振りやコピーは、特別新しい機能ではなくMVS/DFPがDFSMSに変わったときからサポートされていたようです。MVS/ESAの頃はSMS自体の運用はオプションだったので、日本ではまだ一般的ではありませんでしたが、現在のz/OSではSMSは標準でアクティブでなっていますから、当たり前に利用できる機能になっています。しかし運用に乗ってしまっているジョブのJCLの場合、あえて変える必要もないため今でもAMSユーティリティーによる割り振りやコピーがよく利用されています。もしご存じでなかったら、何かの機会のときにでも試してみて下さい。
私が知る限り、同じ機能はMSPとVOS3にはありませんでした。最新のMSPとVOS3でも恐らく同じかと思います。
Comment from 野良猫
Time 2010年5月23日 at 16:13