IMS DB - 数据检索

IMS DL/I 调用中使用的各种数据检索方法如下 −

  • GU 调用
  • GN 调用
  • 使用命令代码
  • 多重处理

让我们考虑以下 IMS 数据库结构来了解数据检索函数调用 −

IMS DATABASE1

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 呼叫后的状态代码 −

S.No 状态代码和说明
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 调用后的相关状态代码 −

S.No 状态代码 &描述
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 会限制对该段的搜索。

  • 如果与合格 SSA 一起使用,则会忽略 U 命令代码。

V 命令代码

注意事项 −

  • V 命令代码的工作原理与 U 命令代码类似,但它限制了在特定级别和层次结构以上的所有级别对段的搜索。

  • 与合格的 SSA 一起使用时,V 命令代码将被忽略。

Q 命令代码

注意事项 −

  • Q 命令代码用于将段排队或保留以供应用程序专用。

  • Q 命令代码用于交互式环境,另一个程序可能会对段进行更改。

多重处理

一个程序可以在 IMS 数据库中拥有多个位置,这称为多重处理。多重处理可以通过两种方式完成 −

  • 多个 PCB
  • 多重定位

多个 PCB

可以为单个数据库定义多个 PCB。如果有多个 PCB,则应用程序可以对其有不同的视图。由于额外 PCB 带来的开销,这种实现多重处理的方法效率低下。

多重定位

程序可以使用单个 PCB 在数据库中维护多个位置。这是通过为每个层次路径维护一个不同的位置来实现的。多重定位用于同时按顺序访问两种或多种类型的段。