10.1データセットを割り振る(DYNALLOC)

By 神居 - Posted: 2009/12/10 Last updated: 2009/12/10 - Leave a Comment

MVSではプログラムがアクセスするデータセットは、ジョブを実行するJCLのDD文で、あらかじめ定義しておくのが一般的です。バッチ処理においては、ほとんどのジョブがDD文による事前の定義を行っています。
しかしオンライン処理、特にTSOなどの対話型処理では、事前に使用するデータセットを決めることができません。例えばエディターがそうです。編集するデータセットは、エディターを起動した後に、パネルにそのDSNを指定します。つまりエディターと言うプログラムは、起動してみなければどのデータセットをアクセスするか決められないわけです。
またバッチ処理であっても、プログラムの処理中にアクセスするデータセットを決める、と言うことはありえないことではありません。

このような場合、データセットの割り振りはJCLのDD文ではなく、プログラムからMVSのAPIを呼び出してデータセットを割り振ります。これがダイナミック・アロケーション(動的割り振り)と呼ばれるものです。ダイナミック・アロケーションはDYNALLOCマクロによってSVC99を発行することで行われます。


カタログ済みの既存データセットをアロケーションする

既存のデータセットをアロケーションする例です。わかりやすくするために、アロケーションとアンアロケーションのテキストユニットを分けていますが、実際のプログラムではもう少しすっきりさせる方がいいでしょう。

DYNALLOCは、APIの中では呼び出し手順が複雑なものです。覚えるまではむずかしく思えますが、慣れの問題です。
必要なパラメーターは大きく、4種類に分かれます。1つ目が、RBポインター・フィールド、サンプルではDALRBPです。フルワードの領域に、DYNALLOCのRBアドレスを格納して先頭ビットをONにします。
2つ目が、RBです。DYNALLOCのパラメーター・リストで、要求する機能、復帰時のエラーコード、テキストユニット・ポインター・リストのアドレス、オプション・フラグなどで構成されています。
3つ目が、テキストユニット・ポインター・リストです。各テキストユニットのアドレスを格納したポインター・リストです。リストの最終エントリーの先頭ビットをONにします。
4つ目が、テキストユニットです。テキストユニットはJCLのDD文の各パラメーターに相当します。基本的にDD文の各パラメーターに対応してテキストユニットを用意します。

パラメーターを準備し、初期設定したら、GR1にRBポインター・フィールドのアドレスを入れ、DYNALLOCマクロを発行します。DYNALLOCマクロ自身にはパラメーターはなく、単にSVC 99命令を発行するだけのものです。直接SVC命令を書いても大差ありませんが、マクロを使用して呼び出すのがオーソドックスな手順です。
GR15が復帰コードです。0以外であれば何らかの誤りが起きていますから、RBに設定されているエラーコードを参照して必要なエラー処理を行います。0で完了しても状況によっては情報コードで、エラーが通知される場合もあります(特にアンアロケーション時)。例えば、DISP=(NEW,KEEP)の指定をしてアロケーションしたデータセットを、後処理をCATLGに変更してアンアロケーションした時、すでに同名データセットがカタログされていたような場合です。このアンアロケーション自体は成功していますが、データセットのカタログには失敗しています(NOT CATLGD 2と同じ)。なおアロケーション時にDISP=(NEW,CATLG)を指定していれば、アロケーション時に失敗しエラーで通知されます。この場合、データセットも作成されていません。

なおアンアロケーションは必ずしも必要ではありません。アロケーションした後、OPEN?I/O?CLOSEを行う場合、CLOSE時にデータセットを自動的にアンアロケーションするオプションも指定できます(アロケーション時にキーx001Cのテキストユニットを指定する)。OPEN/CLOSEを繰り返さないのであれば、この機能を使うと便利です。


新しいデータセットを作成する

新規のデータセットをDYNALLOCで割り振るサンプルです。DYNALLOC自体の出し方は既存のデータセットと変わりません。指定するテキストユニットが増えるだけです。DCB属性に関するテキストユニットは指定していませんが、アロケーション後に、OUTPUTオープンすればDCBに指定したRECFMやLRECLなどで設定されます。

先ほどは、DYNALLOCのパラメーターを直接コーディングする方法で使いましたが、今度はOSが提供するDYNALLOCのパラメーター・リストのDSECTを使って、OS標準のフィールド名でアクセスしています。簡単なプログラムではDSECTを使う方が逆に面倒になりますが、きちんとした正式なプログラムや商用プログラムの場合、提供されているのなら、OSのマッピング・マクロを使うのがオーソドックスな作り方になります。
またRBエクステンションも指定して、DYNALLOCがエラーになった時、コンソールにメッセージが出力されるようにしています。この機能を使えば、エラーコードを解析しなくても診断情報を簡単に得ることができます。編集されたメッセージをプログラムで処理できるように、そのメッセージが格納されたアドレスなどを通知してもらうこともできます。RBエクステンションで指定すれば、メッセージの作成と出力はDYNALLOCサービスの中で自動的に行ってくれます。RBエクステンションはMVSでのみ有効な機能です。


SYSOUTデータセットをアロケーションする

SYSOUTデータセットをDYNALLOCで割り振るサンプルです。SYSOUTの場合、パラメーターでSYSOUTクラスを指定します。その他のライタープログラム名、フォーム名、出力ライン数リミットなどは、追加のテキストユニットを定義することで指定できます。
SYSOUT=*と同じことを行うには、DALSYSOUキーでパラメーター数を0にします。クラス値として’*’を指定してはなりません。パラメーターエラーでDYNALLOCは失敗します。勘違いしやすいので注意します。

以上DYNALLOCの機能を、3つのサンプルを使って紹介しました。DYNALLOCは、一般のデータセットやSYSOUTデータセットのアロケーションでも利用しますが、その他にもJCLのDD文ではアロケーションできない特殊なデータセットにアクセスする場合などにも用います。例えばJES2スプール内の書き込み済みSYSOUTデータセットがそうです。SDSFのように、他のジョブによってすでに書き込まれたSYSOUTデータセットを読み込んで、その内容を表示するような場合です。

Posted in .基礎編 • • Top Of Page