DL/Iデータベース・サービス

本章では、DL/Iデータベース・サービスに関連するEXEC DLIコマンド・インターフェースとCBLTDLI呼び出しインターフェースについて説明します。

1. 概要

OSCアプリケーション・サーバーは、IBMメインフレームのIMS/DBに対応するOpenFrameのHiDB製品をベースにしてDL/Iデータベース・サービス機能を提供します。DL/Iデータベース・サービスは、EXEC DLIコマンド・インターフェースとCBLTDLI呼び出しインターフェースの2つのインターフェースをサポートします。

EXEC DLIコマンド・インターフェース

EXEC DLIインターフェースはDL/Iデータベース・アクセスのためのコマンド・インターフェースです。OSCアプリケーション・サーバーは、EXEC DLIインターフェースを介してコマンドを実行するたびに、現在の状態コードおよびDL/Iに関連する情報をアプリケーション・プログラムがアクセスできるように、DIB(DL/I Interface Block)というコントロール・ブロックを提供します。ユーザーは、このブロックに保存されている状態コードからコマンドが正常に実行されたかどうかを確認できます。

DIBから以下の情報を取得できます。

区分 説明

DIBSTAT

2バイト文字列であり、EXEC DLIインターフェースを介してコマンドを実行した後、状態コードが保存されます。

DIBSEGM

8バイト文字列であり、GNGNPGUISRTコマンドが正常に実行された場合、最も低いレベルのセグメント名が保存されます。

DIBSEGLV

2バイト文字列であり、GNGNPGUISRTコマンドが正常に実行された場合、最も低いセグメント・レベル値が保存されます。

DIBKFBL

2バイト・バイナリ数字であり、GNGNPGUコマンドでKEYFEEDBACKオプションを使用した場合、連結キー(concatenated key)の長さが保存されます。

DL/Iデータベースへのアクセスは、PSB(Program Specification Block)をスケジューリングすることから始まります。PSBはPCB(Program Communication Block)の集合体であり、PCBはアプリケーションがどのビューからデータベースを見るかを定義します。OSCアプリケーションは複数のPCBタイプのうちDB PCBタイプのみをサポートします。各コマンドはPSBに設定されているPCBを利用して、どのデータベースにアクセスするかを指定します。

以下は、EXEC DLIコマンドの使用例を示しています。

* PSBをスケジューリングします。
EXEC DLI SCHD PSB(PSB-NAME) END-EXEC.

* FIELDAのフィールド値が123のSEGAセグメント値を読み込みます。
MOVE ‘123’ TO FIELD1.
EXEC DLI GU SEGMENT(SEGA) INTO(SEGA-AREA) WHERE(FIELDA=FIELD1) END-EXEC.

* PSBの使用を終了します。
EXEC DLI TERM END-EXEC.

正常にスケジューリングが完了すると、以下で説明するコマンドを利用してPSBに指定されているデータベースにアクセスできます。

DL/I機能およびHiDBの詳細については、OpenFrame HiDB『HiDBガイド』を参照してください。

CBLTDLI呼び出しインターフェース

CBLTDLIインターフェースは、EXEC DLIインターフェースとは別途でCOBOLプログラムでCALLキーワードを利用してDL/Iデータベースにアクセスできるように提供される呼び出しインターフェースです。CBLTDLIインターフェースは、OSCアプリケーション・プログラムだけでなく、OpenFrame Batchアプリケーション・プログラムでも使用できます。ただし、OpenFrame Batchアプリケーション・プログラムとは使用方式が異なります。

2. EXEC DLIコマンド・インターフェース

EXEC DLIインターフェースのコマンドは、データベースへのアクセス制御コマンド・グループとアクセス・コマンド・グループに分けられます。

EXEC DLIコマンド
  • DL/Iデータベース・アクセス制御コマンド

    以下は、DL/Iデータベース・アクセス制御コマンドの一覧です。各コマンドの詳細については該当する節を参照してください。

    コマンド 説明

    SCHD

    PSBをスケジューリングします。

    TERM

    PSBの使用が終了したことを通知します。

  • DL/Iデータベース・アクセス・コマンド

    以下は、DL/Iデータベース・アクセスに関連するコマンドの一覧です。各コマンドの詳細については該当する節を参照してください。

    コマンド 説明

    DLET

    データベースからセグメントと当該セグメントに従属している項目を削除します。

    GN

    データベースからセグメントを順次読み込みます。

    GNP

    特定の親に従属しているセグメントのみを読み込みます。

    GU

    特定のセグメントを読み込み、順次検索のための開始時点を指定します。

    ISRT

    1つ以上の新しいセグメントを追加します。

    REPL

    特定セグメントの1つ以上のフィールド値を変更します。

2.1. SCHD (SCHEDULE)

