IMS 数据库 - 快速指南


IMS 数据库 - 概述

简要概述

数据库是相关数据项的集合。这些数据项的组织和存储方式可提供快速、轻松的访问。IMS数据库是一个分层数据库,其中数据存储在不同级别,每个实体都依赖于更高级别的实体。使用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 数据库 - 结构

层次结构

IMS 数据库是容纳物理文件的数据的集合。在分层数据库中,最顶层包含有关实体的一般信息。当我们从层次结构的顶层到底层时,我们获得越来越多的有关实体的信息。

层次结构中的每个级别都包含段。在标准文件中,很难实现层次结构,但 DL/I 支持层次结构。下图描述了IMS DB的结构。

层次结构

部分

注意事项 -

  • 分段是通过将相似的数据分组在一起而创建的。

  • 它是 DL/I 在任何输入输出操作期间与应用程序之间传输的最小信息单元。

  • 一个段可以有一个或多个分组在一起的数据字段。

在以下示例中,段 Student 有四个数据字段。

学生
卷数 姓名 课程 手机号码

场地

注意事项−

  • 字段是段中的单个数据。例如,学号、姓名、课程和手机号码是学生部分中的单个字段。

  • 段由相关字段组成,用于收集实体的信息。

  • 字段可以用作对段进行排序的键。

  • 字段可以用作搜索有关特定段的信息的限定符。

段类型

注意事项 -

  • 段类型是段中数据的类别。

  • DL/I 数据库可以有 255 个不同的段类型和 15 个层次结构级别。

  • 下图中,共有三个部分,即图书馆、图书信息和学生信息。

标准信息

片段出现次数

注意事项 -

  • 段出现是包含用户数据的特定类型的单独段。在上面的示例中,书籍信息是一种段类型,它可以出现任意多次,因为它可以存储有关任意数量书籍的信息。

  • 在 IMS 数据库中,每种段类型仅出现一次,但每种段类型可以出现无限次。

IMS DB - DL/I 术语

分层数据库处理两个或多个段之间的关系。以下示例显示了 IMS 数据库结构中的段如何相互关联。

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 中的随机处理 -

随机处理

下面列出了随机处理的注意事项 -

  • 需要随机检索的段出现需要它所依赖的所有段的关键字段。这些关键字段由应用程序提供。

  • 连接键完全标识从根段到要检索的段的路径。

  • 假设您要检索 Commerce 细分的出现,则需要提供它所依赖的细分的串联关键字段值,例如 Library、Books 和 Commerce。

  • 随机处理比顺序处理更快。在现实场景中,应用程序将顺序处理方法和随机处理方法结合在一起以获得最佳结果。

关键字段

注意事项 -

  • 关键字段也称为序列字段。

  • 关键字段存在于段中,用于检索段出现的情况。

  • 关键字段按升序管理段的出现次数。

  • 在每个段中,只有一个字段可以用作关键字段或序列字段。

搜索栏

如前所述,只能将单个字段用作关键字段。如果要搜索非关键字段的其他段字段的内容,则用于检索数据的字段称为搜索字段。

IMS DB - 控制块

IMS 控制块定义 IMS 数据库的结构以及程序对它们的访问。下图显示了 IMS 控制块的结构。

控制块

DL/I 使用以下三种类型的控制块 -

  • 数据库描述符(DBD)
  • 程序规范块 (PSB)
  • 访问控制块 (ACB)

数据库描述符(DBD)

注意事项 -

  • 一旦定义了所有段,DBD 就会描述数据库的完整物理结构。

  • 安装 DL/I 数据库时,必须创建一个 DBD,因为需要访问 IMS 数据库。

  • 应用程序可以使用 DBD 的不同视图。它们称为应用程序数据结构,并在程序规范块中指定。

  • 数据库管理员通过编写DBDGEN控制语句来创建 DBD 。

数据库DGEN

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。

  • 第二个 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 表示仅 LOAD 操作。

  • 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 数据库。

  • 调用 DL/I 指定处理函数,例如获取、插入、删除、替换等。

  • 检查状态代码用于检查指定处理选项的 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应用程序的结构与Non-IMS应用程序的结构不同。IMS程序不能直接执行;相反,它总是作为子例程被调用。IMS 应用程序由程序规范块组成,以提供 IMS 数据库的视图。

