PSB および PCB を使用したデータ・アクセス
プログラム仕様ブロック (PSB) およびプログラム連絡ブロック (PCB) を使用して、COBOL 用に生成するプログラム内の論理構造を記述します。
EGL は、PSB を PSBRecord ステレオタイプで表します。 このステレオタイプを使用してレコード・パーツをカスタマイズするときは、他のレコード・パーツの場合と同じように、次に、PSB レコード定義に基づいて変数を宣言します。 さらに、EGL は 4 種類の PCB レコード定義を組み込みます。PCB レコード定義 を使用して、PSB レコード定義内に PCB レコード変数を 宣言してください。
また、使用する COBOL 環境で実際の PSB および PCB を作成する必要があります。 これらの PSB および PCB 内の情報は、EGL の PSB および PCB 内の情報と一致している必要があります。
- EGL 生成のターゲットが IMS™ BMP または IMS/VS の場合。
- コードが CICS®、IMS/VS、IMS BMP、または z/OS® バッチ・ターゲット・システム上の DL/I データベースにアクセスする場合。
- コードが IMS BMP または z/OS バッチ・ターゲット・システム上の GSAM ファイルにアクセスする場合。
- DL/I データベースにアクセスする場合には、DLISegment レコードを定義して、PCB レコード内で参照する。
- PSBRecord ステレオタイプを使用してレコードを定義する。 そのレコードには、IMS メッセージ・キュー、DL/I データベース、または GSAM ファイルへのアクセス時に使用する一連の PCB レコード変数が含まれます。
- プログラムで、PSB および PCB 情報を使用可能にする。
- ステップ 1 で定義した PSB レコードに基づいて、変数を宣言する。
- @DLI プログラム・プロパティーの psb プロパティー・フィールドを、その PSB レコード変数の名前に設定する。
各 PCB レコードは、EGL が提供する定義済み PCB レコード定義の 1 つをベースにしています。PCB レコードのステレオタイプを参照してください。
特定のプラットフォームでは、初期 I/O PCB と少なくとも 1 つのテレプロセシング PCB を宣言する必要があります。詳しくは、このトピック内の『互換性』を参照してください。 EGL PSB レコードでこれらの PCB を宣言し、ランタイム環境がそれらの PCB をサポートしていない場合、関連 EGL PCB は生成される COBOL に含まれません。
callInterface = DLICallInterfaceKind.CBLTDLI
その割り当てにより DL/I 呼び出しの PCB 番号が調整され、I/O PCB およびテレプロセシング PCB の CICS サポートがないことに対応します。
PSB レコード定義の要件
- ターゲット・システムが、PSB レコード・パーツでどの PCB が必要となるかに影響する (このトピックの『互換性』を参照してください)。
- @DLI 複合プログラム・プロパティーの callInterface プロパティー・フィールドの値 (AIBTDLI または CBLTDLI のいずれか) も、PSB レコード定義の要件に影響する。 詳しくは、このトピックでこの後の 2 つのセクションを参照してください。
callInterface が AIBTDLI の場合
- IMS/VS、IMS BMP、または z/OS バッチの場合、ランタイム PSB 内の最初の PCB は、入出力 PCB である必要があります。 IMS は常に、入出力 PCB の名前として名前 IOPCB を使用します。
- IMS/VS および IMS BMP の場合、EGL は他の必須 PCB に以下の名前を使用します。
- 代替 PCB には ELAALT。
- 特別代替 PCB には ELAEXP。
- IMS/VS 環境で DL/I データベースを EGL 作業データベースとして使用する場合は、ELAWORK。 この場合、EGL PCB レコードに、データベース階層情報を組み込む必要はありません。 後述するように、IMS システム・プログラマーは、ランタイム PSB を定義する際には、マクロ ELAPCB を使用してください。 生成時には、workDBType ビルド記述子オプションのデフォルト値を受け入れて、作業データベースが DL/I データベースであることを示します。
それらの PCB の名前は、以下のいずれかの方法で指定できます。- IMS システム・プログラマーに、EGL 必須の PCB 名を、ランタイム PSB を作成する PSBGEN ジョブで指定するよう依頼する。
次の例は、ラベルを使用して代替 PCB の名前を提供し、PCBNAME パラメーターを組み込んで特別代替 PCB および作業データベース PCB の名前を提供します。
ELAALT PCB TYPE=TP,MODIFY=YES PCB TYPE=TP,MODIFY=YES,EXPRESS=YES,PCBNAME=ELAEXP ELAPCB LABEL=ELAWORKこの場合、PSB レコード・パーツに PCB レコードを組み込む必要はありません。
- IMS プログラマーが EGL で必要とされる名前とは異なる名前を使用している場合は、PSB レコード・パーツに必須 PCB レコードを組み込み、EGL に必要な名前とランタイム PSB 内の名前を関連付ける必要がある。例えば、ランタイム PSB に以下の PCB が含まれているとします。
PCB TYPE=TP,MODIFY=YES,PCBNAME=MYALTPCB PCB TYPE=TP,MODIFY=YES,EXPRESS=YES,PCBNAME=MYEXPPCB ELAPCB LABEL=MYWORKDBこの場合、PSB レコード・パーツには、以下のように PCB レコードが組み込まれます。Record MYPSB type PSBRecordPart ELAALT ALT_PCBRecord {@PCB {pcbType = PCBKind.TP, PCBName = "MYALTPCB"}}; ELAEXP ALT_PCBRecord {@PCB {pcbType = PCBKind.TP, PCBName = "MYEXPPCB"}}; ELAWORK DB_PCBRecord {@PCB {pcbType = PCBKind.DB, PCBName = "MYWORKDB"}}; end
callInterface プロパティー・フィールドが AIBTDLI に設定されている場合、宣言が必要なのは、プログラムで使用される PCB レコード、および EGL に必要な名前と異なるランタイム名を持つ必須 PCB のみです。 この規則は、メインプログラムと呼び出し先プログラムに適用されます。
callInterface が CBLTDLI の場合
callInterface プロパティー・フィールドが CBLTDLI に設定されると、指定されたランタイム PCB へのアクセスは、名前ではなくアドレスを使用して行われます。
- PSB レコードには、ランタイム PSB 内の PCB の数を超える PCB レコードを含めることはできませんが、それよりも少ない数は含めることができます。
- 各 PCB レコードの位置は、関連するランタイム PCB の位置に一致する必要があり、その PCB と同じタイプである必要があります。
ターゲット・システムが IMS/VS で、DL/I データベースを EGL 作業データベースとして使用する場合、EGL PCB レコードに、データベース階層情報を組み込む必要はありません。 IMS システム・プログラマーは、ランタイム PSB を定義する際には、ELAPCB マクロを使用してください。 生成時には、workDBType ビルド記述子オプションのデフォルト値を受け入れて、作業データベースが DL/I データベースであることを示します。
- 呼び出し先プログラムに PSB レコードを渡すと、ランタイム PSB へのアクセスに使用されるアドレスが渡されます。メインプログラムの場合と同様に、最低でも PSB レコード・パーツの最初の部分をセットアップする必要があります。その中には、入出力 PCB、代替 PCB、および特別代替 PCB (特定の環境で使用されている場合) の PCB レコード、および呼び出し先プログラムで必要となる他の PCB レコードも同様に含まれます。また、@DLI プログラム・プロパティーの psbParm プロパティー・フィールドも設定する必要があります。
- PCB レコードを呼び出し先プログラムに渡すと (ベスト・プラクティスどおり) 、各ランタイム PCB へのアクセスに使用されるアドレスを渡すことになります。この場合も、少なくとも入出力 PCB、代替 PCB、および特別代替 PCB (特定の環境で使用される場合) をセットアップする必要があります。これらに加えて、 呼び出し先プログラムで必要とされる PCB レコードのみを宣言します。 また、@DLI プログラム・プロパティーの pcbParms プロパティー・フィールドも設定する必要があります。
呼び出し先プログラムで pcbParms プロパティーと psbParm プロパティーを指定すると、pcbParms に含まれる PCB 固有アドレスが psbParm に含まれる同等のアドレスをオーバーライドし、渡した PSB レコードは無視されます。
- 2 番目の PCB レコードは代替 PCB を参照します。
- 3 番目の PCB レコードは、特別代替 PCB を参照します。
2 番目のレコード以外のレコードの名前として ELAALT を使用するか、または 3 番目のレコード以外のレコードの名前として ELAEXP を使用すると、その名前が優先されます。EGL は、そのように指定された PCB レコードは適切なタイプのランタイム PCB を参照していると想定します。
互換性
| プラットフォーム | 問題 |
|---|---|
| Java™ 生成 | PSBRecord ステレオタイプはサポートされていません。 |
| CICS | デフォルトでは、defaultPSBName PSB レコード・プロパティーの値は、ランタイム PSB の名前になります。 EGL はその名前を dliLib.psbData システム変数の psbName フィールドに入力しますが、このライブラリー・フィールドに別の値を割り当てることも可能です。プログラムが DL/I データベースに対して入出力操作を試行すると、psbName の値によって、どのランタイム PSB を使用するかが決まります。 dliLib.psbData システム変数には、2 番目のフィールド psbRef があります。
このフィールドの初期値はゼロです。これは、スケジュールに入っている PSB がないことを示します。
最初の DL/I I/O が発生すると、EGL ランタイムは PSB スケジュール呼び出しを発行します。
この呼び出しは、以下のアクションを実行します。
dliLib.psbData.psbRef にいかなる値を割り当てるロジックも作成しないでください。 呼び出し中は、dliLib.psbData 変数「pass the PSB」(名前とそれに関連するアドレスを渡します) を使用します。 転送中のランタイムの詳細な振る舞いは、その転送がどのように行われるかによって異なります。
DB PCB は、ランタイム PSB で有効です。 |
| IMS BMP | ランタイム JCL の PSB パラメーターは、ジョブ・ステップ全体を通じて使用されるランタイム PSB を識別します。 JCL は導入時にカスタマイズすることができますが、ランタイム JCL の PSB パラメーターのデフォルト値は、EGL が defaultPSBName PSB レコード・プロパティーの値を割り当てることによって生成します。 IMS BMP の場合、EGL では以下の PCB がランタイム PSB 内に存在している必要があります。
DB および GSAM PCB も有効です。 |
| IMS/VS | IMS システム定義の規則により、メインプログラムの名前は確実にランタイム PSB の名前になります。 この名前は、トランザクション全体を通じて使用可能です。 IMS/VS の場合、EGL では以下の PCB がランタイム PSB 内に存在している必要があります。
DB PCB も有効です。 workDBType ビルド記述子オプションの値が DLI (デフォルトのまま) の場合は、EGL 作業データベース用にランタイム DB PCB のいずれか 1 つを設定します。 EGL 作業データベースは、ランタイム PSB で ELAWORK として識別されるか、EGL PCB レコードの名前で識別されます。 最大の柔軟性を得るには、ランタイム PSB 内で最後のデータベース PCB を ELAWORK として指定します。 後で SQL 作業データベースを変更する場合も、この PCB は簡単に削除することができます。 |
| z/OS バッチ | ランタイム JCL の PSB パラメーターは、ジョブ・ステップ全体を通じて使用されるランタイム PSB を識別します。 JCL は導入時にカスタマイズすることができますが、PSB パラメーターのデフォルト値は、EGL が defaultPSBName PSB レコード・プロパティーの値を割り当てることによって生成します。 z/OS バッチの場合、EGL では最初のランタイム PCB は入出力 PCB である必要があります。PSBGEN ジョブの開発時には、IMS システム・プログラマーが CMPAT を YES に設定していることを確認してください。 EGL ではさらに、任意のタイプの 2 つの追加 PCB が、ランタイム PSB 内に存在している必要があります。DB および GSAM PCB は、代替 PSB と同様に有効です。 コードで代替 PSB を使用することはできません。しかしその一方、有効というのは、z/OS バッチおよび IMS BMP で同じランタイム PSB を使用できるということです。 |