PSBをスケジューリングします。SCHDコマンドは、DL/Iデータベースにアクセスする前にPSBスケジューリングによってアクセスすることをDL/Iに通知する機能をします。

  • 構文

    EXEC DLI SCHD [option …] END-EXEC.
  • オプション

    オプション 説明

    PSB

    スケジューリングするPSBを指定します。

PSBを使用しなくなった場合や他のPSBを使用する場合は、以前のPSBをTERMコマンドを利用して終了させます。

2.2. TERM (TERMINATE)

PSBの使用が終了したことを通知します。TERMコマンドを使用すると、PSBの使用を終了し、すべてのデータベースの変更事項が適用されます。コマンド・オプションは別途存在しません。

  • 構文

    EXEC DLI TERM END-EXEC.

変更事項が適用された後は、元に戻すことができないので注意が必要です。

2.3. DLET (DELETE)

データベースからセグメントと当該セグメントに従属している項目を削除するコマンドです。削除する前に削除したいセグメントを先に取得する必要があり、その取得したセグメントをDLETコマンドで削除します。

  • 構文

    EXEC DLI DLET [option …] END-EXEC.
  • オプション

    オプション 説明

    USING PCB

    使用するDB PCBを指定します。

    FROM

    削除するセグメントのデータが指定されているパスを指定します。

    SEGMENT

    削除するセグメント・タイプを指定します。

    SEGLENGTH

    I/Oパスの長さを指定します。

2.4. GN (GET NEXT)

データベースからセグメントを順次読み込むコマンドです。GNコマンドを実行するたびに、オプションに指定している情報に従って次のセグメントを読み込みます。GNコマンドを実行する前に、GUコマンドを利用してどの位置から読み込むかを必ず指定します。

SEGMENTオプションとWHEREオプションで、読み込みに関する条件を付けることができます。

  • 構文

    EXEC DLI GN [option …] END-EXEC.
  • オプション

    オプション 説明

    USING PCB

    使用するDB PCBを指定します。

    CURRENT

    現在のポジションに基づいてセグメントを追加します。

    FEEDBACKLEN

    KEYFEEDBACK保存領域の長さを指定します。

    FIELDLENGTH

    WHEREオプションに指定するフィールド値の長さを指定します。

    FIRST

    セグメント・タイプの最初のセグメントを読み込みます。

    KEYFEEDBACK

    セグメントの連結キーが保存されるパスを指定します。

    INTO

    読み込むセグメントが保存されるパスを指定します。

    LAST

    セグメント・タイプの最後のセグメントを読み込みます。

    SEGLENGTH

    I/Oパスの長さを指定します。

    SEGMENT

    読み込むセグメント・タイプを指定します。

    WHERE

    読み込むセグメントのQualification Statementを記述します。

    Qualification Statementは以下の3つの組み合わせで構成されます。

    • セグメントのフィールド名

    • 比較演算子

    • 比較する値が保存されている変数

2.5. GNP (GET NEXT IN PARENT)

特定親に従属しているセグメントのみを読み込むためのコマンドです。GNPコマンドを実行する前に、親情報が与えられたGUまたはGNコマンドを実行する必要があります。

SEGMENTオプションとWHEREオプションで読み込みに関する条件を付けることができます。

  • 構文

    EXEC DLI GNP [option …] END-EXEC.
  • オプション

    オプション 説明

    USING PCB

    使用するDB PCBを指定します。

    CURRENT

    現在のポジションに基づいてセグメントを追加します。

    FIELDLENGTH

    WHEREオプションに指定するフィールド値の長さを指定します。

    FEEDBACKLEN

    KEYFEEDBACK保存領域の長さを指定します。

    FIRST

    セグメント・タイプの最初のセグメントを読み込みます。

    KEYFEEDBACK

    セグメントの連結キーが保存されるパスを指定します。

    INTO

    読み込むセグメントが保存されるパスを指定します。

    LAST

    セグメント・タイプの最後のセグメントを読み込みます。

    SEGMENT

    読み込むセグメント・タイプを指定します。

    SEGLENGTH

    I/Oパスの長さを指定します。

    WHERE

    読み込むセグメントのQualification Statementを記述します。

    Qualification Statementは以下の3つの組み合わせで構成されます。

    • セグメントのフィールド名

    • 比較演算子

    • 比較する値が保存されている変数

2.6. GU (GET UNIQUE)

