PSB および PCB を使用したデータ・アクセス

プログラム仕様ブロック (PSB) およびプログラム連絡ブロック (PCB) を使用して、COBOL 用に生成するプログラム内の論理構造を記述します。

EGL は、PSB を PSBRecord ステレオタイプで表します。 このステレオタイプを使用してレコード・パーツをカスタマイズするときは、他のレコード・パーツの場合と同じように、次に、PSB レコード定義に基づいて変数を宣言します。 さらに、EGL は 4 種類の PCB レコード定義を組み込みます。PCB レコード定義 を使用して、PSB レコード定義内に PCB レコード変数を 宣言してください。

また、使用する COBOL 環境で実際の PSB および PCB を作成する必要があります。 これらの PSB および PCB 内の情報は、EGL の PSB および PCB 内の情報と一致している必要があります。

以下の状態の場合には、PSB および PCB を使用する必要があります。
以下は、PSB および PCB を使用したデータ・アクセスで通常行うタスクです。
  1. DL/I データベースにアクセスする場合には、DLISegment レコードを定義して、PCB レコード内で参照する。
  2. PSBRecord ステレオタイプを使用してレコードを定義する。 そのレコードには、IMS メッセージ・キュー、DL/I データベース、または GSAM ファイルへのアクセス時に使用する一連の PCB レコード変数が含まれます。
  3. プログラムで、PSB および PCB 情報を使用可能にする。
    • ステップ 1 で定義した PSB レコードに基づいて、変数を宣言する。
    • @DLI プログラム・プロパティーの psb プロパティー・フィールドを、その PSB レコード変数の名前に設定する。

各 PCB レコードは、EGL が提供する定義済み PCB レコード定義の 1 つをベースにしています。PCB レコードのステレオタイプを参照してください。

特定のプラットフォームでは、初期 I/O PCB と少なくとも 1 つのテレプロセシング PCB を宣言する必要があります。詳しくは、このトピック内の『互換性』を参照してください。 EGL PSB レコードでこれらの PCB を宣言し、ランタイム環境がそれらの PCB をサポートしていない場合、関連 EGL PCB は生成される COBOL に含まれません。

例えば、CICS は I/O PCB およびテレプロセシング PCB をサポートしません。 EGL PSB レコードにこれらのタイプの PCB が含まれている場合、CICS 用に生成するときにそれらは無視されます。この場合、複合プロパティー @DLI をコーディングするときに次のプロパティー・フィールド割り当てを含めます。
callInterface = DLICallInterfaceKind.CBLTDLI

その割り当てにより DL/I 呼び出しの PCB 番号が調整され、I/O PCB およびテレプロセシング PCB の CICS サポートがないことに対応します。

PSB レコード定義の要件

PSB レコード定義の構造は、使用するランタイム PSB の構造と関係します。 他にも 2 つの大きな問題があります。
  • ターゲット・システムが、PSB レコード・パーツでどの PCB が必要となるかに影響する (このトピックの『互換性』を参照してください)。
  • @DLI 複合プログラム・プロパティーの callInterface プロパティー・フィールドの値 (AIBTDLI または CBLTDLI のいずれか) も、PSB レコード定義の要件に影響する。 詳しくは、このトピックでこの後の 2 つのセクションを参照してください。

callInterface が AIBTDLI の場合

callInterface プロパティー・フィールドが AIBTDLI (デフォルト) に設定されると、指定されたランタイム PCB へのアクセスは PCB 名を使用して行われ、プログラム内の PSB レコードの構造に、対応するランタイム PSB の構造を反映させる必要はなくなります。ただし、EGL でランタイム PCB が使用可能になるようにしておく必要はあります。
  • 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 へのアクセスは、名前ではなくアドレスを使用して行われます。

環境の違いを越えて同じプログラムを生成できるようにするために、EGL が無視する入出力 PCB レコードと代替 PCB レコードを除き、メインプログラム内の PSB レコードの構造は、少なくともランタイム PSB 内の初期 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 レコードは無視されます。

IMS/VS または IMS BMP 用に生成されるメインプログラムまたは呼び出し先プログラムの場合、デフォルトの振る舞いは以下のようになります。
  • 2 番目の PCB レコードは代替 PCB を参照します。
  • 3 番目の PCB レコードは、特別代替 PCB を参照します。

