- 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 DL/I 呼叫中使用的各種資料檢索方法如下:
- GU 呼叫
- GN 呼叫
- 使用命令程式碼
- 多重處理
讓我們考慮以下 IMS 資料庫結構來理解資料檢索功能呼叫:
GU 呼叫
GU 呼叫的基本原理如下:
GU 呼叫被稱為獲取唯一呼叫。它用於隨機處理。
如果應用程式不定期更新資料庫,或者資料庫更新次數較少,則我們使用隨機處理。
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 在資料庫中維護多個位置。這是透過為每個層次路徑維護一個不同的位置來實現的。多重定位用於同時順序訪問兩種或多種型別的段。