当我们执行包含 IMS DL/I 模块的应用程序时,会加载应用程序和链接到该程序的 PSB。然后应用程序触发的CALL请求由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程序的Procedure Division中编码的。让我们详细了解 COBOL 程序中的入口语句 -

  • 批量初始化模块触发应用程序并在其控制下执行。

  • DL/I加载所需的控制块和模块以及应用程序,并将控制权交给应用程序。

  • DLITCBL 代表DL/I 到 COBOL。入口语句用于定义程序的入口点。

  • 当我们在COBOL中调用子程序时,也会提供它的地址。同样,当DL/I将控制权交给应用程序时,它还提供程序PSB中定义的每个PCB的地址。

  • 应用程序中使用的所有 PCB 都必须在 COBOL 程序的链接部分内定义,因为 PCB 位于应用程序之外。

  • 链接部分内的 PCB 定义称为PCB Mask

  • PCB 掩模与存储中的实际 PCB 之间的关系是通过在条目声明中列出 PCB 来创建的。条目声明中的列出顺序应与 PSBGEN 中出现的顺序相同。

返回声明

它用于将控制权传递回 IMS 控制程序。以下是 Goback 语句的语法 -

GOBACK

下面列出了有关 Goback 语句需要注意的基本要点 -

  • GOBACK 编码在应用程序的末尾。它将控制权从程序返回给 DL/I。

  • 我们不应该使用 STOP RUN,因为它将控制权返回给操作系统。如果我们使用 STOP RUN,DL/I 将永远没有机会执行其终止功能。这就是为什么在DL/I应用程序中使用Goback语句。

  • 在发出 Goback 语句之前,必须关闭 COBOL 应用程序中使用的所有非 DL/I 数据集,否则程序将异常终止。

认购声明

Call语句用于请求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 Mask。它们用在条目声明中。不需要 SELECT、ASSIGN、OPEN 或 CLOSE 语句。

3

段I/O区

输入/输出工作区的名称。这是应用程序的一个区域,DL/I 将请求的段放入其中。

4

段搜索参数

这些是可选参数,具体取决于发出的呼叫的类型。它们用于搜索 IMS 数据库内的数据段。

以下是有关 Call 语句的注意事项 -

  • 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 函数分为三类:Get、Update 和 Other 函数。让我们详细讨论它们中的每一个。

获取函数

获取函数类似于任何编程语言支持的读取操作。Get 函数用于从 IMS DL/I 数据库获取段。IMS DB 中使用以下 Get 函数 -

  • 变得独一无二
  • 下一步
  • 在父级中获取下一个
  • 保持独特
  • 抓住下一个
  • 在父级中保持下一步

让我们考虑以下 IMS 数据库结构来理解 DL/I 函数调用 -

IMS数据库1

变得独一无二

“GU”代码用于“获取唯一”功能。它的工作原理类似于 COBOL 中的随机读取语句。它用于根据字段值获取特定段的出现。可以使用段搜索参数来提供字段值。GU 调用的语法如下 -

CALL 'CBLTDLI' USING DLI-GU
                     PCB Mask
                     Segment I/O Area
                     [Segment Search Arguments]

如果通过为 COBOL 程序中的所有参数提供适当的值来执行上述调用语句,则可以从数据库中检索段 I/O 区域中的段。在上面的示例中,如果您提供“图书馆”、“杂志”和“健康”字段值,那么您将获得所需的“健康”段。

下一步

“GN”代码用于“获取下一个”功能。它的工作原理类似于 COBOL 中的 read next 语句。它用于获取序列中出现的段。用于访问数据段出现的预定义模式是沿着层次结构向下,然后从左到右。GN 调用的语法如下 -

CALL 'CBLTDLI' USING DLI-GN
                     PCB Mask
                     Segment I/O Area
                     [Segment Search Arguments]

如果通过为 COBOL 程序中的所有参数提供适当的值来执行上述调用语句,则可以按顺序从数据库中检索段 I/O 区域中出现的段。在上面的示例中,它首先访问 Library 段,然后访问 Books 段,依此类推。我们一次又一次地执行 GN 调用,直到到达我们想要的段出现位置。