2 番目のレコード以外のレコードの名前として ELAALT を使用するか、または 3 番目のレコード以外のレコードの名前として ELAEXP を使用すると、その名前が優先されます。EGL は、そのように指定された PCB レコードは適切なタイプのランタイム PCB を参照していると想定します。

互換性

表 1. PSB レコードの互換性に関する考慮事項
プラットフォーム 問題
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.psbName の値を使用して、ランタイム PSB をスケジュールに入れる。
  • dliLib.psbData.psbRef を、その PSB にアクセスできるアドレスに設定する。

dliLib.psbData.psbRef にいかなる値を割り当てるロジックも作成しないでください。

呼び出し中は、dliLib.psbData 変数「pass the PSB」(名前とそれに関連するアドレスを渡します) を使用します。

転送中のランタイムの詳細な振る舞いは、その転送がどのように行われるかによって異なります。
  • 転送が、returning 文節を指定した show ステートメント、または transfer to transaction ステートメントによって行われる場合、転送中にコミット点が発生するために、スケジュールに入っている PSB が終了し、PSB はターゲット・プログラムに渡されません。
  • 転送が transfer to program ステートメントによって行われる場合、デフォルトの振る舞いは、PSB がスケジュールに入っているかどうかによって異なります。
    • PSB がスケジュールに入っていない場合、コミット点は発生しません。
    • PSB がスケジュールに入っている場合、転送中にコミット点が発生するため、その PSB は終了し、PSB はターゲット・プログラムに渡されません。 このケースでは、別の結果になる可能性もあります。 これにより、転送元プログラムが CICS 用に生成された場合と IMS/VS 用に生成された場合の振る舞いの違いを最小限にすることができます。 このような結果になるのは、以下の 4 つの条件がすべて満たされた場合です。
      • ターゲット・システムが z/OS CICS である。
      • ターゲット・プログラムは EGL によって生成されている。
      • synchOnPgmTransfer ビルド記述子オプションが NO に設定されている。
      • 転送元プログラムの PSB レコードで参照されているデフォルトの PSB が、ターゲット・プログラムの PSB レコードで参照されているデフォルトの PSB と同じである。

      この場合、コミット点は発生せず、EGL はスケジュールに入っている PSB をターゲット・プログラムに渡します。

      デフォルトの PSB は defaultPSBName プロパティーの値です。この値は、プログラムの PSB レコードの基本である PSB レコード・パーツで設定されます。 プロパティーのデフォルト値は、レコード・パーツの名前です。

DB PCB は、ランタイム PSB で有効です。

IMS BMP

ランタイム JCL の PSB パラメーターは、ジョブ・ステップ全体を通じて使用されるランタイム PSB を識別します。 JCL は導入時にカスタマイズすることができますが、ランタイム JCL の PSB パラメーターのデフォルト値は、EGL が defaultPSBName PSB レコード・プロパティーの値を割り当てることによって生成します。

IMS BMP の場合、EGL では以下の PCB がランタイム PSB 内に存在している必要があります。
  1. ゼロ (最初の) 位置に入出力 PCB。 バッチ指向 BMP を生成している場合でも、PSBGEN ジョブの開発時には、IMS システム・プログラマーが CMPAT を YES に設定していることを確認してください。
  2. 代替 PCB (通常は 2 番目の位置にあります)。
  3. 特別代替 PCB (通常は 3 番目の位置にあります)。

DB および GSAM PCB も有効です。

IMS/VS

IMS システム定義の規則により、メインプログラムの名前は確実にランタイム PSB の名前になります。 この名前は、トランザクション全体を通じて使用可能です。

IMS/VS の場合、EGL では以下の PCB がランタイム PSB 内に存在している必要があります。
  1. ゼロ (最初の) 位置に入出力 PCB。 IMS システム・プログラマーは、PSBGEN ジョブの開発時に CMPAT を YES に設定することができますが、このアクションはオプションです。
  2. 代替 PCB (通常は 2 番目の位置にあります)。
  3. 特別代替 PCB (通常は 3 番目の位置にあります)。

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 を使用できるということです。


フィードバック