一時的VSAMデータセットを使う

By 神居 - Posted: 2010/05/17 Last updated: 2010/05/25 - One Comment

業務用アプリケーションプログラムでは、先行ステップで作成したデータセットを後続ステップで読み込んで、さらに別の処理を行う、といった手法は大変よく利用されています。この際に、データ内容をステップ間でのみ受け渡し、ジョブが終われば保管の必要がない作業用データであれば、一時的データセットとして割り当てることができます。一般に、一時的データセット(1つのジョブ内でのみ有効なテンポラリー・ファイル)と言えば、順次編成データセットを使うことが多いでしょう。場合によっては区分データセットを割り振ることもありますが、COBOL言語などで作成される一般的なアプリケーションプログラムでは直接区分データセットを使うことは少なく、使ったとしてもJCLにメンバー名まで指定してメンバー自身を順次編成ファイルとしてアクセスすることの方が多いのではないかと思います。
ところがプログラムの処理として、一時的データとはいえ、キーによるアクセスなどを行いたい時は、順次データセットでは思うようにいきません。そのため先行ステップでAMSユーティリティーを実行して、VSAMデータセットを作成し、後続ステップでアクセスした後、最終ステップで削除したり、ボリューム上にそのまま残しておき、次の実行時に割り振り前に削除をする、などを行っていることもよくあります。

MVS(z/OS)ではこのような場合、AMSユーティリティーでVSAMを事前割り振りしなくても、PSやPDS同様にVSAMファイルも一時的データセットとして割り振り使用することができます。この方法を使うとJCLもすっきりしますから知っておいて損はありません。


従来からよく使われるAMSユーティリティーを組み合わせるJCL例

先行のSTEP001でキー付きレコードの作業用ファイルを作り、後続のSTEP002およびSTEP003でそのファイルを読んで帳票データを作るジョブがあるとします。


一時的VSAMデータセットを使用するJCL例

同じことは次のようなJCLに置き換えることができます。もちろんJCLの変更に伴ってプログラムを修正する必要はありません。

STEP003でもDISP=PASSを指定してますが、割り振った一時的VSAMデータセットはジョブエンドの際にパージされます。DISP=(OLD,DELETE)としてもかまいません。


REPROの代わりにGENERで初期レコードを読み込ませるJCL例

割り振るVSAMデータセットに初期レコードのローディングが必要な場合、AMSユーティリティーのREPROを使わなくとも、GENER(ICEGENER)で同じことができます。

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でも恐らく同じかと思います。

Posted in ありがたいサンプルJCL, 知っておくと便利なテクニックなど • • Top Of Page

One Response to “一時的VSAMデータセットを使う”

Comment from 野良猫
Time 2010年5月23日 at 16:13

 MSPにはこの機能はありませんネ。