在父级中获取下一个

“GNP”代码用于在父级中获取下一个。该函数用于按顺序检索从属于已建立的父段的段出现次数。GNP 调用的语法如下 -

CALL 'CBLTDLI' USING DLI-GNP
                     PCB Mask
                     Segment I/O Area
                     [Segment Search Arguments]

保持独特

“GHU”代码用于“获取唯一”。Hold 函数指定我们将在检索后更新该段。Get Hold Unique 函数对应于 Get Unique 调用。下面给出的是 GHU 调用的语法 -

CALL 'CBLTDLI' USING DLI-GHU
                     PCB Mask
                     Segment I/O Area
                     [Segment Search Arguments]

抓住下一个

“GHN”代码用于“获取下一步”。Hold 函数指定我们将在检索后更新该段。Get Hold Next 功能对应于 Get Next 调用。下面给出的是 GHN 调用的语法 -

CALL 'CBLTDLI' USING DLI-GHN
                     PCB Mask
                     Segment I/O Area
                     [Segment Search Arguments]

在父级中保持下一步

“GHNP”代码用于在父级中获取下一个。Hold 函数指定我们将在检索后更新该段。“Parent 内的 Get Hold Next”功能对应于“Parent 内的 Get Next”调用。下面给出的是 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”代码用于在父级中获取下一个。Replace 函数用于替换 IMS DL/I 数据库中的段。下面给出的是 REPL 调用的语法 -

CALL 'CBLTDLI' USING DLI-REPL
                     PCB Mask
                     Segment I/O Area
                     [Segment Search Arguments]

其他功能

IMS DL/I 调用中使用以下其他函数 -

  • 检查站
  • 重新开始
  • 印刷电路板

检查站

“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 函数用于 IMS DL/I 数据库中的 CICS 程序。下面给出的是 PCB 调用的语法 -

CALL 'CBLTDLI' USING DLI-PCB
                     PCB Mask
                     Segment I/O Area
                     [Segment Search Arguments]

您可以在恢复章节中找到有关这些功能的更多详细信息。

IMS DB - PCB 掩模

PCB 代表程序通信块。PCB Mask 是 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 写入语句中指定记录名称。不需要 SELECT、ASSIGN、OPEN 或 CLOSE 语句。

  • 每次 DL/I 调用后,DL/I 都会在 PCB 中存储一个状态代码,程序可以使用该代码来确定调用是成功还是失败。

电路板名称

注意事项 -

  • PCB名称是区域的名称,指的是PCB字段的整个结构。

  • PCB 名称用于程序语句中。

  • PCB 名称不是 PCB 中的字段。

数据库名称

注意事项 -

  • DBD 名称包含字符数据。它有八个字节长。

  • PCB 中的第一个字段是正在处理的数据库的名称,它提供来自与特定数据库关联的数据库描述库的 DBD 名称。

段级

注意事项 -

  • 段级别称为段层次级别指示器。它包含字符数据,长度为两个字节。

  • 段级别字段存储已处理的段的级别。当成功检索段时,此处存储检索到的段的级别号。

  • 段级别字段的值永远不会大于 15,因为这是 DL/I 数据库中允许的最大级别数。

状态码

注意事项 -

  • 状态码字段包含两个字节的字符数据。

  • 状态代码包含 DL/I 状态代码。

  • 当 DL/I 成功完成呼叫处理时,空格将移至状态代码字段。

  • 非空格值表示调用不成功。

  • 状态码GB表示文件结束,状态码GE表示未找到请求的段。

过程选项

注意事项 -

  • Proc 选项称为处理选项,包含四个字符的数据字段。

  • 处理选项字段指示程序被授权对数据库执行何种处理。

保留DL/I

注意事项 -

  • 保留的DL/I被称为IMS的保留区域。它存储四个字节的二进制数据。

  • IMS 使用该区域作为其自身与应用程序相关的内部链接。

段名称

注意事项 -

  • SEG Name被称为段名称反馈区。它包含 8 个字节的字符数据。

  • 每次 DL/I 调用后,段名称都存储在该字段中。

FB 密钥长度

注意事项 -

  • FB键长度被称为键反馈区域的长度。它存储四个字节的二进制数据。

  • 该字段用于报告上次调用期间处理的最低级别段的级联密钥的长度。

  • 它与按键反馈区域一起使用。

