IMS 数据库 – 快速指南

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 有四个数据字段。

Student
Roll Number 名称 课程 手机号码

场地

注意事项-

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

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

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

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

段类型

注意事项 –

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

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

数据库生成器

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。如果是 Root 段,则提及 PARENT=0。

下表显示了 FIELD 宏语句中使用的参数 –

S.No 参数及说明
1

Name

字段名称,通常为 1 到 8 个字符长

2

Bytes

字段长度

3

Start

段内字段的位置

4

Type

字段的数据类型

5

Type C

字符数据类型

6

Type P

压缩十进制数据类型

7

Type Z

分区十进制数据类型

8

Type X

十六进制数据类型

9

Type H

半字二进制数据类型

10

Type F

全字二进制数据类型

程序规范块 (PSB)

PSB 的基本原理如下 –

  • 数据库具有由 DBD 定义的单一物理结构,但处理它的应用程序可以拥有不同的数据库视图。这些视图称为应用程序数据结构,并在 PSB 中定义。

  • 任何程序在一次执行中都不能使用多个 PSB。

  • 应用程序有自己的PSB,具有相似数据库处理需求的应用程序共享一个PSB是很常见的。

  • PSB 由一个或多个称为程序通信块 (PCB) 的控制块组成。PSB 包含一个 PCB,用于应用程序将访问的每个 DL/I 数据库。我们将在接下来的模块中讨论更多关于 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 数据库 – 编程

包含 DL/I 调用的应用程序不能直接执行。相反,需要 JCL 来触发 IMS DL/I 批处理模块。IMS 中的批量初始化模块是 DFSRRC00。应用程序和DL/I 模块一起执行。下图显示了一个应用程序的结构,其中包括访问数据库的 DL/I 调用。

深度学习模块

应用程序通过以下程序元素与 IMS DL/I 模块接口 –

  • ENTRY 语句指定程序使用 PCB。

  • PCB 掩模与保存在从 IMS 接收返回信息的预构建 PCB 中的信息相关。

  • 输入-输出区域用于将数据段传入和传出 IMS 数据库。

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

  • Check Status Codes 用于检查指定处理选项的 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 应用程序的结构不同于非IMS 应用程序的结构。IMS 程序不能直接执行;相反,它总是被称为子程序。IMS 应用程序由提供 IMS 数据库视图的程序规范块组成。

当我们执行包含 IMS DL/I 模块的应用程序时,会加载应用程序和链接到该程序的 PSB。然后由应用程序触发的 CALL 请求由 IMS 模块执行。

IMS服务

应用程序使用以下 IMS 服务 –

  • 访问数据库记录
  • 发出 IMS 命令
  • 发出 IMS 服务调用
  • 检查点调用
  • 同步通话
  • 从在线用户终端发送或接收消息

IMS 数据库 – Cobol 基础知识

我们在 COBOL 应用程序中包含 DL/I 调用以与 IMS 数据库进行通信。我们在 COBOL 程序中使用以下 DL/I 语句来访问数据库 –

  • 入场声明
  • 返回声明
  • 调用声明

入场声明

它用于将控制权从 DL/I 传递到 COBOL 程序。这是入口语句的语法 –

ENTRY 'DLITCBL' USING pcb-name1
                     [pcb-name2]

上述语句在COBOL 程序过程分部编码让我们深入了解 COBOL 程序中 entry 语句的详细信息 –

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

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

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

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

  • 应用程序中使用的所有 PCB 都必须在 COBOL 程序Linkage Section内定义,因为 PCB 驻留在应用程序之外。

  • Linkage Section 内的 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]

上面的语法显示了可以与调用语句一起使用的参数。我们将在下表中讨论它们中的每一个 –

S.No. 参数及说明
1

DLI Function Code

标识要执行的 DL/I 功能。此参数是描述 I/O 操作的四个字符字段的名称。

2

PCB Mask

Linkage Section 内的 PCB 定义称为 PCB Mask。它们用于条目语句中。不需要 SELECT、ASSIGN、OPEN 或 CLOSE 语句。

3

Segment I/O Area

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

4

Segment Search Arguments

这些是可选参数,具体取决于发出的呼叫类型。它们用于搜索 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 数据库 – 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 和其他函数。让我们详细讨论它们中的每一个。

获取函数

Get 函数类似于任何编程语言都支持的读取操作。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 区域中的段。在上面的示例中,如果您提供 Library、Magazines 和 Health 的字段值,那么您将获得 Health 段的期望出现次数。

下一步

“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’ 代码用于 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’ 代码用于在父级中获取下一个。Hold 函数指定我们将在检索后更新段。Get Hold Next inside Parent 函数对应于 Get Next inside Parent 调用。下面给出的是 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”代码用于在父级中获取下一个保持。替换功能用于替换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 语句在 Linkage Section 中的 PCB 掩码和程序 PSB 中的 PCB 之间创建连接。DL/I 调用中使用的 PCB 掩码指示要使用哪个数据库进行操作。

  • 您可以假设这类似于在 COBOL READ 语句中指定文件名或在 COBOL write 语句中指定记录名。不需要 SELECT、ASSIGN、OPEN 或 CLOSE 语句。

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

