11.1カタログの探索とデータセット情報の取得(LOCATEとOBTAIN)

By 神居 - Posted: 2010/12/08 Last updated: 2011/06/26 - Leave a Comment
印刷用ページの表示 印刷用ページの表示

一般のデータセットへのアクセスだけでなく、カタログやDASDボリュームのVTOC(索引)にアクセスするためのサービスも提供されています。現在ではわざわざプログラムなどを作らなくても、ISPFやユーティリティ、ISVソフトウェア製品などを使えば事足りることが多いですが、どのようなサービスによって実現できるかを知っておくだけでもいいでしょう。


データセット名からカタログされているボリューム名を求める

データセット名からカタログされているボリューム名を求めるにはLOCATEマクロを使用します。LOCATEマクロはカタログ項目を読み取るためのサービスで、いくつかの機能がありますが、ここではDSNを入力にして、カタログされているボリューム名を求めています。ボリューム名は1つとは限らず、データセットは複数のボリュームに分散して作成されることもあるので、ボリューム・リストの形式で戻されます。HSMによってマイグレートされたデータセットの場合は、元のボリューム名ではなく「MIGRAT」という名前が返ります。
CAMLSTはLOCATEマクロの入力パラメーター・リストです。

カタログされているすべてのデータセットをリストアップするような場合は、CSI(カタログ検索インターフェース)を利用すればAMSのLISTCATのようなプログラムを作ることができます。MSPとVOS3にはありませんが、代わりにGENERIC LOCATEやカタログレコードを順次に読むためのインターフェースがあります。それらはMVSでも同じですが、現在ではCSIを使用する方がいいでしょう。MSPもVOS3もGENERIC LOCATEやカタログレコードの順次アクセスはマニュアルで公開していないため、必要ならメーカーに問い合わせて下さい。


データセット名とボリューム名からデータセットの属性情報を求める(非VSAMデータセット)

データセット名とボリューム名がすでにわかっている場合(あるいはLOCATEによってボリューム名を得た場合)、そのデータセットの各種の属性情報、例えば編成種別、レコード形式、レコード長、ブロック長、スペース量、作成日やアクセス日などを読み取ることができます。これらの情報はVTOC内のDSCBレコードに格納されており、OBTAINマクロによってDSCBレコードを読み取ることができます。編成種別やレコード形式、長さなどは、データセットをOPENすればDCBに返されますが、DSCBを読み取ればわざわざOPENしなくてもそれらを得ることができます。
OBTAINもLOCATE同様にCAMLSTマクロによって入力パラメーター・リストを作ります。ここではデータセット名を入力にして、対応するDSCBレコード(DSCB1)を読み取っています。返されるのはDSCBのデータ部(96バイト)とDSCBレコードのCCHHR(5バイトのボリューム内ディスクアドレス)です。
なお指定したDSNがVSAMのクラスター名の場合、返答域には最低限のフィールドが設定されたダミーのDSCBが作成され、DSCBのCCHHRには0が設定されます。


ボリューム内に格納されているデータセットをリストアップする

OBTAINマクロを使い、VTOC内のDSCBを順次に読み取ることによって、DASDボリューム内のデータセットの一覧を作ることができます。ここではDSCBのCCHHR(ボリューム内ディスクアドレス)を入力にして、対応するDSCBレコード(DSCB1)を読み取っています。返されるのはDSCBのキー部(44バイト)とデータ部(96バイト)です。
VTOCの先頭にはDSCB4というVTOC自身を示すレコードがあります。このレコードのキーには44バイトのx04が設定されており、DSNに44バイトのx04を指定することで、DSCB4を読み取ることができます。返されたDSCB4のCCHHRを利用してDSCB4に続く残りのDSCBレコードを順次に読み取ることができます。
サンプルではDSCB4の読み取りにはOBTAIN/SEARCHを、以降のDSCBレコードの読み取りにはOBTAIN/SEEKを使っています。VTOCの終端はDSCB4に設定されているので、そこに示されたトラック内のDSCB4を全部読んだところで処理終了としています。読み込むべきDSCBのCCHHRは1トラック内に格納されるDSCBレコード数に基づいて計算します。この値もDSCB4に格納されています。1トラック分のDSCBを読んだら、トラックアドレスを1つ増やしてレコード番号は1に戻します。トラックアドレスが14になったら次は15ではなく、シリンダーアドレスを1つ増やしトラックアドレスは0に戻します。現在のディスク(3390など)は1シリンダー15トラック(0から14)なので、シリンダーあたりのトラック数を15と決めて処理していますが、本来はデバイスの特性に応じて変動してもいいようにロジックを作るべきです。例えばDEVTYPEマクロを使用すればシリンダーあたりのトラック数を求めることができます。
データセットを示すDSCB1以外はすべて読み捨てていますが、データセットが占めるスペース量などを正しく知る場合には、関連するDSCBも読む必要があります。またDSN以外はプリントしていませんが、実際には編成種別、レコード形式、レコード長その他の情報を編集して出力しなければ実用にはなりません。それらもDSCB1に格納されています。VTOCやDSCBレコードの詳細についてはマニュアル「z/OS DFSMSdfp 拡張サービス」に記載されています。

実践のプログラミングにおいて、VTOC内の複数のDSCBを読み取るような処理では、OBTAINで1つずつDSCBを読む代わりにCVAFという別のVTOCアクセスサービスを使うことが多いです。OBTAINはインデックスVTOCがサポートされるより前のMVSからある古典的なAPIですが、インデックスVTOCの場合はボリューム内の空きスペースを管理するDSCB5は事実上使われないので、OBTAINでは空きスペース量と場所などを知ることができませんが、CVAFを使うことでインデックスVTOCであってもそうでなくても処理することができます。しかしCVAFはOBTAINに比べると複雑なAPIなので、まずはOBTAINを使ってDSCBを読み取り、DSCBやVTOCの構造を理解してからCVAFを使う方がわかりやすいと思います。
なおOBTAINやLOCATEに関しては基本的な機能はMSPとVOS3でも互換があります。MSPではCVAFも一部を除き同様のAPIがサポートされています。


関連マニュアル:

  • MVS:z/OS DFSMSdfp 拡張サービス
  • z/OS DFSMS: カタログの管理
  • MSP:システムプログラミング手引書 データ管理編
  • DM/DSE運用手引書
  • Posted in .基礎編 • • Top Of Page