
- 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 在数据库中维护多个位置。这是通过为每个层次路径维护一个不同的位置来实现的。多重定位用于同时顺序访问两种或多种类型的段。