10.2DD文定義情報を得る(DEVTYPEとRDJFCB)
プログラムを実行するには、JCLを作成し、使用するデータセットに対応したDD文を定義します。DD文にどのようなパラメーターが定義されているかによってプログラムの動きを変えたり、アクセスするデータセットの情報を得たりすることは、しばしば行われます。
JCLとプログラムを分離することによって、アクセスするデータセットやデバイスを固定化させない仕組みになっているのがMVSの特長ですが、アプリケーションの実行結果のサマリー出力などに、実際にどのデータセットにアクセスしたのか、なども表示できるようになります。
データセットの装置タイプを得る、DD文が定義されているかを確認する
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- DEVTYPE DDNAME,DEVINFO TEST DD STMT DEFINITION LTR 15,15 SUCCESSFUL ? BNZ NODDSTMT NO, DD STMT NOT DEFINED TM DEVINFO+2,X'80' TAPE DEVICE ? BO DEVTAPE YES, TM DEVINFO+2,X'20' DASD DEVICE ? BNO DEVOTHR NO, CLI DEVINFO+3,X'0F' 3390 DASD ? BNE DEVERRO NO, CLI DEVINFO+2,0 DUMMY DATASET ? BE DEVDUMY YES, CLC DEVINFO+2(2),=XL2'0102' SYSOUT/SYSIN DATASET ? BE DEVSPOOL YES, CLC DEVINFO+2(2),=XL2'0103' PATH DATASET(HFS) ? BE DEVHFS YES, : : DDNAME DC CL8'SYSUT1' DDNAME FIELD DEVINFO DC XL8'00' DEVINFO RETURN AREA(UCBTBYT)
DEVTYPEマクロを発行することで、DD文に定義したデータセットの装置タイプを得ることができます。これを利用すれば、特定の装置タイプしかサポートしないプログラムは、OPEN前に定義されたデバイス種別を知ることができます。また指定した名前に対応するDD文が定義されていなければ、DEVTYPEはエラーを返すので、未定義のDD文に対応したデータセットをOPENしないようにすることができます。未定義のDD名でOPENしてもエラーが返るだけですが、OPENの場合は次のメッセージがコンソールに出てしまいます。DEVTYPEで事前に確認すれば、メッセージが発行されることを抑止できます。
IEC130I ddname DD STATEMENT MISSING
※サンプルではエラーを0か0以外かで判定してますが、実際のエラーコードは細分化されています(マニュアルを参照)。
DEVTYPEが返す情報は、マクロのパラメーターによって変わります。サンプルは最もシンプルなパターンです。DEVINFOエリアには8バイトの情報が返りますが、先頭の4バイトはUCBの装置タイプバイト(UCBTBYT1?UCBTBYT4)です。IEFUCBOBマッピング・マクロで参照可能です。その他DEVTYPEの詳細は「z/OS DFSMSdfp 拡張サービス」「システムプログラミング手引書 データ管理編」「システムプログラマの手引-マクロ編-」の各マニュアルに記載されています。
DD文に定義したパラメーター情報を得る
----+----1----+----2----+----3----+----4----+----5----+----6----+----7-- USING INFMJFCB,JFCBAREA ADDRESS TO JFCB READ AREA RDJFCB (SYSUT1) READ JFCB(SYSUT1 DD STMT) LTR 15,15 SUCCESSFUL ? BNZ NODDSTMT NO, DD STMT NOT DEFINED MVC DSNAME,JFCBDSNM SET ACTUAL DSNAME MVC VOLUME,JFCBVOLS SET ALLOCATED VOLUME : : DSNAME DC CL44' ' VOLUME DC CL6' ' : : SYSUT1 DCB DDNAME=SYSUT2, QSAM DCB + DSORG=PS,MACRF=(GL,PM),EXLST=JFCBEXIT JFCBEXIT DC X'87',AL3(JFCBAREA) JFCB READ EXIT JFCBAREA DS 0F (FULLWORD BOUNDARY) DC CL176' ' JFCB READ AREA : : DJFCB DSECT , IEFJFCBN JFCB MAP
MVSでは(特にバッチプログラムでは)、データセットはDD名によってアクセスするのが基本です。データセットの名前などを知る必要はありません。しかしどのようなデータセットにアクセスするのかを求めたい場合もあります。このような場合はRDJFCBマクロを利用できます。DD文に定義されたパラメーターはJFCBと呼ばれるコントロール・ブロックに格納されています。
サンプルでは、アクセスするデータセットのDSNと先頭のVOLUME名を求めています。JFCBは基本的にDD文に定義されたパラメーターに基づき設定されているので、スペース情報(1次量、2次量他)などは、指定がなければ設定されていません。それらはJFCBではなくDSCBを求めて得ることができます。ただしカタログされているボリューム名や一時的データセットのDSNなどは設定されています。DD文のパラメーターをいろいろと変えて、試してみて下さい。なおRDJFCBはOPEN前、後どちらでも発行できます。OPEN後に発行した場合、RECFMなど1部のDCB情報はJFCBにも設定されます。
読み込んだJFCBは、IEFJFCBNマッピング・マクロで参照します。RDJFCBマクロもDEVTYPEと同じマニュアルに記載されています。