IBM® は
、1960 年代に階層型データベース管理システムとして DL/I (データ・ランゲージ/ワン) を開発しました。
DL/I は、COBOL プログラムにおけるデータベース・システムとして、現在も広く普及しています。
以下の用語および概念は、DL/I データベース・プログラムの開発で基本的なものです。
- セグメント
- DL/I データベースでのデータの基本単位がセグメントです。セグメントは、レコードと似ています。
セグメントは、データ・フィールドに分割される、単一のデータのブロックです。
- データベース階層
- 1 つのデータベースに、多くのタイプのセグメントを含むことができます。これらのセグメントは、階層 (トップダウン) 関係で配置されます。
階層の最上部にあるセグメントは、ルート・セグメントと呼ばれます。
各セグメントは、そのセグメントに関連した 1 つ以上の従属セグメントを、階層の下位レベルに持つことができます。
従属セグメントを持つセグメントは、その従属セグメントの親と呼ばれます。
従属セグメントは、子セグメントと呼ばれます。
ルート・セグメントを除いて、データベースの各セグメントには親が 1 つだけ存在します。
ルート・セグメントに親はありません。
- シーケンス・フィールド
- データベースの各セグメント・タイプは、そのフィールドの 1 つを
シーケンス・フィールドとして指定することができます。
シーケンス・フィールドの値は、セグメントの保存順序とデータベースからのセグメントの
検索順序を決定します。
親セグメントに、同じ子セグメント・タイプのオカレンスが複数あり、シーケンス・フィールドがその子セグメントに対して定義されていると、DL/I は、その親の下にシーケンス・フィールドの順序でそれらの子セグメントを保存します。
- プログラム仕様ブロック (PSB)
- PSB は、プログラムがアクセスできる階層型データベース構造を、正式な DL/I で記述したものです。
PSBRecord タイプの EGL レコード・パーツには、プログラムが DL/I PSB とやり取りするために必要な情報が含まれています。
PSB は、セグメントのタイプ間に存在する階層関係を示します。
詳しくは
、「EGL 言語解説書」のPSB および PCB を使用したデータ・アクセスを参照してください。
- プログラム連絡ブロック (PCB)
- PCB は、PSB の項目です。それぞれのデータベース PCB は、プログラムが使用できる 1 つの階層データ構造を表しています。
データ構造が、物理的または論理的 DL/I データベースの構造にそのまま対応する場合や、2 次索引によるアクセスによりデータベース構造を反転させる場合があります。
- DL/I 呼び出し
- DL/I 呼び出しは、プログラムによる DL/I の起動です。データベース呼び出し用に渡されるパラメーター・リストは、以下の情報を DL/I に提供します。
- ファンクション・コード
- DL/I が、データベースのセグメントを取得、挿入、置換、または削除する場合を示します。
- データベース ID
- CBLTDLI を使用した DL/I 呼び出しの場合、DL/I がその呼び出しでアクセスする
データベースを識別するプログラム連絡ブロック (PCB) を指します。AIBTDLI を
使用した DL/I 呼び出しの場合は、PSB における PCB の名前を指定します。
- 入出力域アドレス
- セグメントがデータベースから読み取られた後、またはデータベースに書き込まれる前に、そのセグメントを含んでいるバッファーのアドレスを特定します。
- セグメント検索引数 (SSA) リスト
- DL/I がセグメントを選択できるようにする、一連の検索条件をリストします。この検索条件により、データベースからのセグメントの検索や、データベースへ挿入するセグメントの位置の指定を
行います。
COBOL または PL/I などの言語で DL/I プログラムをコーディングするときに、DL/I パラメーター・リストを直接コーディングするか、または
CICS®
のコマンド・レベル・インターフェースを使用して DL/I パラメーター・リストを作成します。
EGL は、I/O ステートメントおよび PCB における DL/I セグメントの位置に基づいて
、DL/I パラメーター・リストを作成します。
この関数用に作成される DL/I 呼び出しは表示することができます。
また、DL/I 呼び出しを変更して、追加の DL/I 関数を使用することもできます。
- データベース位置
- プログラムが実行中のときに、DL/I は、プログラム PSB の PCB ごとに位置ポインターを
維持しています。
ポインターは、get next ステートメントが取得対象セグメントの検索を開始する、データベースの場所を示します。
位置ポインターは、成功したすべての DL/I 呼び出しで設定され、その呼び出しでアクセスされた最終セグメントの後ろにあるセグメントを指します。
呼び出しが 1 つも実行されていない場合、現在位置はデータベースの開始位置を示します。
データベースを終了する条件が発生した場合、現在位置は、データベースの開始位置になります。
DL/I が SSA リスト基準を満たすセグメントについてデータベースの検索を続行するときに、DL/I は、データベースに出現する順序で各ルート・セグメントにアクセスします。
DL/I がルート・セグメントを検出すると、そのルートのすべての従属セグメントにアクセスしてから、次のルートをスキャンします。
DL/I が従属セグメントをスキャンするときは、まず、次の下位レベルにある次のセグメントを読み取ろうとします。
下位レベルが存在しない場合は、同じレベルにある次のセグメントを読み取ります。
現在のレベルにそれ以上セグメントがない場合は、前のレベルに戻って、次のセグメントを検索します。
このプロセスは、「上から下へ、左から右へ」の検索順序と呼ばれます。
関連データベースへのアクセスに使用するものと同じ多くの EGL ステートメント (add、delete、get、および replace)
を使用して、DL/I データベースにアクセスする EGL プログラムを記述することができます。
EGL ステートメントが DLISegment ステレオタイプに基づくレコード変数を指定する
と、EGL は、DL/I データベースを処理するコードを生成することを認識します。
SQL の場合と同様に、EGL で DL/I プログラムすべてを記述したり、より詳細な制御を行う明示的な DL/I コードを指定することができます。
この場合、DL/I 疑似コードで記述し、EGL はそれを実際の DL/I コマンドに変換します。
サンプル DL/I データベース・レイアウトの図については
、サンプル DL/I データベースを参照してください。
一般的な DL/I コーディングの問題に対するサンプル・ソリューションについては、DL/I の例を参照してください。