敏感段数

注意事项 -

  • 多个敏感段存储四个字节的二进制数据。

  • 它定义了应用程序对哪个级别敏感。它表示逻辑数据结构中段的数量。

关键反馈区

注意事项 -

  • 不同 PCB 的按键反馈区域长度各不相同。

  • 它包含可与数据库的程序视图一起使用的最长可能的串联键。

  • 数据库操作完成后,DL/I返回该字段中处理的最低级段的级联密钥,并在密钥长度反馈区中返回密钥的长度。

IMS数据库-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 提供段类型以及段的特定数据库出现。下面给出的是合格 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 个字节指定了我们要搜索的字段名称。

  • 在字段名称之后的第 1819位置,我们指定两字符关系运算符代码。

  • 然后我们指定字段值,在最后一个字节中,有一个右括号“)”。

下表显示了合格 SSA 中使用的关系运算符。

关系运算符 象征 描述
情商 = 平等的
东北 〜=〜 不等于
GT > 比...更棒
通用电气 >= 大于或等于
LT << 少于
LE <= 小于或等于

命令代码

命令代码用于增强 DL/I 调用的功能。命令代码减少了 DL/I 调用的数量,使程序变得简单。此外,随着调用次数的减少,它还提高了性能。下图显示了如何在不合格和合格的 SSA 中使用命令代码 -

不合格的SSA

命令代码要点如下:

  • 要使用命令代码,请在 SSA 的第 9位置指定一个星号,如上图所示。

  • 命令代码编码在第十位。

  • 从第 10位置开始,DL/I 将所有字符视为命令代码,直到遇到用于不合格 SSA 的空格和用于合格 SSA 的左括号。

下表显示了 SSA 中使用的命令代码列表 -

命令码 描述
C 级联键
D 路径调用
F 第一次出现
L 最后一次出现
路径调用忽略
设置亲子关系
入队段
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 调用中使用的各种数据检索方法如下:

  • 顾呼叫
  • GN 呼叫
  • 使用命令代码
  • 多重处理

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

IMS数据库1

顾呼叫

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

通用电气

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 调用后的相关状态代码 -

序列号 状态代码和描述
1

空间

通话成功

2

通用电气

DL/I 无法找到满足调用中指定条件的段。

3

遗传算法

不合格的 GN 调用会在数据库层次结构中向上移动一级以获取段。

4

国标

已到达数据库末尾,但未找到段。

吉克

不合格的 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 命令代码类似,但它限制对特定级别以及层次结构之上的所有级别的段的搜索。

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

Q 命令代码

注意事项 -

  • Q 命令代码用于排队或保留一个段供您的应用程序专用。

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

多重处理

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

  • 多个 PCB
  • 多重定位

多个 PCB

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

多重定位

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

IMS DB - 数据操作

IMS DL/I 调用中使用的不同数据操作方法如下:

  • ISRT 通话
  • 获取保持呼叫
  • REPL 调用
  • DLET 呼叫

让我们考虑以下 IMS 数据库结构来理解数据操作函数调用 -

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  - 如果规则是第一个,则新段将添加到任何现有孪生之前。

  • 最后 - 如果规则是最后一个,则新段将添加到所有现有孪生之后。

  • Here  - 如果规则位于此处,则将其添加到相对于现有双胞胎的当前位置,该位置可能是第一个、最后一个或任何位置。

状态代码

下表显示了 ISRT 调用后的相关状态代码 -

序列号 状态代码和描述
1

空间

通话成功

2

通用电气

使用多个SSA,DL/I无法满足指定路径的呼叫。

3

尝试添加数据库中已存在的段出现。

4

LB/LC LD/LE

我们在加载处理时获取这些状态代码。在大多数情况下,它们表明您没有按照精确的分层顺序插入段。

保持通话

注意事项 -

  • 我们在 DL/I 调用中指定了三种类型的 Get Hold 调用:

    • 保持独特 (GHU)

    • 抓住下一个 (GHN)

    • 在父级中保持下一步(GHNP)

  • Hold 函数指定我们将在检索后更新该段。因此,在 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 调用后的相关状态代码 -

序列号 状态代码和描述