- IMS DB 基礎教程
- IMS DB - 首頁
- IMS DB - 概述
- IMS DB - 結構
- IMS DB - DL/I 術語
- IMS DB - DL/I 處理
- IMS DB - 控制塊
- IMS DB - 程式設計
- IMS DB - Cobol 基礎
- IMS DB - DL/I 函式
- IMS DB - PCB 掩碼
- IMS DB - SSA
- IMS DB - 資料檢索
- IMS DB - 資料操作
- IMS DB - 二級索引
- IMS DB - 邏輯資料庫
- IMS DB - 恢復
- IMS DB 有用資源
- IMS DB - 問答
- IMS DB 快速指南
- IMS DB - 有用資源
IMS DB 快速指南
IMS DB - 概述
簡要概述
資料庫是相關資料項的集合。這些資料項以一種提供快速便捷訪問的方式進行組織和儲存。IMS 資料庫是一種層次資料庫,其中資料儲存在不同級別,並且每個實體都依賴於更高級別的實體。使用 IMS 的應用程式系統的物理元素如下圖所示。
資料庫管理
資料庫管理系統是一組用於儲存、訪問和管理資料庫中資料的應用程式。IMS 資料庫管理系統透過以易於檢索的方式組織資料來維護完整性和允許快速恢復資料。IMS 在其資料庫管理系統的幫助下維護著世界上大量企業資料。
事務管理器
事務管理器的功能是在資料庫和應用程式程式之間提供通訊平臺。IMS 充當事務管理器。事務管理器與終端使用者互動,以從資料庫中儲存和檢索資料。IMS 可以使用 IMS DB 或 DB2 作為其後端資料庫來儲存資料。
DL/I – 資料語言介面
DL/I 包含允許訪問儲存在資料庫中的資料的應用程式程式。IMS DB 使用 DL/I,它充當程式設計師在應用程式程式中用於訪問資料庫的介面語言。我們將在接下來的章節中更詳細地討論這一點。
IMS 的特性
需要注意的要點 -
- IMS 支援來自不同語言(如 Java 和 XML)的應用程式。
- IMS 應用程式和資料可以透過任何平臺訪問。
- 與 DB2 相比,IMS DB 處理速度非常快。
IMS 的侷限性
需要注意的要點 -
- IMS DB 的實現非常複雜。
- IMS 預定義的樹結構降低了靈活性。
- IMS DB 難以管理。
IMS DB - 結構
層次結構
IMS 資料庫是容納物理檔案的資料庫的集合。在層次資料庫中,最頂層包含有關實體的一般資訊。當我們從頂層到層次結構的底層時,我們獲得了越來越多的有關實體的資訊。
層次結構中的每個級別都包含段。在標準檔案中,很難實現層次結構,但 DL/I 支援層次結構。下圖描繪了 IMS DB 的結構。
段
需要注意的要點 -
透過將類似資料組合在一起建立段。
它是 DL/I 在任何輸入/輸出操作期間傳輸到應用程式程式和從應用程式程式傳輸的最小的資訊單元。
一個段可以包含一個或多個組合在一起的資料欄位。
在下面的示例中,段 Student 有四個資料欄位。
| 學生 | |||
|---|---|---|---|
| 學號 | 姓名 | 課程 | 手機號碼 |
欄位
需要注意的要點 -
欄位是段中的單個數據片段。例如,學號、姓名、課程和手機號碼是學生段中的單個欄位。
一個段由相關的欄位組成,以收集有關實體的資訊。
欄位可以用作對段進行排序的鍵。
欄位可以用作限定符來搜尋有關特定段的資訊。
段型別
需要注意的要點 -
段型別是段中資料的類別。
DL/I 資料庫可以有 255 種不同的段型別和 15 個層次級別。
在下圖中,有三個段,即圖書館、書籍資訊和學生資訊。
段出現
需要注意的要點 -
段出現是指包含使用者資料的特定型別的單個段。在上面的示例中,書籍資訊是一種段型別,它可以有任意數量的出現,因為它可以儲存有關任意數量書籍的資訊。
在 IMS 資料庫中,每種段型別只有一個出現,但每種段型別可以有無限數量的出現。
IMS DB - DL/I 術語
層次資料庫基於兩個或多個段之間的關係。以下示例顯示了段如何在 IMS 資料庫結構中相互關聯。
根段
需要注意的要點 -
位於層次結構頂部的段稱為根段。
根段是訪問所有從屬段的唯一段。
根段是資料庫中唯一永遠不是子段的段。
IMS 資料庫結構中只能有一個根段。
例如,在上面的示例中,'A' 是根段。
父段
需要注意的要點 -
父段在其下方直接具有一個或多個從屬段。
例如,'A'、'B' 和 'E' 是上面示例中的父段。
從屬段
需要注意的要點 -
除根段之外的所有段都稱為從屬段。
從屬段依賴於一個或多個段來呈現完整含義。
例如,'B'、'C1'、'C2'、'D'、'E'、'F1' 和 'F2' 是我們示例中的從屬段。
子段
需要注意的要點 -
在層次結構中在其上方直接具有段的任何段都稱為子段。
結構中的每個從屬段都是子段。
例如,'B'、'C1'、'C2'、'D'、'E'、'F1' 和 'F2' 是子段。
孿生段
需要注意的要點 -
在單個父段下特定段型別的兩個或多個段出現稱為孿生段。
例如,'C1' 和 'C2' 是孿生段,'F1' 和 'F2' 也是。
兄弟段
需要注意的要點 -
兄弟段是不同型別的段,並且具有相同的父段。
例如,'B' 和 'E' 是兄弟段。同樣,'C1'、'C2' 和 'D' 是兄弟段。
資料庫記錄
需要注意的要點 -
根段的每個出現加上所有下級段出現構成一個數據庫記錄。
每個資料庫記錄只有一個根段,但它可以有任何數量的段出現。
在標準檔案處理中,記錄是應用程式程式用於某些操作的資料單元。在 DL/I 中,該資料單元稱為段。單個數據庫記錄具有許多段出現。
資料庫路徑
需要注意的要點 -
路徑是從資料庫記錄的根段到任何特定段出現的段序列。
層次結構中的路徑不必完整到最低級別。這取決於我們需要了解實體的資訊量。
路徑必須是連續的,我們不能跳過結構中的中間級別。
在下圖中,深灰色中的子記錄顯示了一條從 'A' 開始並穿過 'C2' 的路徑。
IMS DB - DL/I 處理
IMS DB 在不同級別儲存資料。透過從應用程式程式發出 DL/I 呼叫來檢索和插入資料。我們將在接下來的章節中詳細討論有關 DL/I 呼叫的內容。資料可以透過以下兩種方式處理 -
- 順序處理
- 隨機處理
順序處理
當從資料庫順序檢索段時,DL/I 會遵循預定義的模式。讓我們瞭解 IMS DB 的順序處理。
以下是有關順序處理需要注意的要點 -
DL/I 中訪問資料的預定義模式是先向下遍歷層次結構,然後從左到右。
首先檢索根段,然後 DL/I 移動到第一個左子段,並一直向下到最低級別。在最低級別,它檢索所有孿生段的出現。然後它轉到右側段。
為了更好地理解,請觀察上圖中顯示段訪問流程的箭頭。圖書館是根段,流程從那裡開始,一直到汽車以訪問單個記錄。對所有出現重複相同的過程以獲取所有資料記錄。
在訪問資料時,程式使用資料庫中的位置,這有助於檢索和插入段。
隨機處理
隨機處理也稱為 IMS DB 中資料的直接處理。讓我們舉一個例子來了解 IMS DB 中的隨機處理 -
以下是關於隨機處理需要注意的要點 -
需要隨機檢索的段出現需要它所依賴的所有段的關鍵欄位。這些關鍵欄位由應用程式程式提供。
連線鍵完全識別從根段到您要檢索的段的路徑。
假設您要檢索商務段的出現,那麼您需要提供它所依賴的段(如圖書館、書籍和商務)的連線鍵欄位值。
隨機處理比順序處理快。在現實世界中,應用程式將順序和隨機處理方法結合在一起以獲得最佳結果。
關鍵欄位
需要注意的要點 -
關鍵欄位也稱為順序欄位。
關鍵欄位存在於段中,並用於檢索段出現。
關鍵欄位以升序管理段出現。
在每個段中,只能使用一個欄位作為關鍵欄位或順序欄位。
搜尋欄位
如前所述,只能使用一個欄位作為關鍵欄位。如果要搜尋不是關鍵欄位的其他段欄位的內容,則用於檢索資料的欄位稱為搜尋欄位。
IMS DB - 控制塊
IMS 控制塊定義了 IMS 資料庫的結構以及程式對它們的訪問。下圖顯示了 IMS 控制塊的結構。
DL/I 使用以下三種類型的控制塊 -
- 資料庫描述符 (DBD)
- 程式規範塊 (PSB)
- 訪問控制塊 (ACB)
資料庫描述符 (DBD)
需要注意的要點 -
DBD 描述了資料庫的完整物理結構,一旦所有段都已定義。
在安裝 DL/I 資料庫時,必須建立一個 DBD,因為它需要訪問 IMS 資料庫。
應用程式可以使用 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 宏語句標識資料庫。在這裡,我們需要提及 NAME 和 ACCESS,DL/I 用於訪問此資料庫。
第二個 DATASET 宏語句標識包含資料庫的檔案。
段型別使用 SEGM 宏語句定義。我們需要指定該段的 PARENT。如果它是根段,則提及 PARENT=0。
下表顯示了 FIELD 宏語句中使用的引數 -
| 序號 | 引數及描述 |
|---|---|
| 1 | 姓名 欄位名稱,通常為 1 到 8 個字元 |
| 2 | 位元組 欄位長度 |
| 3 | 起始位置 欄位在段中的位置 |
| 4 | 型別 欄位的資料型別 |
| 5 | 型別 C 字元資料型別 |
| 6 | 型別 P 壓縮十進位制資料型別 |
| 7 | 型別 Z 區域十進位制資料型別 |
| 8 | 型別 X 十六進位制資料型別 |
| 9 | 型別 H 半字二進位制資料型別 |
| 10 | 型別 F 全字二進位制資料型別 |
程式規範塊 (PSB)
PSB 的基本原理如下:
資料庫具有由 DBD 定義的單個物理結構,但處理它的應用程式可以具有資料庫的不同檢視。這些檢視稱為應用程式資料結構,並在 PSB 中定義。
一個程式在單個執行中不能使用多個 PSB。
應用程式程式有自己的 PSB,並且具有類似資料庫處理需求的應用程式程式共享一個 PSB 也很常見。
PSB 由一個或多個稱為程式通訊塊 (PCB) 的控制塊組成。PSB 為應用程式程式將訪問的每個 DL/I 資料庫包含一個 PCB。我們將在後續模組中詳細討論 PCB。
必須執行 PSBGEN 以建立程式的 PSB。
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 僅表示載入操作。
SENSEG 稱為段級敏感性。它定義了程式對資料庫部分的訪問許可權,並在段級標識。程式可以訪問其敏感的所有段內的所有欄位。程式也可以具有欄位級敏感性。在此,我們定義一個段名和該段的父名稱。
最後一個宏語句是 PCBGEN。PSBGEN 是最後一個語句,表明沒有更多語句要處理。PSBNAME 定義賦予輸出 PSB 模組的名稱。LANG 引數指定編寫應用程式程式的語言,例如 COBOL。
訪問控制塊 (ACB)
以下是關於訪問控制塊需要注意的事項:
應用程式程式的訪問控制塊將資料庫描述符和程式規範塊組合成可執行形式。
ACBGEN 稱為訪問控制塊生成器。它用於生成 ACB。
對於聯機程式,我們需要預先構建 ACB。因此,在執行應用程式程式之前執行 ACBGEN 實用程式。
對於批處理程式,也可以在執行時生成 ACB。
IMS DB - 程式設計
包含 DL/I 呼叫的應用程式程式不能直接執行。相反,需要一個 JCL 來觸發 IMS DL/I 批處理模組。IMS 中的批處理初始化模組是 DFSRRC00。應用程式程式和 DL/I 模組一起執行。下圖顯示了包含 DL/I 呼叫以訪問資料庫的應用程式程式的結構。
應用程式程式透過以下程式元素與 IMS DL/I 模組互動:
ENTRY 語句指定程式利用 PCB。
PCB 掩碼與儲存在預構建 PCB 中的資訊相關聯,該 PCB 從 IMS 接收返回資訊。
輸入/輸出區域用於將資料段傳遞到 IMS 資料庫和從 IMS 資料庫傳遞資料段。
對 DL/I 的呼叫指定處理功能,例如獲取、插入、刪除、替換等。
檢查狀態程式碼用於檢查指定的處理選項的 SQL 返回程式碼,以通知操作是否成功。
終止語句用於結束包含 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 語句來訪問資料庫:
- 入口語句
- Goback 語句
- 呼叫語句
入口語句
它用於將控制權從 DL/I 傳遞到 COBOL 程式。以下是入口語句的語法:
ENTRY 'DLITCBL' USING pcb-name1
[pcb-name2]
以上語句在 COBOL 程式的過程部分中編碼。讓我們深入瞭解 COBOL 程式中入口語句的詳細資訊:
批處理初始化模組觸發應用程式程式並在其控制下執行。
DL/I 載入所需的控制塊和模組以及應用程式程式,並將控制權交給應用程式程式。
DLITCBL 代表DL/I 到 COBOL。入口語句用於定義程式中的入口點。
當我們在 COBOL 中呼叫子程式時,也會提供其地址。同樣,當 DL/I 將控制權交給應用程式程式時,它還會提供程式 PSB 中定義的每個 PCB 的地址。
應用程式程式中使用的所有 PCB 必須在 COBOL 程式的連線段中定義,因為 PCB 位於應用程式程式外部。
連線段中的 PCB 定義稱為PCB 掩碼。
儲存中 PCB 掩碼和實際 PCB 之間的關係是透過在入口語句中列出 PCB 建立的。入口語句中列出的順序應與它們在 PSBGEN 中出現的順序相同。
Goback 語句
它用於將控制權傳回 IMS 控制程式。以下是 Goback 語句的語法:
GOBACK
以下是關於 Goback 語句需要注意的基本事項:
GOBACK 在應用程式程式的末尾編碼。它將控制權從程式返回到 DL/I。
我們不應使用 STOP RUN,因為它將控制權返回到作業系統。如果我們使用 STOP RUN,DL/I 將永遠無法執行其終止功能。因此,在 DL/I 應用程式程式中,使用 Goback 語句。
在發出 Goback 語句之前,必須關閉 COBOL 應用程式程式中使用的所有非 DL/I 資料集,否則程式將異常終止。
呼叫語句
呼叫語句用於請求 DL/I 服務,例如對 IMS 資料庫執行某些操作。以下是呼叫語句的語法:
CALL 'CBLTDLI' USING DLI Function Code
PCB Mask
Segment I/O Area
[Segment Search Arguments]
以上語法顯示了您可以與呼叫語句一起使用的引數。我們將在下表中討論每個引數:
| 序號 | 引數及描述 |
|---|---|
| 1 | DLI 函式程式碼 標識要執行的 DL/I 函式。此引數是描述 I/O 操作的四個字元欄位的名稱。 |
| 2 | PCB 掩碼 連線段中的 PCB 定義稱為 PCB 掩碼。它們用於入口語句中。不需要 SELECT、ASSIGN、OPEN 或 CLOSE 語句。 |
| 3 | 段 I/O 區域 輸入/輸出工作區的名稱。這是應用程式程式的一個區域,DL/I 將請求的段放入其中。 |
| 4 | 段搜尋引數 這些是根據發出的呼叫的型別而定的可選引數。它們用於在 IMS 資料庫中搜索資料段。 |
以下是關於呼叫語句需要注意的事項:
CBLTDLI 代表COBOL 到 DL/I。它是與您的程式的物件模組連結編輯的介面模組的名稱。
在每次 DL/I 呼叫之後,DLI 將狀態程式碼儲存在 PCB 中。程式可以使用此程式碼來確定呼叫是否成功。
示例
為了更好地理解 COBOL,您可以檢視我們的 COBOL 教程此處。以下示例顯示了使用 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 '.
此語法表示以下要點:
對於此引數,我們可以提供任何四個字元的名稱作為儲存欄位來儲存函式程式碼。
DL/I 函式引數在 COBOL 程式的工作儲存部分編碼。
為了指定 DL/I 函式,程式設計師需要在 DL/I 呼叫中編碼 05 級資料名稱之一,例如 DLI-GU,因為 COBOL 不允許在 CALL 語句上編碼文字。
DL/I 函式分為三類:獲取、更新和其他函式。讓我們詳細討論每個函式。
獲取函式
獲取函式類似於任何程式語言支援的讀取操作。獲取函式用於從 IMS DL/I 資料庫中獲取段。以下獲取函式用於 IMS DB:
- 獲取唯一
- 獲取下一個
- 獲取父級內的下一個
- 獲取保持唯一
- 獲取保持下一個
- 獲取保持父級內的下一個
讓我們考慮以下 IMS 資料庫結構以瞭解 DL/I 函式呼叫:
獲取唯一
'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 中的讀取下一條語句。它用於按順序獲取段的出現。訪問資料段出現的預定義模式是向下遍歷層次結構,然後從左到右。GN 呼叫的語法如下所示:
CALL 'CBLTDLI' USING DLI-GN
PCB Mask
Segment I/O Area
[Segment Search Arguments]
如果透過在 COBOL 程式中為所有引數提供適當的值來執行上述呼叫語句,則可以從資料庫中按順序檢索段 I/O 區域中的段出現。在上面的示例中,它首先訪問 Library 段,然後是 Books 段,依此類推。我們反覆執行 GN 呼叫,直到到達我們想要的段出現。
獲取父級內的下一個
'GNP' 程式碼用於 Get Next within Parent。此函式用於檢索從屬已建立的父段的段出現序列。GNP 呼叫的語法如下所示:
CALL 'CBLTDLI' USING DLI-GNP
PCB Mask
Segment I/O Area
[Segment Search Arguments]
獲取保持唯一
'GHU' 程式碼用於 Get Hold Unique。Hold 函式指定將在檢索後更新段。Get Hold Unique 函式對應於 Get Unique 呼叫。以下是 GHU 呼叫的語法:
CALL 'CBLTDLI' USING DLI-GHU
PCB Mask
Segment I/O Area
[Segment Search Arguments]
獲取保持下一個
'GHN' 程式碼用於 Get Hold Next。Hold 函式指定將在檢索後更新段。Get Hold Next 函式對應於 Get Next 呼叫。以下是 GHN 呼叫的語法:
CALL 'CBLTDLI' USING DLI-GHN
PCB Mask
Segment I/O Area
[Segment Search Arguments]
獲取保持父級內的下一個
'GHNP' 程式碼用於 Get Hold Next within Parent。Hold 函式指定將在檢索後更新段。Get Hold Next within Parent 函式對應於 Get Next within Parent 呼叫。以下是 GHNP 呼叫的語法:
CALL 'CBLTDLI' USING DLI-GHNP
PCB Mask
Segment I/O Area
[Segment Search Arguments]
更新函式
更新函式類似於任何其他程式語言中的重寫或插入操作。更新函式用於更新 IMS DL/I 資料庫中的段。在使用更新函式之前,必須對段出現進行成功的 Hold 子句呼叫。IMS DB 中使用以下更新函式:
- 插入
- 刪除
- 替換
插入
'ISRT' 程式碼用於 Insert 函式。ISRT 函式用於向資料庫新增新段。它用於更改現有資料庫或載入新資料庫。以下是 ISRT 呼叫的語法:
CALL 'CBLTDLI' USING DLI-ISRT
PCB Mask
Segment I/O Area
[Segment Search Arguments]
刪除
'DLET' 程式碼用於 Delete 函式。它用於從 IMS DL/I 資料庫中刪除段。以下是 DLET 呼叫的語法:
CALL 'CBLTDLI' USING DLI-DLET
PCB Mask
Segment I/O Area
[Segment Search Arguments]
替換
'REPL' 程式碼用於 Get Hold Next within Parent。Replace 函式用於替換 IMS DL/I 資料庫中的段。以下是 REPL 呼叫的語法:
CALL 'CBLTDLI' USING DLI-REPL
PCB Mask
Segment I/O Area
[Segment Search Arguments]
其他函式
IMS DL/I 呼叫中使用以下其他函式:
- 檢查點
- 重新啟動
- PCB
檢查點
'CHKP' 程式碼用於 Checkpoint 函式。它用於 IMS 的恢復功能。以下是 CHKP 呼叫的語法:
CALL 'CBLTDLI' USING DLI-CHKP
PCB Mask
Segment I/O Area
[Segment Search Arguments]
重新啟動
'XRST' 程式碼用於 Restart 函式。它用於 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 代表程式通訊塊。PCB 掩碼是 DL/I 呼叫中使用的第二個引數。它在連結段中宣告。以下是 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 WRITE 語句中指定記錄名。不需要 SELECT、ASSIGN、OPEN 或 CLOSE 語句。
在每次 DL/I 呼叫之後,DL/I 會將狀態程式碼儲存在 PCB 中,程式可以使用該程式碼來確定呼叫是否成功。
PCB 名稱
需要注意的要點 -
PCB 名稱是引用 PCB 欄位的整個結構的區域的名稱。
PCB 名稱用於程式語句。
PCB 名稱不是 PCB 中的欄位。
DBD 名稱
需要注意的要點 -
DBD 名稱包含字元資料。它長 8 個位元組。
PCB 中的第一個欄位是被處理的資料庫的名稱,它從與特定資料庫關聯的資料庫描述庫中提供 DBD 名稱。
段級別
需要注意的要點 -
段級別稱為段層次結構級別指示器。它包含字元資料,長 2 個位元組。
段級別欄位儲存已處理段的級別。當成功檢索段時,檢索到的段的級別號將儲存在此處。
段級別欄位的值永遠不會大於 15,因為這是 IMS DL/I 資料庫中允許的最大級別數。
狀態程式碼
需要注意的要點 -
狀態程式碼欄位包含 2 個位元組的字元資料。
狀態程式碼包含 DL/I 狀態程式碼。
當 DL/I 成功完成呼叫的處理時,空格將移動到狀態程式碼欄位。
非空格值表示呼叫未成功。
狀態程式碼 GB 表示檔案結束,狀態程式碼 GE 表示未找到請求的段。
Proc 選項
需要注意的要點 -
Proc 選項稱為處理選項,包含四個字元資料欄位。
處理選項欄位指示程式被授權對資料庫執行哪種型別的處理。
保留的 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 有兩種型別:
- 無限定 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 的型別。
要訪問特定段,請將段名稱移動到 SEGMENT-NAME 欄位。
以下影像顯示了無限定和限定 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 個位元組儲存用於處理的段名稱。
第九個位元組是左括號'('。
從第十個位置開始的接下來的 8 個位元組指定我們要搜尋的欄位名稱。
在欄位名稱之後,在第 18 和 19 個位置,我們指定兩個字元的關係運算符程式碼。
然後我們指定欄位值,在最後一個位元組中,有一個右括號')'。
下表顯示了限定 SSA 中使用的關係運算符。
| 關係運算符 | 符號 | 描述 |
|---|---|---|
| EQ | = | 等於 |
| NE | ~= ˜ | 不等於 |
| GT | > | 大於 |
| GE | >= | 大於或等於 |
| LT | << | 小於 |
| LE | <= | 小於或等於 |
命令程式碼
命令程式碼用於增強 DL/I 呼叫的功能。命令程式碼減少了 DL/I 呼叫的數量,使程式更簡單。此外,由於呼叫次數減少,因此可以提高效能。下圖顯示瞭如何在無限定和限定 SSA 中使用命令程式碼:
命令程式碼的關鍵點如下:
要使用命令程式碼,請在 SSA 的第 9 個位置指定星號,如上圖所示。
命令程式碼編碼在第十個位置。
從第十個位置開始,DL/I 將所有字元視為命令程式碼,直到遇到無限定 SSA 的空格和限定 SSA 的左括號。
下表顯示了 SSA 中使用的命令程式碼列表:
| 命令程式碼 | 描述 |
|---|---|
| C | 連線鍵 |
| D | 路徑呼叫 |
| F | 第一次出現 |
| L | 最後一次出現 |
| N | 忽略路徑呼叫 |
| P | 設定父級關係 |
| Q | 入隊段 |
| U | 在此級別保持位置 |
| V | 在此級別和所有上級級別保持位置 |
| - | 空命令程式碼 |
多重限定
多重限定的基本要點如下:
當我們需要使用兩個或多個限定或欄位進行比較時,需要多重限定。
我們使用 AND 和 OR 等布林運算子來連線兩個或多個限定。
當我們想要根據單個欄位的一系列可能值處理段時,可以使用多重限定。
以下是多重限定的語法:
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 呼叫後的相關狀態程式碼:
| 序號 | 狀態程式碼和描述 |
|---|---|
| 1 | 空格 呼叫成功 |
| 2 | GE DL/I 找不到滿足呼叫中指定條件的段 |
GN 呼叫
GN 呼叫的基本原理如下:
GN 呼叫稱為獲取下一個呼叫。它用於基本的順序處理。
資料庫中指標的初始位置在第一個資料庫記錄的根段之前。
成功執行 GN 呼叫後,資料庫指標位置位於序列中下一個段出現之前。
GN 呼叫從先前呼叫建立的位置開始遍歷資料庫。
如果 GN 呼叫是非限定的,則它會返回資料庫中下一個段出現,而不管其型別如何,都按層次結構順序返回。
如果 GN 呼叫包含 SSA,則 DL/I 僅檢索滿足所有指定 SSA 要求的段。
CALL 'CBLTDLI' USING DLI-GN
PCB-NAME
IO-AREA
BOOKS-SSA
上面的示例顯示我們發出 GN 呼叫,提供起始位置以順序讀取記錄。它獲取 BOOKS 段的第一個出現。
狀態程式碼
下表顯示了 GN 呼叫後的相關狀態程式碼:
| 序號 | 狀態程式碼和描述 |
|---|---|
| 1 | 空格 呼叫成功 |
| 2 | GE DL/I 找不到滿足呼叫中指定條件的段。 |
| 3 | GA 非限定的 GN 呼叫在資料庫層次結構中向上移動一級以獲取段。 |
| 4 | GB 到達資料庫末尾且未找到段。 |
GK 非限定的 GN 呼叫嘗試獲取特定型別的段(而不是剛剛檢索到的段),但保留在同一層次結構級別。 |
命令程式碼
命令程式碼用於與呼叫一起獲取段出現。下面討論了與呼叫一起使用的各種命令程式碼。
F 命令程式碼
需要注意的要點 -
當在呼叫中指定 F 命令程式碼時,該呼叫會處理段的第一個出現。
當我們想要順序處理時,可以使用 F 命令程式碼,並且可以與 GN 呼叫和 GNP 呼叫一起使用。
如果我們在 GU 呼叫中指定 F 命令程式碼,則它沒有任何意義,因為 GU 呼叫預設獲取第一個段出現。
L 命令程式碼
需要注意的要點 -
當在呼叫中指定 L 命令程式碼時,該呼叫會處理段的最後一個出現。
當我們想要順序處理時,可以使用 L 命令程式碼,並且可以與 GN 呼叫和 GNP 呼叫一起使用。
D 命令程式碼
需要注意的要點 -
D 命令程式碼用於使用單個呼叫獲取多個段出現。
通常,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 資料庫中擁有多個位置,這稱為多重處理。多重處理可以透過兩種方式完成:
- 多個 PCB
- 多重定位
多個 PCB
可以為單個數據庫定義多個 PCB。如果有多個 PCB,則應用程式程式可以擁有不同的檢視。由於額外 PCB 帶來的開銷,這種實現多重處理的方法效率低下。
多重定位
程式可以使用單個 PCB 在資料庫中維護多個位置。這是透過為每個層次路徑維護一個不同的位置來實現的。多重定位用於同時順序訪問兩種或多種型別的段。
IMS DB - 資料操作
在 IMS DL/I 呼叫中使用的不同資料操作方法如下:
- ISRT 呼叫
- 獲取保持呼叫
- REPL 呼叫
- DLET 呼叫
讓我們考慮以下 IMS 資料庫結構以瞭解資料操作函式呼叫:
ISRT 呼叫
需要注意的要點 -
ISRT 呼叫稱為插入呼叫,用於向資料庫新增段出現。
ISRT 呼叫用於載入新的資料庫。
當段描述欄位載入了資料時,我們會發出 ISRT 呼叫。
必須在呼叫中指定非限定或限定 SSA,以便 DL/I 知道將段出現放置在何處。
我們可以在呼叫中使用非限定和限定 SSA 的組合。可以為所有上述級別指定限定 SSA。讓我們考慮以下示例:
CALL 'CBLTDLI' USING DLI-ISRT
PCB-NAME
IO-AREA
LIBRARY-SSA
BOOKS-SSA
UNQUALIFIED-ENGINEERING-SSA
上面的示例顯示我們正在透過提供限定和非限定 SSA 的組合來發出 ISRT 呼叫。
當我們插入的新段具有唯一鍵欄位時,它會新增到正確的位置。如果鍵欄位不是唯一的,則會根據資料庫管理員定義的規則新增它。
當我們發出 ISRT 呼叫而不指定鍵欄位時,插入規則會告訴將段相對於現有雙胞胎段放置在何處。以下是插入規則:
首先 − 如果規則是 first,則新的段將新增到任何現有雙胞胎之前。
最後 − 如果規則是 last,則新的段將新增到所有現有雙胞胎之後。
這裡 − 如果規則是 here,則它將新增到相對於現有雙胞胎的當前位置,可以是 first、last 或任何位置。
狀態程式碼
下表顯示了 ISRT 呼叫後的相關狀態程式碼:
| 序號 | 狀態程式碼和描述 |
|---|---|
| 1 | 空格 呼叫成功 |
| 2 | GE 使用多個 SSA,並且 DL/I 無法使用指定的路徑滿足呼叫。 |
| 3 | II 嘗試新增資料庫中已存在的段出現。 |
| 4 | LB / LC LD / LE 在載入處理期間,我們會獲得這些狀態程式碼。在大多數情況下,它們表示您沒有按精確的層次結構順序插入段。 |
獲取保持呼叫
需要注意的要點 -
在 DL/I 呼叫中,我們指定三種類型的獲取保持呼叫
獲取保持唯一 (GHU)
獲取保持下一個 (GHN)
獲取保持父級內部的下一個 (GHNP)
保持功能指定我們將更新檢索後的段。因此,在 REPL 或 DLET 呼叫之前,必須發出成功的保持呼叫,以告知 DL/I 更新資料庫的意圖。
REPL 呼叫
需要注意的要點 -
成功執行獲取保持呼叫後,我們會發出 REPL 呼叫來更新段出現。
我們不能使用 REPL 呼叫更改段的長度。
我們不能使用 REPL 呼叫更改鍵欄位的值。
我們不能將限定 SSA 與 REPL 呼叫一起使用。如果我們指定限定 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 呼叫非常相似。
成功執行獲取保持呼叫後,我們會發出 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 呼叫後的相關狀態程式碼:
| 序號 | 狀態程式碼和描述 |
|---|---|
| 1 | 空格 呼叫成功 |
| 2 | AJ 在 REPL 或 DLET 呼叫中使用限定 SSA。 |
| 3 | DJ 程式在沒有緊接其前的獲取保持呼叫的情況下發出替換呼叫。 |
| 4 | DA 程式在發出 REPL 或 DLET 呼叫之前更改了段的鍵欄位 |
IMS DB - 二級索引
當我們想要訪問資料庫而不使用完整的連線鍵或不想使用順序主欄位時,使用輔助索引。
索引指標段
DL/I 將指向索引資料庫的段的指標儲存在單獨的資料庫中。索引指標段是唯一型別的輔助索引。它由兩部分組成:
- 字首元素
- 資料元素
字首元素
索引指標段的字首部分包含指向索引目標段的指標。索引目標段是可以使用輔助索引訪問的段。
資料元素
資料元素包含來自已構建索引的索引資料庫中段的鍵值。這也被稱為索引源段。
以下是關於輔助索引需要注意的關鍵點:
索引源段和目標源段不必相同。
當我們設定輔助索引時,它會由 DL/I 自動維護。
DBA 根據多個訪問路徑定義許多輔助索引。這些輔助索引儲存在單獨的索引資料庫中。
我們不應該建立更多的二級索引,因為它們會給 DL/I 帶來額外的處理開銷。
輔助鍵
需要注意的要點 -
索引源段中構建二級索引的欄位稱為輔助鍵。
任何欄位都可以用作輔助鍵。它不必是段的順序欄位。
輔助鍵可以是索引源段內單個欄位的任何組合。
輔助鍵值不必唯一。
輔助資料結構
需要注意的要點 -
當我們構建二級索引時,資料庫的表觀層次結構也會發生變化。
索引目標段成為表觀根段。如下圖所示,即使 Engineering 段不是根段,它也成為根段。
二級索引導致的資料庫結構重排稱為輔助資料結構。
輔助資料結構不會對磁碟上存在的物理資料庫主結構進行任何更改。它只是一種在應用程式程式前面更改資料庫結構的方式。
獨立 AND 運算子
需要注意的要點 -
當 AND(* 或 &)運算子與二級索引一起使用時,它被稱為依賴 AND 運算子。
獨立 AND(#)允許我們指定依賴 AND 無法實現的限定條件。
此運算子僅可用於索引源段依賴於索引目標段的二級索引。
我們可以使用獨立 AND 編碼 SSA,以指定根據兩個或多個依賴源段中的欄位處理目標段的某個出現。
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。當我們建立二級索引時,會涉及兩個資料庫。DBA 需要使用兩個 DBDGEN 建立兩個 DBD,以在索引資料庫和二級索引資料庫之間建立關係。
PSBGEN 需求
為資料庫建立二級索引後,DBA 需要建立 PSB。程式的 PSBGEN 在 PSB 宏的 PROCSEQ 引數上指定資料庫的正確處理順序。對於 PROCSEQ 引數,DBA 編碼二級索引資料庫的 DBD 名稱。
IMS DB - 邏輯資料庫
IMS 資料庫有一條規則,即每種段型別只能有一個父段。這限制了物理資料庫的複雜性。許多 DL/I 應用程式需要一個複雜的結構,允許一個段具有兩種父段型別。為了克服此限制,DL/I 允許 DBA 實現邏輯關係,其中一個段可以同時具有物理父段和邏輯父段。我們可以在一個物理資料庫內建立額外的關係。實施邏輯關係後的新資料結構稱為邏輯資料庫。
邏輯關係
邏輯關係具有以下屬性:
邏輯關係是兩個在邏輯上而不是物理上相關的段之間的路徑。
通常,邏輯關係是在獨立的資料庫之間建立的。但也可以在一個特定資料庫的段之間建立關係。
下圖顯示了兩個不同的資料庫。一個是學生資料庫,另一個是圖書館資料庫。我們在學生資料庫的“已借書籍”段和圖書館資料庫的“書籍”段之間建立邏輯關係。
建立邏輯關係後,邏輯資料庫如下所示:
邏輯子段
邏輯子段是邏輯關係的基礎。它是一個物理資料段,但對於 DL/I 來說,它看起來好像有兩個父段。以上示例中的“書籍”段有兩個父段。“已借書籍”段是邏輯父段,“圖書館”段是物理父段。一個邏輯子段出現僅有一個邏輯父段出現,一個邏輯父段出現可以有多個邏輯子段出現。
邏輯雙胞胎
邏輯雙胞胎是邏輯子段型別的出現,它們都從屬於邏輯父段型別的單個出現。DL/I 使邏輯子段看起來類似於實際的物理子段。這也稱為虛擬邏輯子段。
邏輯關係型別
DBA 在段之間建立邏輯關係。要實現邏輯關係,DBA 必須在相關物理資料庫的 DBDGEN 中指定它。邏輯關係有三種類型:
- 單向
- 雙向虛擬
- 雙向物理
單向
邏輯連線從邏輯子段到邏輯父段,反之則不行。
雙向虛擬
它允許雙向訪問。邏輯子段在其物理結構中以及相應的虛擬邏輯子段可以看作是配對的段。
雙向物理
邏輯子段在物理上儲存為其物理和邏輯父段的從屬段。對於應用程式程式,它看起來與雙向虛擬邏輯子段相同。
程式設計注意事項
使用邏輯資料庫的程式設計注意事項如下:
訪問資料庫的 DL/I 呼叫在邏輯資料庫中也保持不變。
程式規範塊指示我們在呼叫中使用的結構。在某些情況下,我們無法識別我們正在使用邏輯資料庫。
邏輯關係為資料庫程式設計增加了新的維度。
在使用邏輯資料庫時必須小心,因為兩個資料庫整合在一起。如果修改一個數據庫,則必須在另一個數據庫中反映相同的修改。
程式規範應指示在資料庫上允許哪些處理。如果違反處理規則,您將獲得非空白狀態程式碼。
連線段
邏輯子段始終以目標父段的完整連線鍵開頭。這稱為目標父段連線鍵 (DPCK)。對於邏輯子段,您需要始終在段 I/O 區域的開頭編碼 DPCK。在邏輯資料庫中,連線段在不同物理資料庫中定義的段之間建立連線。連線段包含以下兩個部分:
- 邏輯子段
- 目標父段
邏輯子段包含以下兩個部分:
- 目標父段連線鍵 (DPCK)
- 邏輯子段使用者資料
當我們在更新期間使用連線段時,可能可以透過單個呼叫新增或更改邏輯子段和目標父段中的資料。這也取決於 DBA 為資料庫指定的規則。對於插入,請在正確的位置提供 DPCK。對於替換或刪除,請勿更改連線段任一部分中的 DPCK 或順序欄位資料。
IMS DB - 恢復
資料庫管理員需要計劃資料庫恢復以防系統故障。故障可能有多種型別,例如應用程式崩潰、硬體錯誤、電源故障等。
簡單方法
資料庫恢復的一些簡單方法如下:
定期備份重要資料集,以便保留針對資料集釋出的所有事務。
如果資料集由於系統故障而損壞,則可以透過恢復備份副本來解決該問題。然後將累積的事務重新發布到備份副本以使其更新。
簡單方法的缺點
簡單方法進行資料庫恢復的缺點如下:
重新發布累積的事務會消耗大量時間。
所有其他應用程式都需要等待執行,直到恢復完成。
如果涉及邏輯和二級索引關係,則資料庫恢復比檔案恢復更長。
異常終止例程
DL/I 程式崩潰的方式與標準程式崩潰的方式不同,因為標準程式由作業系統直接執行,而 DL/I 程式則不是。透過使用異常終止例程,系統會進行干預,以便在異常結束 (ABEND) 後可以進行恢復。異常終止例程執行以下操作:
- 關閉所有資料集
- 取消佇列中所有掛起作業
- 建立儲存轉儲以找出 ABEND 的根本原因
此例程的限制在於它不能確保正在使用的資料的準確性。
DL/I 日誌
當應用程式程式 ABEND 時,需要恢復應用程式程式所做的更改,更正錯誤,然後重新執行應用程式程式。為此,需要 DL/I 日誌。以下是關於 DL/I 日誌的關鍵點:
DL/I 將應用程式程式所做的所有更改記錄在一個稱為日誌檔案的檔案中。
當應用程式程式更改段時,DL/I 會建立其前映像和後映像。
如果應用程式程式崩潰,可以使用這些段映像來恢復段。
DL/I 使用一種稱為提前寫入日誌的技術來記錄資料庫更改。使用提前寫入日誌,資料庫更改會在寫入實際資料集之前寫入日誌資料集。
由於日誌始終領先於資料庫,因此恢復實用程式可以確定任何資料庫更改的狀態。
當程式執行更改資料庫段的呼叫時,DL/I 會處理其日誌部分。
恢復 - 前向和後向
資料庫恢復的兩種方法是:
前向恢復 - DL/I 使用日誌檔案儲存更改資料。使用此日誌檔案重新發布累積的事務。
後向恢復 - 後向恢復也稱為回退恢復。程式的日誌記錄被反向讀取,並在資料庫中逆轉其影響。當回退完成時,資料庫處於與故障發生前相同的狀態,假設在此期間沒有其他應用程式程式更改資料庫。
檢查點
檢查點是應用程式程式完成的資料庫更改被認為完整且準確的階段。下面列出了關於檢查點的注意事項:
在最近檢查點之前進行的資料庫更改不會被後向恢復逆轉。
在最近檢查點之後記錄的資料庫更改不會在正向恢復期間應用於資料庫的映像副本。
使用檢查點方法,當恢復過程完成時,資料庫將恢復到最近檢查點的狀態。
批處理程式的預設值為程式的開始是檢查點。
可以使用檢查點呼叫 (CHKP) 建立檢查點。
檢查點呼叫會導致在 DL/I 日誌上寫入檢查點記錄。
下面顯示了 CHKP 呼叫的語法:
CALL 'CBLTDLI' USING DLI-CHKP
PCB-NAME
CHECKPOINT-ID
有兩種檢查點方法:
基本檢查點 - 它允許程式設計師發出 DL/I 恢復實用程式在恢復處理期間使用的檢查點呼叫。
符號檢查點 - 它是檢查點的一種高階形式,與擴充套件重啟功能結合使用。符號檢查點和擴充套件重啟一起允許應用程式程式設計師對程式進行編碼,以便它們可以在檢查點之後的點恢復處理。