Ims-db-quick-guide
IMS DB-概要
簡単な概要
データベースは、相関するデータ項目のコレクションです。 これらのデータ項目は、迅速かつ簡単にアクセスできるように編成および保存されます。 IMSデータベースは、データがさまざまなレベルで保存され、各エンティティがより高いレベルのエンティティに依存している階層型データベースです。 IMSを使用するアプリケーションシステムの物理要素を次の図に示します。
データベース管理
データベース管理システムは、データベース内のデータの保存、アクセス、管理に使用されるアプリケーションプログラムのセットです。 IMSデータベース管理システムは、整合性を維持し、データを簡単に取得できるように編成することにより、データの高速リカバリを可能にします。 IMSは、データベース管理システムの助けを借りて、世界中の大量の企業データを維持しています。
トランザクションマネージャー
トランザクションマネージャの機能は、データベースとアプリケーションプログラム間の通信プラットフォームを提供することです。 IMSはトランザクションマネージャとして機能します。 トランザクションマネージャは、データベースからデータを保存および取得するためにエンドユーザーを扱います。 IMSは、データを格納するバックエンドデータベースとしてIMS DBまたはDB2を使用できます。
DL/I –データ言語インターフェース
DL/Iは、データベースに保存されているデータへのアクセスを許可するアプリケーションプログラムで構成されています。 IMS DBは、プログラマがアプリケーションプログラムでデータベースにアクセスするために使用するインターフェイス言語として機能するDL/Iを使用します。 これについては、今後の章で詳しく説明します。
IMSの特徴
注意点-
- IMSは、JavaやXMLなどのさまざまな言語のアプリケーションをサポートしています。
- IMSアプリケーションとデータには、どのプラットフォームからでもアクセスできます。
- IMS DBの処理は、DB2と比較して非常に高速です。
IMSの制限
注意点-
- IMS DBの実装は非常に複雑です。
- IMSの事前定義ツリー構造により、柔軟性が低下します。
- IMS DBは管理が困難です。
IMS DB-構造
階層構造
IMSデータベースは、物理ファイルに対応するデータのコレクションです。 階層データベースでは、最上位レベルにエンティティに関する一般情報が含まれます。 階層の最上位レベルから最下位レベルに進むと、エンティティに関する情報が増えます。
階層の各レベルにはセグメントが含まれます。 標準ファイルでは、階層の実装は困難ですが、DL/Iは階層をサポートしています。 次の図は、IMS DBの構造を示しています。
セグメント
注意点-
- セグメントは、同様のデータをグループ化することにより作成されます。
- これは、入出力操作中にDL/Iがアプリケーションプログラムとの間で転送する情報の最小単位です。
- セグメントには、1つ以上のデータフィールドをグループ化できます。
次の例では、セグメントStudentに4つのデータフィールドがあります。
学生
ロール番号
Name
コース
携帯電話番号
フィールド
注意点-
- フィールドは、セグメント内の単一のデータです。 たとえば、ロール番号、名前、コース、モバイル番号は、学生セグメントの単一フィールドです。
- セグメントは、エンティティの情報を収集する関連フィールドで構成されます。
- フィールドは、セグメントを順序付けるためのキーとして使用できます。
- フィールドは、特定のセグメントに関する情報を検索するための修飾子として使用できます。
セグメントタイプ
注意点-
- セグメントタイプは、セグメント内のデータのカテゴリです。
- DL/Iデータベースは、255の異なるセグメントタイプと15レベルの階層を持つことができます。
- 次の図には、ライブラリ、書籍情報、学生情報の3つのセグメントがあります。
セグメント発生
注意点-
- セグメントオカレンスは、ユーザーデータを含む特定のタイプの個々のセグメントです。 上記の例では、書籍情報は1つのセグメントタイプであり、任意の数の書籍に関する情報を格納できるため、その出現回数は任意です。
- IMSデータベース内では、各セグメントタイプのオカレンスは1つだけですが、各セグメントタイプのオカレンスの数に制限はありません。
IMS DB-DL/Iの用語
階層データベースは、2つ以上のセグメント間の関係を処理します。 次の例は、IMSデータベース構造内でセグメントが互いにどのように関連しているかを示しています。
ルートセグメント
注意点-
- 階層の最上位にあるセグメントは、ルートセグメントと呼ばれます。
- ルートセグメントは、すべての依存セグメントにアクセスするための唯一のセグメントです。
- ルートセグメントは、子セグメントではない、データベース内の唯一のセグメントです。
- IMSデータベース構造に存在できるルートセグメントは1つだけです。
- たとえば、上記の例では、 'A' がルートセグメントです。
親セグメント
注意点-
- 親セグメントには、その直下に1つ以上の従属セグメントがあります。
- たとえば、 'A' 、 'B' 、および 'E' は、上記の例の親セグメントです。
従属セグメント
注意点-
- ルートセグメント以外のすべてのセグメントは、依存セグメントと呼ばれます。
- 依存セグメントは、完全な意味を表すために1つ以上のセグメントに依存します。
- たとえば、この例では、 'B'、 'C1'、 'C2'、 'D'、 'E'、 'F1' および 'F2' は従属セグメントです。
子セグメント
注意点-
- 階層内のすぐ上にセグメントを持つセグメントは、子セグメントと呼ばれます。
- 構造内の各依存セグメントは子セグメントです。
- たとえば、 'B'、 'C1'、 'C2'、 'D'、 'E'、 'F1' および 'F2' は子セグメントです。
ツインセグメント
注意点-
- 単一の親セグメントの下にある特定のセグメントタイプの複数のセグメントオカレンスは、ツインセグメントと呼ばれます。
- たとえば、 'C1' and 'C2' はツインセグメントなので、 'F1' 'and *' F2 '*はツインセグメントです。
兄弟セグメント
注意点-
- 兄弟セグメントは、異なるタイプのセグメントであり、同じ親です。
- たとえば、 'B' および 'E' は兄弟セグメントです。 同様に、* 'C1'、 'C2'、、および *'D' は兄弟セグメントです。
データベースレコード
注意点-
- ルートセグメントが出現するたびに、すべての従属セグメントが出現して、1つのデータベースレコードが作成されます。
- すべてのデータベースレコードにはルートセグメントが1つしかありませんが、セグメントオカレンスの数に制限はありません。
- 標準のファイル処理では、レコードはアプリケーションプログラムが特定の操作に使用するデータの単位です。 DL/Iでは、そのデータの単位はセグメントと呼ばれます。 単一のデータベースレコードには、多くのセグメントオカレンスがあります。
データベースパス
注意点-
- パスは、データベースレコードのルートセグメントから特定のセグメントオカレンスまでの一連のセグメントです。
- 階層構造内のパスは、最下位レベルまで完全である必要はありません。 エンティティについて必要な情報量によって異なります。
- パスは連続している必要があり、構造の中間レベルをスキップすることはできません。
- 次の図では、暗い灰色の子レコードは、 'A' から始まり 'C2' を通るパスを示しています。
IMS DB-DL/I処理
IMS DBは、さまざまなレベルでデータを保管します。 データは、アプリケーションプログラムからDL/I呼び出しを発行することで取得および挿入されます。 DL/I呼び出しについては、今後の章で詳しく説明します。 データは、次の2つの方法で処理することができます-
- 順次処理
- ランダム処理
順次処理
データベースからセグメントが順次取得されると、DL/Iは事前定義されたパターンに従います。 IMS DBの順次処理について理解しましょう。
以下にリストされているのは、順次処理に関する注意点です-
- DL/Iのデータにアクセスするための事前定義されたパターンは、最初に階層を下って、次に左から右です。
- ルートセグメントが最初に取得され、次にDL/Iが最初の左の子に移動し、最下位レベルまで下がります。 最下位レベルでは、ツインセグメントのすべての出現を取得します。 次に、右のセグメントに進みます。
- よりよく理解するために、セグメントにアクセスするためのフローを示す上の図の矢印を観察してください。 ライブラリはルートセグメントであり、フローはそこから始まり、車まで進んで単一のレコードにアクセスします。 すべてのデータレコードを取得するために、すべてのオカレンスに対して同じプロセスが繰り返されます。
- データにアクセスする際、プログラムはデータベース内の「位置」を使用して、セグメントの取得と挿入を支援します。
ランダム処理
ランダム処理は、IMS DBのデータの直接処理とも呼ばれます。 IMS DBでのランダム処理を理解するための例を取り上げましょう-
以下にリストされているのは、ランダム処理に関する注意点です-
- ランダムに取得する必要があるセグメントオカレンスには、依存するすべてのセグメントのキーフィールドが必要です。 これらのキーフィールドは、アプリケーションプログラムによって提供されます。
- 連結キーは、ルートセグメントから取得するセグメントへのパスを完全に識別します。
- Commerceセグメントのオカレンスを取得する場合、Library、Books、Commerceなど、依存するセグメントの連結キーフィールド値を指定する必要があるとします。
- ランダム処理は、順次処理よりも高速です。 実際のシナリオでは、アプリケーションはシーケンシャル処理とランダム処理の両方の方法を組み合わせて、最高の結果を達成します。
キーフィールド
注意点-
- キーフィールドは、シーケンスフィールドとも呼ばれます。
- キーフィールドはセグメント内に存在し、セグメントオカレンスを取得するために使用されます。
- キーフィールドは、セグメントの発生を昇順で管理します。
- 各セグメントでは、キーフィールドまたはシーケンスフィールドとして使用できるフィールドは1つだけです。
検索フィールド
前述のように、キーフィールドとして使用できるフィールドは1つだけです。 キーフィールドではない他のセグメントフィールドの内容を検索する場合、データを取得するために使用されるフィールドは検索フィールドと呼ばれます。
IMS DB-制御ブロック
IMS制御ブロックは、IMSデータベースの構造とそれらへのプログラムのアクセスを定義します。 次の図は、IMS制御ブロックの構造を示しています。
DL/Iは、次の3種類の制御ブロックを使用します-
- データベース記述子(DBD)
- プログラム仕様ブロック(PSB)
- アクセス制御ブロック(ACB)
データベース記述子(DBD)
注意点-
- DBDは、すべてのセグメントが定義されると、データベースの完全な物理構造を記述します。
- DL/Iデータベースのインストール中に、IMSデータベースにアクセスするために必要なDBDを1つ作成する必要があります。
- アプリケーションは、DBDのさまざまなビューを使用できます。 これらはアプリケーションデータ構造と呼ばれ、プログラム仕様ブロックで指定されます。
- データベース管理者は、 DBDGEN 制御ステートメントをコーディングしてDBDを作成します。
DBDGEN
DBDGENは、データベース記述子ジェネレーターです。 制御ブロックの作成は、データベース管理者の責任です。 すべてのロードモジュールはIMSライブラリに保存されます。 アセンブリ言語マクロステートメントは、制御ブロックの作成に使用されます。 以下に示すのは、DBDGEN制御ステートメントを使用してDBDを作成する方法を示すサンプルコードです-
PRINT NOGEN
DBD NAME=LIBRARY,ACCESS=HIDAM
DATASET DD1=LIB,DEVICE=3380
SEGM NAME=LIBSEG,PARENT=0,BYTES=10
FIELD NAME=(LIBRARY,SEQ,U),BYTES=10,START=1,TYPE=C
SEGM NAME=BOOKSEG,PARENT=LIBSEG,BYTES=5
FIELD NAME=(BOOKS,SEQ,U),BYTES=10,START=1,TYPE=C
SEGM NAME=MAGSEG,PARENT=LIBSEG,BYTES=9
FIELD NAME=(MAGZINES,SEQ),BYTES=8,START=1,TYPE=C
DBDGEN
FINISH
END
上記のDBDGENで使用されている用語を理解しましょう-
- JCL で上記の制御ステートメントを実行すると、LIBRARYがルートセグメントであり、BOOKSおよびMAGZINESがその子セグメントである物理構造が作成されます。
- 最初のDBDマクロステートメントは、データベースを識別します。 ここで、このデータベースにアクセスするためにDL/Iによって使用されるNAMEおよびACCESSに言及する必要があります。
- 2番目のDATASETマクロステートメントは、データベースを含むファイルを識別します。 *セグメントタイプは、SEGMマクロステートメントを使用して定義されます。 そのセグメントの親を指定する必要があります。 ルートセグメントの場合、PARENT = 0を指定します。
次の表は、FIELDマクロステートメントで使用されるパラメータを示しています-
S.No | Parameter & Description |
---|---|
1 |
フィールドの名前、通常は1〜8文字の長さ |
2 |
Bytes フィールドの長さ |
3 |
Start セグメント内のフィールドの位置 |
4 |
Type フィールドのデータ型 |
5 |
Type C 文字データ型 |
6 |
Type P パック10進数データ型 |
7 |
Type Z ゾーン10進数データ型 |
8 |
Type X 16進データ型 |
9 |
Type H ハーフワードバイナリデータタイプ |
10 |
Type F フルワードのバイナリデータタイプ |
プログラム仕様ブロック(PSB)
PSBの基本は以下のとおりです-
- データベースにはDBDによって定義された単一の物理構造がありますが、それを処理するアプリケーションプログラムはデータベースの異なるビューを持つことができます。 これらのビューはアプリケーションデータ構造と呼ばれ、PSBで定義されます。
- 1回の実行で複数のPSBを使用できるプログラムはありません。
- アプリケーションプログラムには独自のPSBがあり、同様のデータベース処理要件を持つアプリケーションプログラムがPSBを共有することは一般的です。
- PSBは、プログラム通信ブロック(PCB)と呼ばれる1つ以上の制御ブロックで構成されます。 PSBには、アプリケーションプログラムがアクセスするDL/Iデータベースごとに1つのPCBが含まれています。 今後のモジュールでPCBについて詳しく説明します。
- プログラムのPSBを作成するには、PSBGENを実行する必要があります。
PSBGEN
PSBGENは、プログラム仕様ブロックジェネレーターとして知られています。 次の例では、PSBGENを使用してPSBを作成します-
PRINT NOGEN
PCB TYPE=DB,DBDNAME=LIBRARY,KEYLEN=10,PROCOPT=LS
SENSEG NAME=LIBSEG
SENSEG NAME=BOOKSEG,PARENT=LIBSEG
SENSEG NAME=MAGSEG,PARENT=LIBSEG
PSBGEN PSBNAME=LIBPSB,LANG=COBOL
END
上記のDBDGENで使用されている用語を理解しましょう-
- 最初のマクロステートメントは、データベースタイプ、名前、キー長、および処理オプションを記述するプログラム通信ブロック(PCB)です。
- PCBマクロのDBDNAMEパラメーターは、DBDの名前を指定します。 KEYLENは、最長の連結キーの長さを指定します。 プログラムはデータベースで処理できます。 PROCOPTパラメーターは、プログラムの処理オプションを指定します。 たとえば、LSはLOAD操作のみを意味します。
- SENSEGは、セグメントレベル感度として知られています。 データベースの一部へのプログラムのアクセスを定義し、セグメントレベルで識別されます。 プログラムは、機密性の高いセグメント内のすべてのフィールドにアクセスできます。 プログラムは、フィールドレベルの感度を持つこともできます。 これで、セグメント名とセグメントの親名を定義します。
- 最後のマクロステートメントはPCBGENです。 PSBGENは、処理するステートメントがこれ以上ないことを伝える最後のステートメントです。 PSBNAMEは、出力PSBモジュールに与えられる名前を定義します。 LANGパラメーターは、アプリケーションプログラムが記述されている言語(COBOLなど)を指定します。
アクセス制御ブロック(ACB)
以下にリストされているのは、アクセス制御ブロックに関する注意点です-
- アプリケーションプログラムのアクセス制御ブロックは、データベース記述子とプログラム仕様ブロックを実行可能な形式に結合します。
- ACBGENは、アクセス制御ブロックジェネレーターとして知られています。 ACBの生成に使用されます。
- オンラインプログラムの場合、ACBを事前に作成する必要があります。 したがって、ACBGENユーティリティは、アプリケーションプログラムを実行する前に実行されます。
- バッチプログラムの場合、実行時にACBも生成できます。
IMS DB-プログラミング
DL/I呼び出しを含むアプリケーションプログラムは直接実行できません。 代わりに、IMS DL/Iバッチモジュールをトリガーするには「JCL」が必要です。 IMSのバッチ初期化モジュールはDFSRRC00です。 アプリケーションプログラムとDL/Iモジュールは一緒に実行されます。 次の図は、データベースにアクセスするためのDL/I呼び出しを含むアプリケーションプログラムの構造を示しています。
アプリケーションプログラムは、次のプログラム要素を介してIMS DL/Iモジュールとインターフェイスします-
- ENTRYステートメントは、プログラムによってPCBが使用されることを指定します。
- PCBマスクは、IMSからの戻り情報を受け取る事前に構築されたPCBに保存されている情報と相互に関連しています。
- 入出力領域は、IMSデータベースとの間でデータセグメントをやり取りするために使用されます。
- DL/Iの呼び出しは、フェッチ、挿入、削除、置換などの処理機能を指定します。
- Check Status Codesは、指定された処理オプションのSQL戻りコードをチェックして、操作が成功したかどうかを通知するために使用されます。
- Terminateステートメントは、DL/Iを含むアプリケーションプログラムの処理を終了するために使用されます。
セグメントのレイアウト
今のところ、IMSは、データにアクセスするために高水準プログラミング言語で使用されるセグメントで構成されていることを学びました。 前に見たライブラリの次のIMSデータベース構造を検討します。ここでは、COBOLでのセグメントのレイアウトを確認します-
01 LIBRARY-SEGMENT.
05 BOOK-ID PIC X(5).
05 ISSUE-DATE PIC X(10).
05 RETURN-DATE PIC X(10).
05 STUDENT-ID PIC A(25).
01 BOOK-SEGMENT.
05 BOOK-ID PIC X(5).
05 BOOK-NAME PIC A(30).
05 AUTHOR PIC A(25).
01 STUDENT-SEGMENT.
05 STUDENT-ID PIC X(5).
05 STUDENT-NAME PIC A(25).
05 DIVISION PIC X(10).
アプリケーションプログラムの概要
IMSアプリケーションプログラムの構造は、非IMSアプリケーションプログラムの構造とは異なります。 IMSプログラムは直接実行できません。むしろ、常にサブルーチンとして呼び出されます。 IMSアプリケーションプログラムは、IMSデータベースのビューを提供するプログラム仕様ブロックで構成されています。
IMS DL/Iモジュールを含むアプリケーションプログラムを実行すると、アプリケーションプログラムとそのプログラムにリンクされたPSBがロードされます。 その後、アプリケーションプログラムによってトリガーされたCALL要求は、IMSモジュールによって実行されます。
IMSサービス
次のIMSサービスは、アプリケーションプログラムによって使用されています-
- データベースレコードへのアクセス
- IMSコマンドの発行
- IMSサービス呼び出しの発行
- チェックポイントコール
- 通話を同期
- オンラインユーザー端末からのメッセージの送信または受信
IMS DB-Cobolの基本
COBOLアプリケーションプログラム内にDL/I呼び出しを含めて、IMSデータベースと通信します。 データベースにアクセスするには、COBOLプログラムで次のDL/Iステートメントを使用します-
- エントリーステートメント
- ゴーバックステートメント
- 声明文
エントリーステートメント
DL/IからCOBOLプログラムに制御を渡すために使用されます。 ここにエントリステートメントの構文があります-
ENTRY 'DLITCBL' USING pcb-name1
[pcb-name2]
上記のステートメントは、COBOLプログラムの*手続き部*でコーディングされています。 COBOLプログラムのエントリステートメントの詳細に行きましょう-
- バッチ初期化モジュールは、アプリケーションプログラムをトリガーし、その制御下で実行されます。
- DL/Iは必要な制御ブロックとモジュール、およびアプリケーションプログラムをロードし、制御はアプリケーションプログラムに与えられます。
- DLITCBLは、 DL/I to COBOL を表します。 エントリステートメントは、プログラムのエントリポイントを定義するために使用されます。
- COBOLでサブプログラムを呼び出すと、そのアドレスも提供されます。 同様に、DL/Iがアプリケーションプログラムに制御を渡すと、プログラムのPSBで定義された各PCBのアドレスも提供します。
- PCBはアプリケーションプログラムの外部にあるため、アプリケーションプログラムで使用されるすべてのPCBは、COBOLプログラムの Linkage Section 内で定義する必要があります。
- リンケージセクション内のPCB定義は、 PCB Mask と呼ばれます。
- ストレージ内のPCBマスクと実際のPCB間の関係は、entryステートメントにPCBをリストすることによって作成されます。 入力ステートメントのリストの順序は、PSBGENに表示される順序と同じでなければなりません。
ゴーバックステートメント
これは、制御をIMS制御プログラムに戻すために使用されます。 以下は、Gobackステートメントの構文です-
GOBACK
以下にリストされているのは、Gobackステートメントについて注意すべき基本的なポイントです-
- GOBACKは、アプリケーションプログラムの最後にコーディングされます。 プログラムから制御をDL/Iに戻します。
- オペレーティングシステムに制御を戻すため、STOP RUNを使用しないでください。 STOP RUNを使用すると、DL/Iは終了機能を実行する機会を得られません。 そのため、DL/Iアプリケーションプログラムでは、Gobackステートメントが使用されます。 *Gobackステートメントを発行する前に、COBOLアプリケーションプログラムで使用されているすべての非DL/Iデータセットを閉じる必要があります。閉じないと、プログラムが異常終了します。
声明文
呼び出しステートメントは、IMSデータベースで特定の操作を実行するなどのDL/Iサービスを要求するために使用されます。 ここに呼び出し文の構文があります-
CALL 'CBLTDLI' USING DLI Function Code
PCB Mask
Segment I/O Area
[Segment Search Arguments]
上記の構文は、callステートメントで使用できるパラメーターを示しています。 次の表でそれらのそれぞれについて説明します-
S.No. | Parameter & Description |
---|---|
1 |
実行されるDL/I機能を識別します。 この引数は、I/O操作を記述する4つの文字フィールドの名前です。 |
2 |
PCB Mask リンケージセクション内のPCB定義は、PCBマスクと呼ばれます。 これらは、エントリステートメントで使用されます。 SELECT、ASSIGN、OPEN、またはCLOSEステートメントは不要です。 |
3 |
Segment I/O Area 入力/出力作業領域の名前。 これは、DL/Iが要求されたセグメントを入れるアプリケーションプログラムの領域です。 |
4 |
Segment Search Arguments これらは、発行されたコールのタイプに応じたオプションのパラメーターです。 IMSデータベース内のデータセグメントを検索するために使用されます。 |
以下は、Callステートメントに関する注意点です-
- CBLTDLIは、 COBOL to DL/I の略です。 プログラムのオブジェクトモジュールとリンク編集されるインターフェイスモジュールの名前です。
- 各DL/I呼び出しの後、DLIはPCBにステータスコードを保存します。 プログラムはこのコードを使用して、呼び出しが成功したか失敗したかを判断できます。
例
COBOLの詳細については、COBOLチュートリアルhttp://www.finddevguides.com/cobol/index [こちら]をご覧ください。 次の例は、IMSデータベースおよびDL/I呼び出しを使用するCOBOLプログラムの構造を示しています。 次の章の例で使用される各パラメーターについて詳しく説明します。
IDENTIFICATION DIVISION.
PROGRAM-ID. TEST1.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 DLI-FUNCTIONS.
05 DLI-GU PIC X(4) VALUE 'GU '.
05 DLI-GHU PIC X(4) VALUE 'GHU '.
05 DLI-GN PIC X(4) VALUE 'GN '.
05 DLI-GHN PIC X(4) VALUE 'GHN '.
05 DLI-GNP PIC X(4) VALUE 'GNP '.
05 DLI-GHNP PIC X(4) VALUE 'GHNP'.
05 DLI-ISRT PIC X(4) VALUE 'ISRT'.
05 DLI-DLET PIC X(4) VALUE 'DLET'.
05 DLI-REPL PIC X(4) VALUE 'REPL'.
05 DLI-CHKP PIC X(4) VALUE 'CHKP'.
05 DLI-XRST PIC X(4) VALUE 'XRST'.
05 DLI-PCB PIC X(4) VALUE 'PCB '.
01 SEGMENT-I-O-AREA PIC X(150).
LINKAGE SECTION.
01 STUDENT-PCB-MASK.
05 STD-DBD-NAME PIC X(8).
05 STD-SEGMENT-LEVEL PIC XX.
05 STD-STATUS-CODE PIC XX.
05 STD-PROC-OPTIONS PIC X(4).
05 FILLER PIC S9(5) COMP.
05 STD-SEGMENT-NAME PIC X(8).
05 STD-KEY-LENGTH PIC S9(5) COMP.
05 STD-NUMB-SENS-SEGS PIC S9(5) COMP.
05 STD-KEY PIC X(11).
PROCEDURE DIVISION.
ENTRY 'DLITCBL' USING STUDENT-PCB-MASK.
A000-READ-PARA.
110-GET-INVENTORY-SEGMENT.
CALL ‘CBLTDLI’ USING DLI-GN
STUDENT-PCB-MASK
SEGMENT-I-O-AREA.
GOBACK.
IMS DB-DL/I関数
DL/I関数は、DL/I呼び出しで使用される最初のパラメーターです。 この関数は、IMS DL/I呼び出しによってIMSデータベースで実行される操作を通知します。 DL/I機能の構文は次のとおりです-
01 DLI-FUNCTIONS.
05 DLI-GU PIC X(4) VALUE 'GU '.
05 DLI-GHU PIC X(4) VALUE 'GHU '.
05 DLI-GN PIC X(4) VALUE 'GN '.
05 DLI-GHN PIC X(4) VALUE 'GHN '.
05 DLI-GNP PIC X(4) VALUE 'GNP '.
05 DLI-GHNP PIC X(4) VALUE 'GHNP'.
05 DLI-ISRT PIC X(4) VALUE 'ISRT'.
05 DLI-DLET PIC X(4) VALUE 'DLET'.
05 DLI-REPL PIC X(4) VALUE 'REPL'.
05 DLI-CHKP PIC X(4) VALUE 'CHKP'.
05 DLI-XRST PIC X(4) VALUE 'XRST'.
05 DLI-PCB PIC X(4) VALUE 'PCB '.
この構文は、次のキーポイントを表します-
- このパラメーターには、機能コードを保管する保管フィールドとして4文字の名前を指定できます。
- DL/I関数パラメーターは、COBOLプログラムの作業用ストレージセクションにコーディングされています。
- COBOLではCALLステートメントでリテラルをコーディングできないため、DL/I関数を指定するには、DL/I呼び出しでDLI-GUなどの05レベルのデータ名の1つをコーディングする必要があります。
- DL/I機能は、Get、Update、およびその他の機能の3つのカテゴリーに分類されます。 それぞれについて詳しく説明します。
関数を取得する
Get関数は、プログラミング言語でサポートされている読み取り操作に似ています。 Get関数は、IMS DL/Iデータベースからセグメントをフェッチするために使用されます。 次のGet関数は、IMS DBで使用されます-
- ユニークになる
- 次を取得
- 親内で次を取得
- ユニークなホールド
- 次にホールド
- 親内で次に保留
DL/I関数呼び出しを理解するために、次のIMSデータベース構造を考えてみましょう-
ユニークになる
「GU」コードは、Get Unique関数に使用されます。 COBOLのランダム読み取りステートメントと同様に機能します。 フィールド値に基づいて特定のセグメントオカレンスをフェッチするために使用されます。 フィールド値は、セグメント検索引数を使用して提供できます。 GU呼び出しの構文は次のとおりです-
CALL 'CBLTDLI' USING DLI-GU
PCB Mask
Segment I/O Area
[Segment Search Arguments]
COBOLプログラムのすべてのパラメーターに適切な値を指定して上記の呼び出しステートメントを実行すると、データベースからセグメントI/O領域のセグメントを取得できます。 上記の例では、Library、Magazines、Healthのフィールド値を指定すると、Healthセグメントの目的の出現を取得します。
次を取得
「GN」コードは、Get Next関数に使用されます。 COBOLのread nextステートメントと同様に機能します。 シーケンス内のセグメントオカレンスをフェッチするために使用されます。 データセグメントオカレンスにアクセスするための定義済みパターンは、階層を下に、次に左から右に向かっています。 GNコールの構文は次のとおりです-
CALL 'CBLTDLI' USING DLI-GN
PCB Mask
Segment I/O Area
[Segment Search Arguments]
COBOLプログラムのすべてのパラメーターに適切な値を指定して上記の呼び出しステートメントを実行すると、データベースからセグメントI/O領域のセグメントオカレンスを順番に取得できます。 上記の例では、ライブラリセグメントへのアクセスから始まり、次にブックスセグメントなどにアクセスします。 必要なセグメントオカレンスに到達するまで、GNコールを繰り返し実行します。
親内で次を取得
「GNP」コードは、親内の次の取得に使用されます。 この関数は、確立された親セグメントに従属するシーケンスでセグメントの出現を取得するために使用されます。 GNPコールの構文は次のとおりです-
CALL 'CBLTDLI' USING DLI-GNP
PCB Mask
Segment I/O Area
[Segment Search Arguments]
ユニークなホールド
「GHU」コードは、Get Hold Uniqueに使用されます。 ホールド機能は、取得後にセグメントを更新することを指定します。 Get Hold Unique関数は、Get Uniqueコールに対応しています。 GHU呼び出しの構文は次のとおりです-
CALL 'CBLTDLI' USING DLI-GHU
PCB Mask
Segment I/O Area
[Segment Search Arguments]
次にホールド
「GHN」コードは、Get Hold Nextに使用されます。 ホールド機能は、取得後にセグメントを更新することを指定します。 Get Hold Next関数は、Get Next呼び出しに対応しています。 以下は、GHN呼び出しの構文です-
CALL 'CBLTDLI' USING DLI-GHN
PCB Mask
Segment I/O Area
[Segment Search Arguments]
親内で次に保留
「GHNP」コードは、親内の「次を保持」に使用されます。 ホールド機能は、取得後にセグメントを更新することを指定します。 親内の次のホールドを取得関数は、親内の次の呼び出しに対応します。 以下は、GHNP呼び出しの構文です-
CALL 'CBLTDLI' USING DLI-GHNP
PCB Mask
Segment I/O Area
[Segment Search Arguments]
更新機能
更新関数は、他のプログラミング言語での書き換えまたは挿入操作に似ています。 更新機能は、IMS DL/Iデータベースのセグメントを更新するために使用されます。 更新機能を使用する前に、セグメントオカレンスのHold句を使用した呼び出しが成功する必要があります。 次の更新機能は、IMS DBで使用されます-
- インサート
- 削除する
- 交換する
インサート
「ISRT」コードは挿入機能に使用されます。 ISRT機能は、データベースに新しいセグメントを追加するために使用されます。 既存のデータベースの変更または新しいデータベースのロードに使用されます。 以下は、ISRT呼び出しの構文です-
CALL 'CBLTDLI' USING DLI-ISRT
PCB Mask
Segment I/O Area
[Segment Search Arguments]
削除する
「DLET」コードは、削除機能に使用されます。 IMS DL/Iデータベースからセグメントを削除するために使用されます。 以下に示すのは、DLET呼び出しの構文です-
CALL 'CBLTDLI' USING DLI-DLET
PCB Mask
Segment I/O Area
[Segment Search Arguments]
交換する
「REPL」コードは、親内で次を取得するために使用されます。 置換機能は、IMS DL/Iデータベース内のセグメントを置換するために使用されます。 以下は、REPL呼び出しの構文です-
CALL 'CBLTDLI' USING DLI-REPL
PCB Mask
Segment I/O Area
[Segment Search Arguments]
その他の機能
以下のその他の機能は、IMS DL/I呼び出しで使用されます-
- チェックポイント
- 再起動
- PCB
チェックポイント
「CHKP」コードは、チェックポイント機能に使用されます。 IMSのリカバリー機能で使用されます。 以下に示すのは、CHKP呼び出しの構文です-
CALL 'CBLTDLI' USING DLI-CHKP
PCB Mask
Segment I/O Area
[Segment Search Arguments]
再起動
「XRST」コードは、再起動機能に使用されます。 IMSの再始動機能で使用されます。 XRST呼び出しの構文は次のとおりです-
CALL 'CBLTDLI' USING DLI-XRST
PCB Mask
Segment I/O Area
[Segment Search Arguments]
PCB
PCB機能は、IMS DL/IデータベースのCICSプログラムで使用されます。 以下は、PCB呼び出しの構文です-
CALL 'CBLTDLI' USING DLI-PCB
PCB Mask
Segment I/O Area
[Segment Search Arguments]
これらの機能の詳細については、リカバリの章をご覧ください。
IMS DB-PCBマスク
PCBはProgram Communication Blockの略です。 PCB Maskは、DL/I呼び出しで使用される2番目のパラメーターです。 リンケージセクションで宣言されています。 以下は、PCBマスクの構文です-
01 PCB-NAME.
05 DBD-NAME PIC X(8).
05 SEG-LEVEL PIC XX.
05 STATUS-CODE PIC XX.
05 PROC-OPTIONS PIC X(4).
05 RESERVED-DLI PIC S9(5).
05 SEG-NAME PIC X(8).
05 LENGTH-FB-KEY PIC S9(5).
05 NUMB-SENS-SEGS PIC S9(5).
05 KEY-FB-AREA PIC X(n).
ここに注意する重要な点があります-
- DL/Iは、データベースごとに、プログラム通信ブロックと呼ばれるストレージ領域を維持します。 アプリケーションプログラム内でアクセスされるデータベースに関する情報を保存します。
- ENTRYステートメントは、リンケージセクションのPCBマスクとプログラムのPSB内のPCB間の接続を作成します。 DL/I呼び出しで使用されるPCBマスクは、操作に使用するデータベースを示します。
- これは、COBOL READステートメントでファイル名を指定するか、COBOL書き込みステートメントでレコード名を指定することに似ていると想定できます。 SELECT、ASSIGN、OPEN、またはCLOSEステートメントは不要です。
- 各DL/I呼び出しの後、DL/IはPCBに状況コードを保管し、プログラムはそのコードを使用して、呼び出しが成功したか失敗したかを判別できます。
PCB名
注意点-
- PCB Nameは、PCBフィールドの構造全体を指す領域の名前です。
- PCB名はプログラムステートメントで使用されます。
- PCB NameはPCBのフィールドではありません。
DBD名
注意点-
- DBD名には文字データが含まれます。 長さは8バイトです。
- PCBの最初のフィールドは処理中のデータベースの名前であり、特定のデータベースに関連付けられたデータベース記述のライブラリーからのDBD名を提供します。
セグメントレベル
注意点-
- セグメントレベルは、セグメント階層レベルインジケータと呼ばれます。 文字データが含まれており、長さは2バイトです。
- セグメントレベルフィールドには、処理されたセグメントのレベルが格納されます。 セグメントが正常に取得されると、取得されたセグメントのレベル番号がここに保存されます。
- セグメントレベルフィールドは、DL/Iデータベースで許可されるレベルの最大数であるため、15を超える値を持つことはありません。
状態コード
注意点-
- ステータスコードフィールドには、2バイトの文字データが含まれています。
- ステータスコードにはDL/Iステータスコードが含まれます。
- DL/Iが呼び出しの処理を正常に完了すると、スペースがステータスコードフィールドに移動します。
- スペース以外の値は、呼び出しが成功しなかったことを示します。
- ステータスコードGBはファイルの終わりを示し、ステータスコードGEは要求されたセグメントが見つからないことを示します。
処理オプション
注意点-
- Procオプションは、4文字のデータフィールドを含む処理オプションとして知られています。
- 処理オプションフィールドは、プログラムがデータベース上で実行を許可されている処理の種類を示します。
予約済みDL/I
注意点-
- 予約済みDL/Iは、IMSの予約済み領域として知られています。 4バイトのバイナリデータを格納します。
- IMSは、アプリケーションプログラムに関連する独自の内部リンクにこの領域を使用します。
セグメント名
注意点-
- SEG名は、セグメント名フィードバックエリアと呼ばれます。 8バイトの文字データが含まれています。
- セグメントの名前は、各DL/I呼び出しの後にこのフィールドに保存されます。
長さFBキー
注意点-
- 長さFBキーは、キーフィードバックエリアの長さとして知られています。 4バイトのバイナリデータを格納します。
- このフィールドは、前の呼び出し中に処理された最低レベルのセグメントの連結キーの長さを報告するために使用されます。
- キーフィードバックエリアで使用されます。
感度セグメントの数
注意点-
- 機密セグメントの数には、4バイトのバイナリデータが格納されます。
- アプリケーションプログラムがどのレベルに敏感かを定義します。 論理データ構造内のセグメント数のカウントを表します。
キーフィードバックエリア
注意点-
- 主要なフィードバック領域は、PCBごとに長さが異なります。
- データベースのプログラムビューで使用できる最長の連結キーが含まれています。
- データベース操作の後、DL/Iは、このフィールドで処理された最低レベルのセグメントの連結キーを返し、キー長フィードバック領域のキーの長さを返します。
IMS DB-SSA
SSAは、セグメント検索引数の略です。 SSAは、アクセスされているセグメントオカレンスを識別するために使用されます。 これはオプションのパラメーターです。 要件に応じて、任意の数のSSAを含めることができます。 SSAには2つのタイプがあります-
- 非修飾SSA
- 認定SSA
非修飾SSA
非修飾SSAは、呼び出し内で使用されているセグメントの名前を提供します。 以下は、非修飾SSAの構文です-
01 UNQUALIFIED-SSA.
05 SEGMENT-NAME PIC X(8).
05 FILLER PIC X VALUE SPACE.
資格のないSSAのキーポイントは次のとおりです-
- 基本的な非修飾SSAの長さは9バイトです。
- 最初の8バイトには、処理に使用されているセグメント名が保持されます。
- 最後のバイトには常にスペースが含まれます。
- DL/Iは、最後のバイトを使用してSSAのタイプを判別します。
- 特定のセグメントにアクセスするには、「セグメント名」フィールドでセグメントの名前を移動します。
次の画像は、非修飾および修飾SSAの構造を示しています-
認定SSA
認定SSAは、セグメントの特定のデータベースオカレンスをセグメントタイプに提供します。 以下は、認定SSAの構文です-
01 QUALIFIED-SSA.
05 SEGMENT-NAME PIC X(8).
05 FILLER PIC X(01) VALUE '('.
05 FIELD-NAME PIC X(8).
05 REL-OPR PIC X(2).
05 SEARCH-VALUE PIC X(n).
05 FILLER PIC X(n+1) VALUE ')'.
資格のあるSSAのキーポイントは次のとおりです-
- 修飾されたSSAの最初の8バイトには、処理に使用されているセグメント名が保持されます。
- 9番目のバイトは左括弧「(」です。
- 10番目の位置から始まる次の8バイトは、検索するフィールド名を指定します。
- 18 ^ th ^および19 ^ th ^の位置のフィールド名の後に、2文字の関係演算子コードを指定します。
- 次に、フィールド値を指定し、最後のバイトに右括弧「)」があります。
次の表は、認定SSAで使用される関係演算子を示しています。
Relational Operator | Symbol | Description |
---|---|---|
EQ | = | Equal |
NE | ~= ˜ | Not equal |
GT | > | Greater than |
GE | >= | Greater than or equal |
LT | << | Less than |
LE | ⇐ | Less than or equal |
コマンドコード
コマンドコードは、DL/I呼び出しの機能を強化するために使用されます。 コマンドコードはDL/I呼び出しの数を減らし、プログラムを単純にします。 また、呼び出しの数が減るため、パフォーマンスが向上します。 次の図は、非修飾および修飾SSAでのコマンドコードの使用方法を示しています-
コマンドコードのキーポイントは次のとおりです-
- コマンドコードを使用するには、上の図に示すように、SSAの9番目の位置にアスタリスクを指定します。
- コマンドコードは10番目の位置にコーディングされます。
- 10 ^ th ^位置以降、DL/Iは、非修飾SSAのスペースと修飾SSAの左括弧に遭遇するまで、すべての文字をコマンドコードと見なします。
次の表は、SSAで使用されるコマンドコードのリストを示しています-
Command Code | Description |
---|---|
C | Concatenated Key |
D | Path Call |
F | First Occurrence |
L | Last Occurrence |
N | Path Call Ignore |
P | Set Parentage |
Q | Enqueue Segment |
U | Maintain Position at this level |
V | Maintain Position at this and all above levels |
- | Null Command Code |
複数の資格
複数の資格の基本的なポイントは次のとおりです-
- 比較のために2つ以上の資格またはフィールドを使用する必要がある場合、複数の資格が必要です。
- ANDやORなどのブール演算子を使用して、2つ以上の資格を接続します。
- 単一フィールドの可能な値の範囲に基づいてセグメントを処理する場合、複数の資格を使用できます。
以下は、複数の資格の構文です-
01 QUALIFIED-SSA.
05 SEGMENT-NAME PIC X(8).
05 FILLER PIC X(01) VALUE '('.
05 FIELD-NAME1 PIC X(8).
05 REL-OPR PIC X(2).
05 SEARCH-VALUE1 PIC X(m).
05 MUL-QUAL PIC X VALUE '&'.
05 FIELD-NAME2 PIC X(8).
05 REL-OPR PIC X(2).
05 SEARCH-VALUE2 PIC X(n).
05 FILLER PIC X(n+1) VALUE ')'.
MUL-QUALは、MULtiple QUALIificationの短期語で、ANDやORなどのブール演算子を提供できます。
IMS DB-データ検索
IMS DL/I呼び出しで使用されるさまざまなデータ取得方法は次のとおりです-
- GUコール
- GNコール
- コマンドコードの使用
- 複数処理
データ取得関数の呼び出しを理解するために、次のIMSデータベース構造を考えてみましょう-
GUコール
GU呼び出しの基本は次のとおりです-
- GU呼び出しは、Get Unique呼び出しとして知られています。 ランダム処理に使用されます。
- アプリケーションがデータベースを定期的に更新しない場合、またはデータベースの更新回数が少ない場合、ランダム処理を使用します。
- GU呼び出しは、ポインターを特定の位置に配置して、さらに順次検索するために使用されます。
- GU呼び出しは、以前の呼び出しで確立されたポインター位置とは無関係です。
- GU呼び出し処理は、呼び出しステートメントで提供される一意のキーフィールドに基づいています。
- 一意でないキーフィールドを指定すると、DL/Iはキーフィールドの最初のセグメントオカレンスを返します。
CALL 'CBLTDLI' USING DLI-GU
PCB-NAME
IO-AREA
LIBRARY-SSA
BOOKS-SSA
ENGINEERING-SSA
IT-SSA
上記の例は、修飾されたSSAの完全なセットを提供することによりGU呼び出しを発行することを示しています。 ルートレベルから取得するセグメントオカレンスまでのすべてのキーフィールドが含まれます。
GU呼び出しの考慮事項
呼び出しで修飾されたSSAの完全なセットを提供しない場合、DL/Iは次のように動作します-
- GU呼び出しで非修飾SSAを使用すると、DL/Iは、指定した基準を満たすデータベース内の最初のセグメントオカレンスにアクセスします。
- SSAなしでGU呼び出しを発行すると、DL/Iはデータベース内でルートセグメントの最初の発生を返します。 *中間レベルの一部のSSAが呼び出しで言及されていない場合、DL/Iは、セグメントの非修飾SSAの確立された位置またはデフォルト値を使用します。
状態コード
次の表は、GU呼び出し後の関連するステータスコードを示しています-
S.No | Status Code & Description |
---|---|
1 |
成功した呼び出し |
2 |
GE DL/Iは、呼び出しで指定された基準を満たすセグメントを見つけることができませんでした |
GNコール
GNコールの基本は次のとおりです-
- GNコールはGet Nextコールとして知られています。 基本的な順次処理に使用されます。
- データベース内のポインタの初期位置は、最初のデータベースレコードのルートセグメントの前です。
- データベースポインターの位置は、GN呼び出しが成功した後、シーケンス内の次のセグメントが発生する前です。
- GN呼び出しは、以前の呼び出しで確立された位置からデータベースを介して開始されます。
- GNコールが非修飾の場合、そのタイプに関係なく、データベース内の次のセグメントオカレンスを階層順に返します。 *GN呼び出しにSSAが含まれる場合、DL/Iは、指定されたすべてのSSAの要件を満たすセグメントのみを取得します。
CALL 'CBLTDLI' USING DLI-GN
PCB-NAME
IO-AREA
BOOKS-SSA
上記の例は、レコードを順番に読み取るための開始位置を提供するGN呼び出しを発行することを示しています。 BOOKSセグメントの最初の出現をフェッチします。
状態コード
次の表は、GNコール後の関連するステータスコードを示しています-
S.No | Status Code & Description |
---|---|
1 |
成功した呼び出し |
2 |
GE DL/Iは、呼び出しで指定された基準を満たすセグメントを見つけることができませんでした。 |
3 |
GA 修飾されていないGN呼び出しは、セグメントをフェッチするためにデータベース階層内で1レベル上に移動します。 |
4 |
GB データベースの終わりに達し、セグメントが見つかりません。 |
GK 修飾されていないGN呼び出しは、取得したセグメント以外の特定のタイプのセグメントを取得しようとしますが、同じ階層レベルのままです。 |
コマンドコード
コマンドコードは、セグメントオカレンスをフェッチする呼び出しで使用されます。 呼び出しで使用されるさまざまなコマンドコードを以下に説明します。
Fコマンドコード
注意点-
- Fコマンドコードが呼び出しで指定されると、呼び出しはセグメントの最初の出現を処理します。
- Fコマンドコードは、シーケンシャルに処理するときに使用でき、GNコールおよびGNPコールで使用できます。
- GU呼び出しでFコマンドコードを指定した場合、GU呼び出しはデフォルトで最初のセグメントオカレンスをフェッチするため、意味はありません。
Lコマンドコード
注意点-
- Lコマンドコードが呼び出しで指定されると、呼び出しはセグメントの最後の発生を処理します。
- Lコマンドコードは、シーケンシャルに処理する場合に使用でき、GNコールおよびGNPコールで使用できます。
Dコマンドコード
注意点-
- Dコマンドコードは、1回の呼び出しで複数のセグメントを取得するために使用されます。
- 通常、DL/IはSSAで指定された最低レベルのセグメントで動作しますが、多くの場合、他のレベルのデータも必要です。 そのような場合、Dコマンドコードを使用できます。
- Dコマンドコードを使用すると、セグメントのパス全体を簡単に取得できます。
Cコマンドコード
注意点-
- Cコマンドコードは、キーを連結するために使用されます。
- フィールド名、関係演算子、検索値を指定する必要があるため、関係演算子の使用は少し複雑です。 代わりに、Cコマンドコードを使用して連結キーを提供できます。
次の例は、Cコマンドコードの使用を示しています-
01 LOCATION-SSA.
05 FILLER PIC X(11) VALUE ‘INLOCSEG*C(‘.
05 LIBRARY-SSA PIC X(5).
05 BOOKS-SSA PIC X(4).
05 ENGINEERING-SSA PIC X(6).
05 IT-SSA PIC X(3)
05 FILLER PIC X VALUE ‘)’.
CALL 'CBLTDLI' USING DLI-GU
PCB-NAME
IO-AREA
LOCATION-SSA
Pコマンドコード
注意点-
- GUまたはGN呼び出しを発行すると、DL/Iは取得された最低レベルのセグメントで親子関係を確立します。
- Pコマンドコードを含めると、DL/Iは、階層パスの上位レベルセグメントで親子関係を確立します。
Uコマンドコード
注意点-
- GN呼び出しの非修飾SSAでUコマンドコードが指定されている場合、DL/Iはセグメントの検索を制限します。
- Uコマンドコードは、修飾されたSSAで使用される場合、無視されます。
Vコマンドコード
注意点-
- VコマンドコードはUコマンドコードと同様に機能しますが、特定のレベルおよび階層の上のすべてのレベルでセグメントの検索を制限します。
- Vコマンドコードは、修飾されたSSAで使用されると無視されます。
Qコマンドコード
注意点-
- Qコマンドコードは、アプリケーションプログラム専用のセグメントをエンキューまたは予約するために使用されます。
- Qコマンドコードは、別のプログラムがセグメントに変更を加える可能性がある対話型環境で使用されます。
複数処理
プログラムは、IMSデータベース内で複数処理と呼ばれる複数の位置を持つことができます。 複数の処理は2つの方法で行うことができます-
- 複数のPCB
- 複数の位置決め
複数のPCB
単一のデータベースに対して複数のPCBを定義できます。 複数のPCBがある場合、アプリケーションプログラムは異なるビューを持つことができます。 複数の処理を実装するこの方法は、余分なPCBによって課せられるオーバーヘッドのために非効率的です。
複数の位置決め
プログラムは、単一のPCBを使用してデータベース内の複数の位置を維持できます。 これは、階層パスごとに異なる位置を維持することで実現されます。 複数の位置決めを使用して、2つ以上のタイプのセグメントに同時に順次アクセスします。
IMS DB-データ操作
IMS DL/I呼び出しで使用されるさまざまなデータ操作方法は次のとおりです-
- ISRTコール
- 保留コールを取得
- REPLコール
- DLETコール
データ操作関数の呼び出しを理解するために、次のIMSデータベース構造を考えてみましょう-
ISRTコール
注意点-
- ISRT呼び出しは挿入呼び出しとして知られ、データベースにセグメントオカレンスを追加するために使用されます。
- ISRT呼び出しは、新しいデータベースのロードに使用されます。
- セグメント記述フィールドにデータがロードされると、ISRT呼び出しを発行します。
- DL/Iがセグメントオカレンスを配置する場所を知るために、非修飾または修飾SSAを呼び出しで指定する必要があります。
- コールでは、非修飾SSAと修飾SSAの両方の組み合わせを使用できます。 上記のすべてのレベルに対して、認定されたSSAを指定できます。 私たちは次の例を考えてみましょう-
CALL 'CBLTDLI' USING DLI-ISRT
PCB-NAME
IO-AREA
LIBRARY-SSA
BOOKS-SSA
UNQUALIFIED-ENGINEERING-SSA
上記の例は、修飾SSAと非修飾SSAの組み合わせを提供することによりISRT呼び出しを発行していることを示しています。
挿入する新しいセグメントに一意のキーフィールドがある場合、適切な位置に追加されます。 キーフィールドが一意でない場合、データベース管理者によって定義されたルールによって追加されます。
キーフィールドを指定せずにISRT呼び出しを発行すると、挿入ルールは、既存のツインセグメントに対してセグメントを配置する場所を指示します。 以下に挿入ルールがあります-
- 最初-ルールが最初の場合、既存の双子の前に新しいセグメントが追加されます。
- 最後-ルールが最後の場合、既存のすべての双子の後に新しいセグメントが追加されます。
- ここ-ルールがここにある場合、既存の双子に対して現在の位置に追加されます。双子は最初、最後、またはどこでもかまいません。
状態コード
次の表は、ISRT呼び出し後の関連するステータスコードを示しています-
S.No | Status Code & Description |
---|---|
1 |
Spaces 成功した呼び出し |
2 |
GE 複数のSSAが使用され、DL/Iは指定されたパスで呼び出しを満たすことができません。 |
3 |
II データベースにすでに存在するセグメントオカレンスを追加してみてください。 |
4 |
LB/LC LD/LE ロード処理中にこれらのステータスコードを取得します。 ほとんどの場合、正確な階層シーケンスでセグメントを挿入していないことを示しています。 |
保留コールを取得
注意点-
- DL/I呼び出しで指定するGet Hold呼び出しには3つのタイプがあります。
- ホールドユニーク(GHU)
- ホールドネクスト(GHN)
- 親内で次に保留(GHNP)
- ホールド機能は、取得後にセグメントを更新することを指定します。 したがって、REPLまたはDLET呼び出しの前に、データベースを更新する意図をDL/Iに伝える正常な保留呼び出しを発行する必要があります。
REPLコール
注意点-
- get hold呼び出しが成功した後、REPL呼び出しを発行してセグメントオカレンスを更新します。
- REPL呼び出しを使用してセグメントの長さを変更することはできません。
- REPL呼び出しを使用してキーフィールドの値を変更することはできません。
- REPL呼び出しで修飾SSAを使用することはできません。 修飾されたSSAを指定すると、呼び出しは失敗します。
CALL 'CBLTDLI' USING DLI-GHU
PCB-NAME
IO-AREA
LIBRARY-SSA
BOOKS-SSA
ENGINEERING-SSA
IT-SSA.
*Move the values which you want to update in IT segment occurrence*
CALL ‘CBLTDLI’ USING DLI-REPL
PCB-NAME
IO-AREA.
上記の例は、REPL呼び出しを使用してITセグメントの発生を更新します。 まず、GHU呼び出しを発行して、更新するセグメントオカレンスを取得します。 次に、REPL呼び出しを発行して、そのセグメントの値を更新します。
DLETコール
注意点-
- DLET呼び出しは、REPL呼び出しと同じように機能します。
- get hold呼び出しが成功した後、DLET呼び出しを発行してセグメントオカレンスを削除します。 *資格のあるSSAをDLET呼び出しで使用することはできません。 修飾されたSSAを指定すると、呼び出しは失敗します。
CALL 'CBLTDLI' USING DLI-GHU
PCB-NAME
IO-AREA
LIBRARY-SSA
BOOKS-SSA
ENGINEERING-SSA
IT-SSA.
CALL ‘CBLTDLI’ USING DLI-DLET
PCB-NAME
IO-AREA.
上記の例では、DLET呼び出しを使用してITセグメントの出現を削除します。 まず、GHU呼び出しを発行して、削除するセグメントオカレンスを取得します。 次に、DLET呼び出しを発行して、そのセグメントの値を更新します。
状態コード
次の表は、REPLまたはDLET呼び出し後の関連するステータスコードを示しています-
S.No | Status Code & Description |
---|---|
1 |
成功した呼び出し |
2 |
AJ REPLまたはDLET呼び出しで使用される認定SSA。 |
3 |
DJ プログラムは、直前のget hold呼び出しなしでreplace呼び出しを発行します。 |
4 |
DA プログラムは、REPLまたはDLET呼び出しを発行する前に、セグメントのキーフィールドを変更します |
IMS DB-二次索引付け
完全な連結キーを使用せずにデータベースにアクセスする場合、またはシーケンスのプライマリフィールドを使用しない場合は、セカンダリインデックスが使用されます。
インデックスポインターセグメント
DL/Iは、インデックス付きデータベースのセグメントへのポインターを別のデータベースに保存します。 インデックスポインタセグメントは、セカンダリインデックスの唯一のタイプです。 それは2つの部分で構成されています-
- プレフィックス要素
- {ブランク}
- データ要素
プレフィックス要素
インデックスポインターセグメントのプレフィックス部分には、インデックスターゲットセグメントへのポインターが含まれます。 インデックスターゲットセグメントは、セカンダリインデックスを使用してアクセス可能なセグメントです。
データ要素
データ要素には、インデックスが作成されるインデックス付きデータベースのセグメントのキー値が含まれます。 これは、インデックスソースセグメントとも呼ばれます。
セカンダリインデックス作成に関する注意事項は次のとおりです-
- インデックスソースセグメントとターゲットソースセグメントは同じである必要はありません。
- セカンダリインデックスを設定すると、DL/Iによって自動的に維持されます。
- DBAは、複数のアクセスパスごとに多くのセカンダリインデックスを定義します。 これらのセカンダリインデックスは、別のインデックスデータベースに格納されます。
- セカンダリインデックスはDL/Iに追加の処理オーバーヘッドを課すため、これ以上作成しないでください。
二次キー
注意点-
- セカンダリインデックスが構築されるインデックスソースセグメントのフィールドは、セカンダリキーと呼ばれます。
- 任意のフィールドをセカンダリキーとして使用できます。 セグメントシーケンスフィールドである必要はありません。
- セカンダリキーは、インデックスソースセグメント内の単一フィールドの任意の組み合わせにすることができます。
- セカンダリキーの値は一意である必要はありません。
二次データ構造
注意点-
- セカンダリインデックスを作成すると、データベースの見かけの階層構造も変更されます。
- インデックスターゲットセグメントが見かけのルートセグメントになります。 次の図に示すように、エンジニアリングセグメントは、たとえルートセグメントでなくてもルートセグメントになります。
- セカンダリインデックスによって引き起こされるデータベース構造の再配置は、セカンダリデータ構造として知られています。
- セカンダリデータ構造は、ディスク上に存在するメインの物理データベース構造を変更しません。 これは、アプリケーションプログラムの前にあるデータベース構造を変更する方法にすぎません。
独立したAND演算子
注意点-
- AND(*または&)演算子をセカンダリインデックスで使用する場合、依存AND演算子と呼ばれます。
- 独立したAND(#)を使用すると、依存ANDでは不可能な資格を指定できます。
- この演算子は、インデックスソースセグメントがインデックスターゲットセグメントに依存しているセカンダリインデックスにのみ使用できます。
- 独立したANDでSSAをコーディングして、2つ以上の依存ソースセグメントのフィールドに基づいてターゲットセグメントのオカレンスを処理するように指定できます。
01 ITEM-SELECTION-SSA.
05 FILLER PIC X(8).
05 FILLER PIC X(1) VALUE '('.
05 FILLER PIC X(10).
05 SSA-KEY-1 PIC X(8).
05 FILLER PIC X VALUE '#'.
05 FILLER PIC X(10).
05 SSA-KEY-2 PIC X(8).
05 FILLER PIC X VALUE ')'.
スパースシーケンス
注意点-
- スパースシーケンスは、スパースインデックス処理とも呼ばれます。 セカンダリインデックスデータベースを使用したスパースシーケンスを使用して、インデックスソースセグメントの一部をインデックスから削除できます。
- スパースシーケンスは、パフォーマンスを向上させるために使用されます。 インデックスソースセグメントの一部のオカレンスが使用されない場合、それを削除できます。
- DL/Iは、抑制値または抑制ルーチン、あるいはその両方を使用して、セグメントにインデックスを付けるかどうかを決定します。
- インデックスソースセグメントのシーケンスフィールドの値が抑制値と一致する場合、インデックス関係は確立されません。
- 抑制ルーチンは、セグメントを評価し、インデックスを作成するかどうかを決定するユーザー作成プログラムです。
- 疎索引付けが使用される場合、その機能はDL/Iによって処理されます。 アプリケーションプログラムで特別な準備をする必要はありません。
DBDGEN要件
前のモジュールで説明したように、DBDGENはDBDの作成に使用されます。 セカンダリインデックスを作成する場合、2つのデータベースが関係します。 DBAは、インデックス付きデータベースとセカンダリインデックス付きデータベースの間の関係を作成するために、2つのDBDGENを使用して2つのDBDを作成する必要があります。
PSBGENの要件
データベースのセカンダリインデックスを作成した後、DBAはPSBを作成する必要があります。 プログラムのPSBGENは、PSBマクロのPROCSEQパラメーターでデータベースの適切な処理シーケンスを指定します。 PROCSEQパラメーターの場合、DBAは2次索引データベースのDBD名をコーディングします。
IMS DB-論理データベース
IMSデータベースには、各セグメントタイプは1つの親しか持つことができないというルールがあります。 これにより、物理データベースの複雑さが制限されます。 多くのDL/Iアプリケーションでは、セグメントに2つの親セグメントタイプを持たせることができる複雑な構造が必要です。 この制限を克服するために、DL/Iでは、DBAは、セグメントが物理的および論理的な親を持つことができる論理関係を実装できます。 1つの物理データベース内に追加の関係を作成できます。 論理関係を実装した後の新しいデータ構造は、論理データベースと呼ばれます。
論理関係
論理的な関係には、次のプロパティがあります-
- 論理関係は、物理的にではなく論理的に関連付けられた2つのセグメント間のパスです。
- 通常、別々のデータベース間で論理的な関係が確立されます。 ただし、特定のデータベースのセグメント間で関係を持つことは可能です。
次の図は、2つの異なるデータベースを示しています。 1つは学生データベースで、もう1つは図書館データベースです。 StudentデータベースのBooks発行セグメントとLibraryデータベースのBooksセグメントの間に論理的な関係を作成します。
これは、論理関係を作成するときに論理データベースがどのように見えるかです-
論理子セグメント
論理子セグメントは、論理関係の基礎です。 これは物理データセグメントですが、DL/Iの場合、2つの親があるように見えます。 上記の例のBooksセグメントには、2つの親セグメントがあります。 発行された本のセグメントは論理的な親であり、図書館のセグメントは物理的な親です。 1つの論理子セグメントオカレンスには1つの論理親セグメントオカレンスのみがあり、1つの論理親セグメントオカレンスには多くの論理子セグメントオカレンスを含めることができます。
論理双子
論理双子は、論理子セグメントタイプのオカレンスであり、すべて論理親セグメントタイプの単一オカレンスに従属します。 DL/Iは、論理子セグメントを実際の物理子セグメントのように見せます。 これは、仮想論理子セグメントとも呼ばれます。
論理関係の種類
DBAは、セグメント間に論理的な関係を作成します。 論理関係を実装するには、DBAは関係する物理データベースのDBDGENでそれを指定する必要があります。 論理関係には3つのタイプがあります-
- 一方向
- 双方向仮想
- 双方向の物理
一方向
論理的な接続は、論理的な子から論理的な親へと進み、その逆はできません。
双方向仮想
双方向にアクセスできます。 物理構造内の論理子と対応する仮想論理子は、ペアのセグメントとして見ることができます。
双方向の物理
論理子は、物理的および論理的な親の両方に物理的に格納された従属です。 アプリケーションプログラムから見ると、双方向の仮想論理子と同じように見えます。
プログラミングの考慮事項
論理データベースを使用するためのプログラミングの考慮事項は次のとおりです-
- データベースにアクセスするためのDL/I呼び出しは、論理データベースでも同じままです。
- プログラム仕様ブロックは、呼び出しで使用する構造を示します。 場合によっては、論理データベースを使用していることを特定できません。
- 論理関係は、データベースプログラミングに新しい次元を追加します。
- 2つのデータベースが統合されているため、論理データベースでの作業には注意が必要です。 1つのデータベースを変更する場合、同じ変更を他のデータベースに反映する必要があります。
- プログラム仕様は、データベースで許可される処理を示す必要があります。 処理ルールに違反すると、非空白のステータスコードが表示されます。
連結セグメント
論理子セグメントは常に、宛先親の完全に連結されたキーで始まります。 これは、Destination Parent Concatenated Key(DPCK)と呼ばれます。 論理子のセグメントI/O領域の開始時にDPCKを常にコーディングする必要があります。 論理データベースでは、連結されたセグメントは、異なる物理データベースで定義されたセグメント間の接続を確立します。 連結セグメントは、次の2つの部分で構成されています-
- 論理子セグメント
- 宛先親セグメント
論理的な子セグメントは、次の2つの部分で構成されています-
- 宛先親連結キー(DPCK)
- 論理子ユーザーデータ
更新中に連結されたセグメントを操作する場合、1回の呼び出しで論理子と宛先親の両方のデータを追加または変更できる場合があります。 これは、DBAがデータベースに指定したルールにも依存します。 挿入の場合、正しい位置にDPCKを提供します。 置換または削除の場合、連結セグメントのいずれかの部分でDPCKまたはシーケンスフィールドデータを変更しないでください。
IMS DB-リカバリー
データベース管理者は、システム障害が発生した場合のデータベースの回復を計画する必要があります。 障害には、アプリケーションのクラッシュ、ハードウェアエラー、停電など、さまざまな種類があります。
シンプルなアプローチ
データベースの回復へのいくつかの簡単なアプローチは次のとおりです-
- データセットに対して投稿されたすべてのトランザクションが保持されるように、重要なデータセットの定期的なバックアップコピーを作成します。
- システム障害が原因でデータセットが破損した場合、その問題はバックアップコピーを復元することで修正されます。 その後、蓄積されたトランザクションはバックアップコピーに再ポストされ、最新の状態になります。
シンプルなアプローチの欠点
データベースの回復への単純なアプローチの欠点は次のとおりです-
- 蓄積されたトランザクションの再転記には多くの時間がかかります。
- 他のすべてのアプリケーションは、回復が完了するまで実行を待機する必要があります。
- 論理インデックスとセカンダリインデックスの関係が関係している場合、データベースの回復はファイルの回復よりも長くなります。
異常終了ルーチン
DL/Iプログラムはオペレーティングシステムによって直接実行されますが、DL/Iプログラムはそうではないため、標準プログラムがクラッシュする方法とは異なる方法でDL/Iプログラムがクラッシュします。 異常終了ルーチンを使用することにより、システムが干渉し、異常終了(ABEND)の後にリカバリーを実行できるようになります。 異常終了ルーチンは、次のアクションを実行します-
- すべてのデータセットを閉じます
- キュー内のすべての保留中のジョブをキャンセルします
- ストレージダンプを作成して、異常終了の根本原因を見つけます。
このルーチンの制限は、使用中のデータが正確かどうかを保証しないことです。
DL/Iログ
アプリケーションプログラムが異常終了した場合、アプリケーションプログラムによって行われた変更を元に戻し、エラーを修正し、アプリケーションプログラムを再実行する必要があります。 これを行うには、DL/Iログが必要です。 DL/Iロギングに関する重要なポイントは次のとおりです-
- DL/Iは、アプリケーションプログラムによって行われたすべての変更をログファイルと呼ばれるファイルに記録します。
- アプリケーションプログラムがセグメントを変更すると、その前のイメージと後のイメージがDL/Iによって作成されます。
- これらのセグメントイメージは、アプリケーションプログラムがクラッシュした場合にセグメントを復元するために使用できます。
- DL/Iは、「先書きロギング」と呼ばれる手法を使用して、データベースの変更を記録します。 先行書き込みロギングでは、データベースの変更は実際のデータセットに書き込まれる前にログデータセットに書き込まれます。
- ログは常にデータベースよりも先にあるため、回復ユーティリティはデータベースの変更のステータスを判断できます。
- プログラムがデータベースセグメントを変更するための呼び出しを実行すると、DL/Iがロギング部分を処理します。
回復-前方および後方
データベース回復の2つのアプローチは次のとおりです-
- フォワードリカバリ-DL/Iはログファイルを使用して変更データを保存します。 蓄積されたトランザクションは、このログファイルを使用して再ポストされます。
- バックワードリカバリ-バックワードリカバリはバックアウトリカバリとも呼ばれます。 プログラムのログレコードは逆方向に読み取られ、データベース内での効果は逆になります。 バックアウトが完了すると、データベースは、その前に別のアプリケーションプログラムによってデータベースが変更されていないと仮定して、障害発生前と同じ状態になります。
チェックポイント
チェックポイントは、アプリケーションプログラムによって行われたデータベースの変更が完全かつ正確であると見なされる段階です。 以下にリストされているのは、チェックポイントに関する注意点です-
- 最新のチェックポイントの前に行われたデータベースの変更は、逆方向回復によって元に戻されません。
- 最新のチェックポイント後にログに記録されたデータベースの変更は、フォワードリカバリ中にデータベースのイメージコピーに適用されません。
- チェックポイント方式を使用すると、回復プロセスが完了すると、データベースは最新のチェックポイントの状態に復元されます。
- バッチプログラムのデフォルトでは、チェックポイントはプログラムの始まりです。
- チェックポイントは、チェックポイントコール(CHKP)を使用して確立できます。
- チェックポイント呼び出しにより、チェックポイントレコードがDL/Iログに書き込まれます。
以下に示すのは、CHKP呼び出しの構文です-
CALL 'CBLTDLI' USING DLI-CHKP
PCB-NAME
CHECKPOINT-ID
2つのチェックポイント方式があります-
- Basic Checkpointing -DL/Iリカバリユーティリティがリカバリ処理中に使用するチェックポイントコールを発行できるようにします。
- シンボリックチェックポイント-拡張リスタート機能と組み合わせて使用されるチェックポイントの高度な形式です。 シンボリックチェックポイント設定と拡張再起動により、アプリケーションプログラマはチェックポイントの直後に処理を再開できるようにプログラムをコーディングできます。