特定セグメントを読み込み、順次検索のための開始時点を指定するコマンドです。どのセグメントタイプを読み込むか、少なくとも1つのSEGMENTオプションを指定する必要があります。また、WHEREオプションを使って、読み込みに関する条件を付けることができます。

  • 構文

    EXEC DLI GU [option …] END-EXEC.
  • オプション

    オプション 説明

    USING PCB

    使用するDB PCBを指定します。

    FIELDLENGTH

    WHEREオプションに指定するフィールド値の長さを指定します。

    FEEDBACKLEN

    KEYFEEDBACK保存領域の長さを指定します。

    KEYFEEDBACK

    セグメントの連結キーが保存されるパスを指定します。

    INTO

    読み込むセグメントが保存されるパスを指定します。

    LAST

    セグメント・タイプの最後のセグメントを読み込みます。

    SEGMENT

    読み込むセグメント・タイプを指定します。

    SEGLENGTH

    I/Oパスの長さを指定します。

    WHERE

    読み込むセグメントのQualification Statementを記述します。

    Qualification Statementは以下の3つの組み合わせで構成されます。

    • セグメントのフィールド名

    • 比較演算子

    • 比較する値が保存されている変数

2.7. ISRT (INSERT)

1つ以上の新規セグメントを追加するためのコマンドです。ISRTコマンドを実行する前にセグメントが追加される位置を指定する必要があります。

  • 構文

    EXEC DLI ISRT [option …] END-EXEC.
  • オプション

    オプション 説明

    USING PCB

    使用するDB PCBを指定します。

    CURRENT

    現在のポジションに基づいてセグメントを追加します。

    FIELDLENGTH

    WHEREオプションに指定するフィールド値の長さを指定します。

    FROM

    追加するセグメントのデータが保存されているパスを指定します。

    FIRST

    セグメント・タイプの最初のセグメントとして追加します。

    LAST

    セグメント・タイプの最後のセグメントとして追加します。

    SEGMENT

    追加するセグメント・タイプを指定します。

    SEGLENGTH

    I/Oパスの長さを指定します。

    WHERE

    追加するセグメントのQualification Statementを記述します。

    Qualification Statementは以下の3つの組み合わせで構成されます。

    • セグメントのフィールド名

    • 比較演算子

    • 比較する値が保存されている変数

2.8. REPL (REPLACE)

特定セグメントの1つ以上のフィールド値を変更するためのコマンドです。REPLコマンドの前にGUコマンドを使って変更しようとするセグメントを先に取得した後、そのセグメントをREPLコマンドで変更します。REPLコマンドは、SEGMENTオプションおよびFROMオプションがそれぞれ1つ以上指定されている必要があります。

  • 構文

    EXEC DLI REPL [option …] END-EXEC.
  • オプション

    オプション 説明

    USING PCB

    使用するDB PCBを指定します。

    FROM

    変更するセグメントのデータが保存されているパスを指定します。

    SEGLENGTH

    I/Oパスの長さを指定します。

    SEGMENT

    変更するセグメント・タイプを指定します。

3. CBLTDLI呼び出しインターフェース

本節では、EXEC DLIインターフェースとCBLTDLI呼び出しインターフェースの違いについて説明し、さらにOpenFrame BatchプログラムのCBLTDLI呼び出しインターフェースとの違いについて説明します。

EXEC DLIインターフェースとの違い

EXEC DLIインターフェースと違って、CBLTDLインターフェースを使用する場合には、CICSでと同じようにDLIUIB(DL/I User Interface Block)とPCBマスクなどを直接指定する必要があります。また、DL/Iデータベースにアクセスする際にセグメントを識別するために、直接SSA(Segment Search Arguments)を作成して記述する必要があります。

以下は、CBLTDLIインターフェースを利用してPSBをスケジューリングする例です。

CALL ‘CBLTDLI’  USING ‘PCB ‘ PSBNAME ADDRESS OF DLIUIB

以下は、特定フィールド条件に適するセグメント値を読み込む例です。

CALL ‘CBLTDLI’ USING ‘GU  ‘ THE-PCB-MASK SEGA-AREA FIELDA-SSA.
BatchプログラムのCBLTDLIインターフェースとの違い

OSCシステムからCBLTDLIインターフェースを介してDL/Iデータベースにアクセスすることは、BatchプログラムでCBLTDLIインターフェースを使用することと比較すると、以下の2点が異なります。

  • EXEC DLIインターフェースと同様にPSBスケジューリングが必要です。

  • CBLTDLI呼び出し結果に対する状態チェックが異なります。

    DLIUIBのUIBRCODEがCBLTDLI呼び出しの成功/失敗を決めます。UBIRCODEは、エラー情報を表示するUIBFCTRと付加エラー情報を表示するUIBDLTRに区分できます。まずUIBFCTRでエラーを確認し、その値が深刻な状態を示している場合、CBLTDLIインターフェースは直接エラー処理をしないため、EXEC CICSインターフェースのABENDコマンドを利用してタスクを終了させる必要があります。Batch DL/Iプログラムと同様に、CBLTDLIの呼び出しが正常実行されたかどうかについてはPCBマスクの状態コードを利用して確認します。

CBLTDLIインターフェースの詳細については、OpenFrame HiDB『HiDBガイド』を参照してください。