电路板名称

注意事项 –

  • PCB Name是区域的名称,指的是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 的语法 –

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 个字节包含用于处理的段名称。

  • 第 9 个字节是左括号 ‘(‘。

  • 从第十个位置开始的接下来的 8 个字节指定我们要搜索的字段名称。

  • 字段名后,在 18th 和 19th 位置,我们指定两个字符的关系运算符代码。

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

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

Relational Operator 象征 描述
EQ = 平等的
NE ~= ~ 不相等
GT > 比…更棒
GE >= 大于或等于
LT << 少于
LE <= 小于或等于

命令代码

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

不合格的ssa

命令代码的要点如下 –

  • 要使用命令代码,请在 9th SSA 的位置,如上图所示。

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

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

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

Command Code 描述
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 调用中使用的各种数据检索方法如下 –

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

S.No 状态代码和描述
1

Spaces

通话成功

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

Spaces

通话成功

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

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

Q 命令代码

注意事项 –

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

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

多重处理

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

  • 多块PCB
  • 多重定位

多块PCB

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

多重定位

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

IMS 数据库 – 数据操作

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  – 如果规则是 first,则在任何现有双胞胎之前添加新段。

  • Last  – 如果规则是最后一个,则在所有现有双胞胎之后添加新段。

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

状态代码

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

S.No 状态代码和描述
1

Spaces

通话成功

2

GE

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

3

II

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

4

LB / LC LD / LE

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

获取保持呼叫

注意事项 –

  • 我们在 DL/I 呼叫中指定了三种类型的获取保持呼叫:

    • 保持独特 (GHU)

    • 下一步 (GHN)

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

  • Hold 函数指定我们将在检索后更新段。因此,在 REPL 或 DLET 调用之前,必须发出成功的保持调用,告知 DL/I 更新数据库的意图。

REPL 调用

注意事项 –

  • 在成功获取保持调用后,我们发出 REPL 调用以更新段出现。

  • 我们不能使用 REPL 调用更改段的长度。

  • 我们无法使用 REPL 调用更改键字段的值。

  • 我们不能在 REPL 调用中使用合格的 SSA。如果我们指定一个合格的 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 调用以删除段出现。

  • 我们不能在 DLET 调用中使用合格的 SSA。如果我们指定一个合格的 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 调用后的相关状态代码 –

S.No 状态代码和描述
1

Spaces

通话成功

2

AJ

用于 REPL 或 DLET 调用的合格 SSA。

3

DJ

程序发出一个替换调用,而没有紧接在前面的 get 保持调用。

4

DA

程序在发出 REPL 或 DLET 调用之前对段的键字段进行更改

IMS 数据库 – 二级索引

当我们想要访问数据库而不使用完整的连接键或者当我们不想使用序列主字段时,使用二级索引。

索引指针段

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 实现逻辑关系,其中一个段可以同时具有物理和逻辑父级。我们可以在一个物理数据库中创建额外的关系。实现逻辑关系后的新数据结构称为逻辑数据库。

逻辑关系

逻辑关系具有以下属性 –

  • 逻辑关系是逻辑上而非物理上相关的两个段之间的路径。

  • 通常在不同的数据库之间建立逻辑关系。但是在一个特定数据库的段之间可能存在关系。

下图显示了两个不同的数据库。一个是学生数据库,另一个是图书馆数据库。我们在来自 Student 数据库的 Books Issued 段和来自 Library 数据库的 Books 段之间创建逻辑关系。

标准和图书馆数据库

这是创建逻辑关系时逻辑数据库的外观 –

逻辑数据库

逻辑子段

逻辑子段是逻辑关系的基础。它是一个物理数据段,但对于 DL/I,它看起来好像有两个父级。上例中的 Books 段有两个父段。已发行图书段是逻辑父级,图书馆段是物理父级。一个逻辑子段出现只有一个逻辑父段出现,一个逻辑父段出现可以有多个逻辑子段出现。

逻辑孪生

逻辑双胞胎是逻辑子段类型的出现,它们都从属于逻辑父段类型的单个出现。DL/I 使逻辑子段看起来类似于实际的物理子段。这也称为虚拟逻辑子段。

逻辑关系的类型

DBA 在段之间创建逻辑关系。为了实现逻辑关系,DBA 必须在涉及的物理数据库的 DBDGEN 中指定它。有三种类型的逻辑关系 –

  • 单向
  • 双向虚拟
  • 双向物理

单向

逻辑连接从逻辑子节点到逻辑父节点,不能反过来。

双向虚拟

它允许双向访问。物理结构中的逻辑子节点和相应的虚拟逻辑子节点可以看作是成对的段。

双向物理

逻辑子节点是物理存储的从属,从属于它的物理父节点和逻辑父节点。对于应用程序来说,它的出现方式与双向虚拟逻辑子节点相同。

编程注意事项

使用逻辑数据库的编程注意事项如下 –

  • 访问数据库的 DL/I 调用也与逻辑数据库保持一致。

  • 程序规范块指示我们在调用中使用的结构。在某些情况下,我们无法确定我们正在使用逻辑数据库。

  • 逻辑关系为数据库编程增加了一个新维度。

  • 使用逻辑数据库时必须小心,因为两个数据库集成在一起。如果您修改一个数据库,则相同的修改必须反映在另一个数据库中。

  • 程序规范应指明允许对数据库进行哪些处理。如果违反处理规则,您会得到一个非空白状态代码。

连接段

逻辑子段始终以目标父级的完整串联键开始。这称为目标父级连接密钥 (DPCK)。您需要始终在逻辑子级的段 I/O 区域的开始处对 DPCK 进行编码。在逻辑数据库中,级联段在不同物理数据库中定义的段之间建立连接。连接段由以下两部分组成 –

  • 逻辑子段
  • 目的地父段

逻辑子段由以下两部分组成 –

  • 目标父级连接密钥 (DPCK)
  • 逻辑子用户数据

逻辑孩子

当我们在更新期间处理连接段时,可以通过一次调用在逻辑子级和目标父级中添加或更改数据。这也取决于 DBA 为数据库指定的规则。对于插入件,在正确的位置提供 DPCK。对于替换或删除,不要更改连接段任一部分中的 DPCK 或序列字段数据。

IMS 数据库 – 恢复

数据库管理员需要为系统故障时的数据库恢复做计划。故障可以有多种类型,例如应用程序崩溃、硬件错误、电源故障等。

简单的方法

数据库恢复的一些简单方法如下 –

  • 定期备份重要数据集,以便保留针对数据集发布的所有交易。

  • 如果数据集由于系统故障而损坏,则可以通过恢复备份副本来纠正该问题。然后将累积的事务重新发布到备份副本以使其保持最新状态。

简单方法的缺点

简单的数据库恢复方法的缺点如下 –

  • 重新发布累积的交易会消耗大量时间。

  • 所有其他应用程序都需要等待执行,直到恢复完成。

  • 如果涉及逻辑和二级索引关系,数据库恢复比文件恢复要长。

异常终止程序

DL/I 程序崩溃的方式与标准程序崩溃的方式不同,因为标准程序是由操作系统直接执行的,而 DL/I 程序则不是。通过使用异常终止例程,系统会进行干扰,以便在异常结束 (ABEND) 之后进行恢复。异常终止例程执行以下操作 –

  • 关闭所有数据集
  • 取消队列中的所有待处理作业
  • 创建存储转储以找出 ABEND 的根本原因

此例程的局限性在于它不能确保使用的数据是否准确。

DL/I 日志

当应用程序异常终止时,需要恢复应用程序所做的更改,纠正错误,并重新运行应用程序。为此,需要有 DL/I 日志。以下是有关 DL/I 日志记录的要点 –

  • DL/I 将应用程序所做的所有更改记录在称为日志文件的文件中。

  • 当应用程序改变一个段时,DL/I 创建它的前映像和后映像。

  • 这些段映像可用于恢复段,以防应用程序崩溃。

  • DL/I 使用一种称为预写日志记录的技术来记录数据库更改。使用预写式日志记录,数据库更改会在写入实际数据集之前先写入日志数据集。

  • 由于日志始终位于数据库之前,因此恢复实用程序可以确定任何数据库更改的状态。

  • 当程序执行更改数据库段的调用时,DL/I 负责其日志记录部分。

恢复 – 向前和向后

数据库恢复的两种方法是 –

  • Forward Recovery  – DL/I 使用日志文件来存储更改数据。使用此日志文件重新发布累积的事务。

  • 向后恢复– 向后恢复也称为回退恢复。程序的日志记录是向后读取的,它们在数据库中的影响是相反的。回退完成后,数据库处于与故障前相同的状态,假设在此期间没有其他应用程序更改数据库。

检查站

检查点是应用程序完成的数据库更改被认为是完整和准确的阶段。下面列出了有关检查点的注意事项 –

  • 在最近的检查点之前所做的数据库更改不会被反向恢复逆转。

  • 在前向恢复期间,在最近的检查点之后记录的数据库更改不会应用于数据库的映像副本。

  • 使用检查点方法,当恢复过程完成时,数据库将恢复到最近检查点的状态。

  • 批处理程序的默认设置是检查点是程序的开头。

  • 可以使用检查点调用 (CHKP) 来建立检查点。

  • 检查点调用会导致将检查点记录写入 DL/I 日志。

下面显示的是 CHKP 调用的语法 –

CALL 'CBLTDLI' USING DLI-CHKP
                     PCB-NAME
                     CHECKPOINT-ID

有两种检查点方法 –

  • 基本检查点– 它允许程序员发出 DL/I 恢复实用程序在恢复处理期间使用的检查点调用。

  • 符号检查点– 它是一种高级形式的检查点,与扩展重启工具结合使用。符号检查点和扩展重新启动一起让应用程序员对程序进行编码,以便他们可以在检查点之后的点继续处理。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