IMS DB - Краткое руководство
Краткий обзор
База данных представляет собой набор коррелированных элементов данных. Эти элементы данных организованы и хранятся таким образом, чтобы обеспечить быстрый и легкий доступ. База данных IMS - это иерархическая база данных, в которой данные хранятся на разных уровнях, и каждый объект зависит от объектов более высокого уровня. Физические элементы прикладной системы, использующей IMS, показаны на следующем рисунке.
Управление базами данных
Система управления базой данных - это набор прикладных программ, используемых для хранения, доступа и управления данными в базе данных. Система управления базами данных IMS поддерживает целостность и позволяет быстро восстанавливать данные, организовывая их таким образом, чтобы их было легко получить. IMS поддерживает большое количество мировых корпоративных данных с помощью своей системы управления базами данных.
Менеджер транзакций
Функция диспетчера транзакций заключается в обеспечении платформы связи между базой данных и прикладными программами. IMS выступает в роли менеджера транзакций. Диспетчер транзакций работает с конечным пользователем для хранения и извлечения данных из базы данных. IMS может использовать IMS DB или DB2 в качестве внутренней базы данных для хранения данных.
DL / I - интерфейс языка данных
DL / I состоит из прикладных программ, которые предоставляют доступ к данным, хранящимся в базе данных. IMS DB использует DL / I, который служит языком интерфейса, который программисты используют для доступа к базе данных в прикладной программе. Мы обсудим это более подробно в следующих главах.
Характеристики IMS
На заметку -
- IMS поддерживает приложения на разных языках, таких как Java и XML.
- Доступ к приложениям и данным IMS можно получить с любой платформы.
- Обработка СУБД IMS выполняется очень быстро по сравнению с DB2.
Ограничения IMS
На заметку -
- Внедрение IMS DB очень сложно.
- Предопределенная древовидная структура IMS снижает гибкость.
- СУБД IMS сложно управлять.
Иерархическая структура
База данных IMS - это набор данных, содержащих физические файлы. В иерархической базе данных самый верхний уровень содержит общую информацию об объекте. По мере продвижения от верхнего уровня к нижнему в иерархии мы получаем все больше и больше информации о сущности.
Каждый уровень иерархии содержит сегменты. В стандартных файлах сложно реализовать иерархии, но DL / I поддерживает иерархии. На следующем рисунке изображена структура IMS DB.
Сегмент
На заметку -
Сегмент создается путем объединения похожих данных.
Это наименьшая единица информации, которую DL / I передает в прикладную программу и из нее во время любой операции ввода-вывода.
Сегмент может содержать одно или несколько полей данных, сгруппированных вместе.
В следующем примере сегмент Student имеет четыре поля данных.
Студент | |||
---|---|---|---|
Номер рулона | имя | Курс | Номер мобильного |
Поле
На заметку -
Поле - это отдельный фрагмент данных в сегменте. Например, номер опроса, имя, курс и номер мобильного телефона - это отдельные поля в сегменте «Студент».
Сегмент состоит из связанных полей для сбора информации об объекте.
Поля можно использовать как ключ для упорядочивания сегментов.
Поля можно использовать в качестве квалификатора для поиска информации о конкретном сегменте.
Тип сегмента
На заметку -
Тип сегмента - это категория данных в сегменте.
База данных DL / I может иметь 255 различных типов сегментов и 15 уровней иерархии.
На следующем рисунке представлены три сегмента, а именно: Библиотека, Информация о книгах и Информация о студентах.
Вхождение сегмента
На заметку -
Вхождение сегмента - это отдельный сегмент определенного типа, содержащий пользовательские данные. В приведенном выше примере информация о книгах - это один тип сегмента, и его может быть любое количество вхождений, так как он может хранить информацию о любом количестве книг.
В базе данных 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 из прикладной программы. Мы подробно обсудим звонки DL / I в следующих главах. Данные можно обрабатывать двумя способами:
- Последовательная обработка
- Случайная обработка
Последовательная обработка
Когда сегменты последовательно извлекаются из базы данных, DL / I следует заранее заданному шаблону. Давайте разберемся с последовательной обработкой IMS DB.
Ниже перечислены моменты, которые следует учитывать при последовательной обработке.
Предустановленный шаблон для доступа к данным в DL / I сначала идет вниз по иерархии, затем слева направо.
Сначала извлекается корневой сегмент, затем DL / I перемещается к первому левому дочернему элементу и спускается до самого нижнего уровня. На самом низком уровне извлекаются все вхождения сегментов-близнецов. Затем он переходит в правый сегмент.
Чтобы лучше понять, обратите внимание на стрелки на рисунке выше, которые показывают поток доступа к сегментам. Библиотека - это корневой сегмент, и поток начинается оттуда и продолжается до машин для доступа к одной записи. Тот же процесс повторяется для всех экземпляров, чтобы получить все записи данных.
При доступе к данным программа использует position в базе данных, которая помогает извлекать и вставлять сегменты.
Случайная обработка
Случайная обработка также известна как прямая обработка данных в IMS DB. Давайте рассмотрим пример, чтобы понять случайную обработку в IMS DB -
Ниже перечислены моменты, которые следует учитывать при произвольной обработке.
Вхождение сегмента, который необходимо извлекать случайным образом, требует ключевых полей всех сегментов, от которых он зависит. Эти ключевые поля предоставляются прикладной программой.
Объединенный ключ полностью определяет путь от корневого сегмента до сегмента, который вы хотите получить.
Предположим, вы хотите получить вхождение сегмента Commerce, а затем вам необходимо предоставить объединенные значения ключевых полей для сегментов, от которых он зависит, таких как Library, Books и Commerce.
Случайная обработка быстрее последовательной. В реальных условиях приложения объединяют методы последовательной и случайной обработки для достижения наилучших результатов.
Ключевое поле
На заметку -
Ключевое поле также известно как поле последовательности.
В сегменте присутствует ключевое поле, которое используется для извлечения вхождения сегмента.
Ключевое поле управляет появлением сегмента в возрастающем порядке.
В каждом сегменте только одно поле может использоваться как ключевое поле или поле последовательности.
Поле поиска
Как уже упоминалось, только одно поле может использоваться в качестве ключевого поля. Если вы хотите найти содержимое других полей сегмента, не являющихся ключевыми, то поле, которое используется для извлечения данных, называется полем поиска.
Блоки управления IMS определяют структуру базы данных IMS и доступ программы к ним. На следующей схеме показана структура блоков управления IMS.
DL / I использует следующие три типа блоков управления -
- Дескриптор базы данных (DBD)
- Блок спецификации программы (PSB)
- Блок управления доступом (ACB)
Дескриптор базы данных (DBD)
На заметку -
DBD описывает полную физическую структуру базы данных после определения всех сегментов.
При установке базы данных DL / I необходимо создать одну DBD, поскольку она необходима для доступа к базе данных IMS.
Приложения могут использовать разные представления DBD. Они называются структурами данных приложения и указываются в блоке спецификации программы.
Администратор базы данных создает DBD путем кодирования DBDGEN контрольные заявления.
DBDGEN
DBDGEN - это генератор дескрипторов базы данных. За создание контрольных блоков отвечает администратор базы данных. Все загрузочные модули хранятся в библиотеке IMS. Операторы макроса языка ассемблера используются для создания блоков управления. Ниже приведен пример кода, который показывает, как создать DBD с помощью управляющих операторов DBDGEN.
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 для доступа к этой базе данных.
Второй оператор макроса DATASET определяет файл, содержащий базу данных.
Типы сегментов определяются с помощью макроса SEGM. Нам нужно указать РОДИТЕЛЯ этого сегмента. Если это корневой сегмент, укажите 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 содержит одну печатную плату для каждой базы данных DL / I, к которой будет обращаться прикладная программа. Мы обсудим больше о печатных платах в следующих модулях.
PSBGEN необходимо выполнить, чтобы создать PSB для программы.
PSBGEN
PSBGEN известен как генератор блоков спецификации программ. В следующем примере создается PSB с использованием PSBGEN -
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), который описывает тип базы данных, имя, длину ключа и параметр обработки.
Параметр DBDNAME в макросе платы определяет имя DBD. KEYLEN определяет длину самого длинного сцепленного ключа. Программа может обрабатывать в базе данных. Параметр PROCOPT указывает параметры обработки программы. Например, LS означает только операции ЗАГРУЗКИ.
SENSEG известен как чувствительность на уровне сегмента. Он определяет доступ программы к частям базы данных и идентифицируется на уровне сегмента. Программа имеет доступ ко всем полям в сегментах, к которым она чувствительна. Программа также может иметь чувствительность на уровне поля. В этом мы определяем имя сегмента и родительское имя сегмента.
Последний оператор макроса - PCBGEN. PSBGEN - это последний оператор, говорящий, что больше нет операторов для обработки. PSBNAME определяет имя, данное выходному модулю PSB. Параметр LANG указывает язык, на котором написана прикладная программа, например COBOL.
Блок управления доступом (ACB)
Ниже перечислены моменты, на которые следует обратить внимание о блоках управления доступом.
Блоки управления доступом для прикладной программы объединяют дескриптор базы данных и блок спецификации программы в исполняемую форму.
ACBGEN известен как генератор блоков контроля доступа. Он используется для генерации ACB.
Для онлайн-программ нам необходимо предварительно создать ACB. Следовательно, утилита ACBGEN выполняется перед выполнением прикладной программы.
Для пакетных программ ACB также могут быть сгенерированы во время выполнения.
Прикладная программа, которая включает вызовы DL / I, не может выполняться напрямую. Вместо этого для запуска пакетного модуля IMS DL / I требуется JCL. Модуль пакетной инициализации в IMS - DFSRRC00. Прикладная программа и модуль DL / I выполняются вместе. На следующей диаграмме показана структура прикладной программы, которая включает вызовы DL / I для доступа к базе данных.
Прикладная программа взаимодействует с модулями IMS DL / I через следующие программные элементы:
Оператор ENTRY указывает, что печатные платы используются программой.
Маска печатной платы соотносится с информацией, хранящейся в заранее созданной печатной плате, которая получает информацию о возврате от 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 отличается от структуры прикладной программы не-IMS. Программа IMS не может быть выполнена напрямую; скорее это всегда вызывается как подпрограмма. Прикладная программа IMS состоит из блоков спецификации программы, обеспечивающих представление базы данных IMS.
Прикладная программа и связанные с ней PSB загружаются, когда мы выполняем прикладную программу, которая включает модули IMS DL / I. Затем запросы CALL, инициированные прикладными программами, выполняются модулем IMS.
Услуги IMS
Прикладная программа использует следующие службы IMS:
- Доступ к записям базы данных
- Выдача команд IMS
- Выполнение сервисных вызовов IMS
- Звонки с КПП
- Синхронизировать звонки
- Отправка или получение сообщений с онлайн-пользовательских терминалов
Мы включаем вызовы DL / I в прикладную программу COBOL для связи с базой данных IMS. Мы используем следующие операторы DL / I в программе COBOL для доступа к базе данных:
- Заявление о въезде
- Заявление о возврате
- Заявление о звонке
Заявление о въезде
Он используется для передачи управления от DL / I программе COBOL. Вот синтаксис оператора входа -
ENTRY 'DLITCBL' USING pcb-name1
[pcb-name2]
Вышеприведенное утверждение закодировано в Procedure Divisionпрограммы COBOL. Давайте углубимся в детали оператора входа в программу COBOL -
Модуль пакетной инициализации запускает прикладную программу и выполняется под ее управлением.
DL / I загружает требуемые блоки и модули управления, а также прикладную программу, а управление передается прикладной программе.
DLITCBL означает DL/I to COBOL. Оператор входа используется для определения точки входа в программу.
Когда мы вызываем подпрограмму в COBOL, также указывается ее адрес. Аналогичным образом, когда DL / I передает управление прикладной программе, он также предоставляет адрес каждой печатной платы, определенной в PSB программы.
Все печатные платы, используемые в прикладной программе, должны быть определены внутри Linkage Section программы COBOL, потому что печатная плата находится вне прикладной программы.
Определение PCB внутри секции Linkage называется PCB Mask.
Связь между масками печатных плат и фактическими печатными платами в хранилище создается путем перечисления печатных плат в операторе ввода. Последовательность перечисления в операторе входа должна быть такой же, как в PSBGEN.
Заявление о возврате
Он используется для передачи управления обратно программе управления IMS. Ниже приведен синтаксис оператора Goback -
GOBACK
Ниже перечислены основные моменты, которые следует отметить в отношении заявления Goback.
GOBACK кодируется в конце прикладной программы. Он возвращает управление DL / I из программы.
Мы не должны использовать STOP RUN, поскольку он возвращает управление операционной системе. Если мы используем STOP RUN, DL / I никогда не сможет выполнить свои завершающие функции. Вот почему в прикладных программах DL / I используется оператор Goback.
Перед выполнением оператора Goback все наборы данных, не относящиеся к DL / I, используемые в прикладной программе COBOL, должны быть закрыты, в противном случае программа завершится ненормально.
Заявление о звонке
Оператор вызова используется для запроса услуг 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. Этот аргумент - имя четырех символьных полей, описывающих операцию ввода-вывода. |
2 | PCB Mask Определение печатной платы внутри секции Linkage называется маской печатной платы. Они используются в заявлении на вход. Никаких операторов SELECT, ASSIGN, OPEN или CLOSE не требуется. |
3 | Segment I/O Area Имя рабочей области ввода / вывода. Это область прикладной программы, в которую DL / I помещает запрошенный сегмент. |
4 | Segment Search Arguments Это необязательные параметры, зависящие от типа отправленного вызова. Они используются для поиска сегментов данных в базе данных IMS. |
Ниже приведены моменты, которые следует отметить в отношении оператора Call -
CBLTDLI означает COBOL to DL/I. Это имя интерфейсного модуля, который редактируется по ссылке с объектным модулем вашей программы.
После каждого вызова DL / I DLI сохраняет код состояния на плате. Программа может использовать этот код, чтобы определить, был ли вызов успешным или неудачным.
пример
Чтобы лучше понять COBOL, вы можете прочитать наше руководство по COBOL здесь . В следующем примере показана структура программы COBOL, которая использует базу данных IMS и вызовы DL / I. Мы подробно обсудим каждый из параметров, используемых в примере, в следующих главах.
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.
Функция DL / I - это первый параметр, который используется в вызове DL / I. Эта функция сообщает, какая операция будет выполнена в базе данных IMS с помощью вызова IMS DL / I. Синтаксис функции 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 программист должен закодировать одно из имен данных уровня 05, например DLI-GU, в вызове DL / I, поскольку COBOL не позволяет кодировать литералы в операторе CALL.
Функции DL / I делятся на три категории: получение, обновление и другие функции. Обсудим подробно каждый из них.
Получить функции
Функции получения аналогичны операции чтения, поддерживаемой любым языком программирования. Функция Get используется для выборки сегментов из базы данных IMS DL / I. Следующие функции Get используются в IMS DB -
- Стать уникальным
- Получить дальше
- Получить следующий в родительском
- Get Hold Unique
- Держись дальше
- Держитесь дальше в родительском
Давайте рассмотрим следующую структуру базы данных IMS, чтобы понять вызовы функций DL / I:
Стать уникальным
Код GU используется для функции Get Unique. Он работает аналогично оператору случайного чтения в COBOL. Он используется для получения вхождения определенного сегмента на основе значений поля. Значения полей могут быть предоставлены с использованием аргументов поиска сегмента. Синтаксис вызова GU следующий:
CALL 'CBLTDLI' USING DLI-GU
PCB Mask
Segment I/O Area
[Segment Search Arguments]
Если вы выполните приведенный выше оператор вызова, указав соответствующие значения для всех параметров в программе COBOL, вы можете получить сегмент в области ввода-вывода сегмента из базы данных. В приведенном выше примере, если вы предоставите значения полей «Библиотека», «Журналы» и «Здоровье», вы получите желаемое вхождение сегмента «Здоровье».
Получить дальше
Код GN используется для функции Get Next. Он работает аналогично оператору read next в COBOL. Он используется для выборки вхождений сегментов в последовательности. Предопределенный шаблон для доступа к экземплярам сегментов данных - вниз по иерархии, затем слева направо. Синтаксис вызова GN следующий:
CALL 'CBLTDLI' USING DLI-GN
PCB Mask
Segment I/O Area
[Segment Search Arguments]
Если вы выполните приведенный выше оператор вызова, указав соответствующие значения для всех параметров в программе COBOL, вы можете получить вхождение сегмента в области ввода-вывода сегмента из базы данных в последовательном порядке. В приведенном выше примере он начинается с доступа к сегменту библиотеки, затем сегменту книг и так далее. Мы выполняем вызов GN снова и снова, пока не достигнем нужного вхождения сегмента.
Получить следующий в родительском
Код GNP используется для Get Next в Parent. Эта функция используется для получения вхождений сегментов в последовательности, подчиненной установленному родительскому сегменту. Синтаксис вызова GNP следующий:
CALL 'CBLTDLI' USING DLI-GNP
PCB Mask
Segment I/O Area
[Segment Search Arguments]
Get Hold Unique
Код GHU используется для Get Hold Unique. Функция удержания указывает, что мы собираемся обновить сегмент после извлечения. Функция Get Hold Unique соответствует вызову Get Unique. Ниже приведен синтаксис вызова GHU -
CALL 'CBLTDLI' USING DLI-GHU
PCB Mask
Segment I/O Area
[Segment Search Arguments]
Держись дальше
Код GHN используется для Get Hold Next. Функция удержания указывает, что мы собираемся обновить сегмент после извлечения. Функция Get Hold Next соответствует вызову Get Next. Ниже приведен синтаксис вызова GHN -
CALL 'CBLTDLI' USING DLI-GHN
PCB Mask
Segment I/O Area
[Segment Search Arguments]
Держитесь дальше в родительском
Код GHNP используется для Get Hold Next в родительском элементе. Функция удержания указывает, что мы собираемся обновить сегмент после извлечения. Функция Get Hold Next within Parent соответствует вызову Get Next within Parent. Ниже приведен синтаксис вызова GHNP -
CALL 'CBLTDLI' USING DLI-GHNP
PCB Mask
Segment I/O Area
[Segment Search Arguments]
Функции обновления
Функции обновления аналогичны операциям перезаписи или вставки в любом другом языке программирования. Функции обновления используются для обновления сегментов в базе данных IMS DL / I. Перед использованием функции обновления должен быть успешный вызов с предложением Hold для вхождения сегмента. Следующие функции обновления используются в IMS DB -
- Insert
- Delete
- Replace
Вставить
Код ISRT используется для функции Insert. Функция 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 используется для Get Hold Next в родительском элементе. Функция «Заменить» используется для замены сегмента в базе данных IMS DL / I. Ниже приведен синтаксис вызова REPL -
CALL 'CBLTDLI' USING DLI-REPL
PCB Mask
Segment I/O Area
[Segment Search Arguments]
Прочие функции
В вызовах IMS DL / I используются следующие другие функции:
- Checkpoint
- Restart
- PCB
Контрольно-пропускной пункт
Код «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 используется в программах CICS в базе данных IMS DL / I. Ниже приведен синтаксис вызова платы -
CALL 'CBLTDLI' USING DLI-PCB
PCB Mask
Segment I/O Area
[Segment Search Arguments]
Вы можете найти более подробную информацию об этих функциях в главе о восстановлении.
PCB расшифровывается как Program Communication Block. PCB Mask - второй параметр, используемый в вызове DL / I. Это заявлено в разделе ссылок. Ниже приведен синтаксис маски печатной платы -
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 и платами внутри PSB программы. Маски печатной платы, используемые в вызове DL / I, указывают, какую базу данных использовать для работы.
Вы можете предположить, что это похоже на указание имени файла в операторе COBOL READ или имени записи в операторе записи COBOL. Никаких операторов SELECT, ASSIGN, OPEN или CLOSE не требуется.
После каждого вызова DL / I DL / I сохраняет код состояния на плате, и программа может использовать этот код, чтобы определить, был ли вызов успешным или неудачным.
Название печатной платы
На заметку -
PCB Name - это имя области, которая относится ко всей структуре полей платы.
Имя платы используется в операторах программы.
Имя платы не является полем на плате.
Имя DBD
На заметку -
Имя DBD содержит символьные данные. Его длина составляет восемь байтов.
Первое поле на плате - это имя обрабатываемой базы данных, и оно предоставляет имя DBD из библиотеки описаний базы данных, связанной с конкретной базой данных.
Уровень сегмента
На заметку -
Уровень сегмента известен как индикатор уровня иерархии сегментов. Он содержит символьные данные и имеет длину два байта.
В поле уровня сегмента хранится уровень обработанного сегмента. Когда сегмент получен успешно, здесь сохраняется номер уровня извлеченного сегмента.
Поле уровня сегмента никогда не имеет значения больше 15, потому что это максимальное количество уровней, разрешенное в базе данных DL / I.
Код состояния
На заметку -
Поле кода состояния содержит два байта символьных данных.
Код состояния содержит код состояния DL / I.
Пробелы перемещаются в поле кода состояния, когда DL / I успешно завершает обработку вызовов.
Непустые значения указывают на то, что вызов не был успешным.
Код состояния GB указывает на конец файла, а код состояния GE указывает, что запрошенный сегмент не найден.
Параметры Proc
На заметку -
Параметры обработки известны как параметры обработки, которые содержат четырехсимвольные поля данных.
В поле «Вариант обработки» указывается, какой вид обработки программа имеет право выполнять в базе данных.
Зарезервировано DL / I
На заметку -
Зарезервированный DL / I известен как зарезервированная область IMS. Он хранит четырехбайтовые двоичные данные.
IMS использует эту область для своей внутренней связи с прикладной программой.
Название сегмента
На заметку -
Имя SEG известно как область обратной связи имени сегмента. Он содержит 8 байтов символьных данных.
Имя сегмента сохраняется в этом поле после каждого вызова DL / I.
Длина ключа FB
На заметку -
Длина клавиши FB известна как длина области обратной связи клавиши. Он хранит четыре байта двоичных данных.
Это поле используется для сообщения длины сцепленного ключа сегмента самого нижнего уровня, обработанного во время предыдущего вызова.
Он используется с ключевой областью обратной связи.
Количество сегментов чувствительности
На заметку -
Количество сегментов чувствительности хранит четырехбайтовые двоичные данные.
Он определяет, к какому уровню чувствительна прикладная программа. Он представляет собой количество сегментов в логической структуре данных.
Основная область обратной связи
На заметку -
Зона обратной связи ключа различается по длине от платы к плате.
Он содержит максимально длинный сцепленный ключ, который может использоваться с программой просмотра базы данных.
После операции с базой данных DL / I возвращает объединенный ключ сегмента самого нижнего уровня, обработанного в этом поле, и возвращает длину ключа в области обратной связи длины ключа.
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 следующие:
Первые 8 байтов квалифицированного SSA содержат имя сегмента, используемого для обработки.
Девятый байт - левая скобка '('.
Следующие 8 байтов, начиная с десятой позиции, определяют имя поля, которое мы хотим найти.
После того, как имя поля, в 18 - е и 19 - е позиции, мы задаем два-символьный код реляционной оператора.
Затем мы указываем значение поля и в последнем байте стоит правая скобка ')'.
В следующей таблице показаны реляционные операторы, используемые в квалифицированном SSA.
Оператор отношения | Условное обозначение | Описание |
---|---|---|
Эквалайзер | знак равно | Равно |
NE | ~ = ˜ | Не равный |
GT | > | Лучше чем |
GE | > = | Больше или равно |
LT | << | Меньше, чем |
LE | <= | Меньше или равно |
Коды команд
Коды команд используются для расширения функциональности вызовов DL / I. Коды команд сокращают количество вызовов DL / I, делая программы простыми. Кроме того, это улучшает производительность, поскольку количество вызовов уменьшается. На следующем изображении показано, как коды команд используются в неквалифицированных и квалифицированных SSA.
Ключевые моменты командных кодов следующие:
Чтобы использовать коды команд, укажите звездочку в 9- й позиции SSA, как показано на изображении выше.
Код команды закодирован в десятой позиции.
Начиная с 10- й позиции, DL / I считает все символы кодами команд, пока не встретит пробел для неквалифицированного SSA и левой круглой скобки для квалифицированного SSA.
В следующей таблице показан список кодов команд, используемых в SSA -
Код команды | Описание |
---|---|
C | Составной ключ |
D | Путь вызова |
F | Первое появление |
L | Последнее появление |
N | Игнорировать вызов пути |
п | Установить отцовство |
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 DL / I используются следующие различные методы извлечения данных:
- GU Call
- GN Call
- Использование кодов команд
- Множественная обработка
Давайте рассмотрим следующую структуру базы данных IMS, чтобы понять вызовы функций извлечения данных:
GU Call
Основы вызова GU следующие -
Вызов GU известен как Get Unique call. Он используется для случайной обработки.
Если приложение не обновляет базу данных регулярно или если количество обновлений базы данных меньше, мы используем случайную обработку.
Вызов GU используется для размещения указателя в определенной позиции для дальнейшего последовательного поиска.
Вызовы GU не зависят от позиции указателя, установленной предыдущими вызовами.
Обработка вызовов GU основана на уникальных ключевых полях, указанных в операторе вызова.
Если мы предоставляем ключевое поле, которое не является уникальным, то DL / I возвращает первое вхождение сегмента ключевого поля.
CALL 'CBLTDLI' USING DLI-GU
PCB-NAME
IO-AREA
LIBRARY-SSA
BOOKS-SSA
ENGINEERING-SSA
IT-SSA
В приведенном выше примере показано, что мы выполняем вызов GU, предоставляя полный набор квалифицированных SSA. Он включает в себя все ключевые поля, начиная с корневого уровня до вхождения сегмента, который мы хотим получить.
Рекомендации по вызову GU
Если мы не предоставим полный набор квалифицированных SSA в вызове, то DL / I работает следующим образом:
Когда мы используем неквалифицированный SSA в вызове GU, DL / I обращается к первому вхождению сегмента в базе данных, которое соответствует указанным вами критериям.
Когда мы выполняем вызов GU без каких-либо SSA, DL / I возвращает первое вхождение корневого сегмента в базе данных.
Если некоторые SSA на промежуточных уровнях не упоминаются в вызове, то DL / I использует либо установленную позицию, либо значение по умолчанию неквалифицированного SSA для сегмента.
Коды состояния
В следующей таблице показаны соответствующие коды состояния после вызова GU -
S.No | Код состояния и описание |
---|---|
1 | Spaces Успешный звонок |
2 | GE DL / Мне не удалось найти сегмент, соответствующий критериям, указанным в звонке |
GN Call
Основы GN call следующие:
Вызов 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 -
S.No | Код состояния и описание |
---|---|
1 | Spaces Успешный звонок |
2 | GE DL / мне не удалось найти сегмент, соответствующий критериям, указанным в вызове. |
3 | GA Неквалифицированный вызов GN перемещается на один уровень вверх в иерархии базы данных для выборки сегмента. |
4 | GB Достигнут конец базы данных, а сегмент не найден. |
GK Неквалифицированный вызов GN пытается получить сегмент определенного типа, отличного от только что полученного, но остается на том же иерархическом уровне. |
Коды команд
Коды команд используются с вызовами для получения вхождения сегмента. Ниже обсуждаются различные коды команд, используемые с вызовами.
Код команды F
На заметку -
Когда в вызове указан код команды F, вызов обрабатывает первое вхождение сегмента.
Коды команд F можно использовать, когда мы хотим обрабатывать последовательно, и его можно использовать с вызовами GN и вызовами GNP.
Если мы укажем код команды F с вызовом GU, он не будет иметь никакого значения, поскольку по умолчанию 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
На заметку -
Когда код команды U указан в неквалифицированном SSA в вызове GN, DL / I ограничивает поиск сегмента.
Код команды U игнорируется, если он используется с квалифицированным SSA.
Код команды V
На заметку -
Код команды V работает аналогично коду команды U, но ограничивает поиск сегмента на определенном уровне и на всех уровнях выше иерархии.
Код команды V игнорируется при использовании с квалифицированным SSA.
Код команды Q
На заметку -
Код команды Q используется для постановки в очередь или резервирования сегмента для исключительного использования вашей прикладной программы.
Код команды Q используется в интерактивной среде, где другая программа может вносить изменения в сегмент.
Множественная обработка
Программа может иметь несколько позиций в базе данных 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
В приведенном выше примере показано, что мы выполняем вызов ISRT, предоставляя комбинацию квалифицированных и неквалифицированных SSA.
Когда новый сегмент, который мы вставляем, имеет уникальное ключевое поле, он добавляется в нужную позицию. Если ключевое поле не уникально, то оно добавляется в соответствии с правилами, определенными администратором базы данных.
Когда мы выполняем вызов ISRT без указания ключевого поля, тогда правило вставки сообщает, где разместить сегменты относительно существующих двойных сегментов. Ниже приведены правила вставки -
First - Если правило первое, новый сегмент добавляется перед любыми существующими двойниками.
Last - Если правило последнее, новый сегмент добавляется после всех существующих близнецов.
Here - Если правило здесь, оно добавляется в текущей позиции относительно существующих близнецов, которые могут быть первыми, последними или где угодно.
Коды состояния
В следующей таблице показаны соответствующие коды состояния после вызова ISRT.
S.No | Код состояния и описание |
---|---|
1 | Spaces Успешный звонок |
2 | GE Используются несколько SSA, и DL / I не может удовлетворить вызов с указанным путем. |
3 | II Попробуйте добавить вхождение сегмента, который уже присутствует в базе данных. |
4 | LB / LC LD / LE Эти коды состояния мы получаем во время обработки загрузки. В большинстве случаев они указывают на то, что вы не вставляете сегменты в точной иерархической последовательности. |
Получить вызов на удержание
На заметку -
Существует три типа вызова Get Hold, которые мы указываем в вызове DL / I:
Get Hold Уникальный (GHU)
Держись дальше (GHN)
Get Hold Next в родительском (GHNP)
Функция удержания указывает, что мы собираемся обновить сегмент после извлечения. Поэтому перед вызовом 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.
В приведенном выше примере обновляется вхождение сегмента IT с помощью вызова REPL. Сначала мы выполняем вызов 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.
В приведенном выше примере удаляется вхождение сегмента IT с помощью вызова DLET. Сначала мы вызываем GHU, чтобы получить вхождение сегмента, который мы хотим удалить. Затем мы выполняем вызов DLET для обновления значений этого сегмента.
Коды состояния
В следующей таблице показаны соответствующие коды состояния после вызова REPL или DLET.
S.No | Код состояния и описание |
---|---|
1 | Spaces Успешный звонок |
2 | AJ Квалифицированный SSA, используемый для вызова REPL или DLET. |
3 | DJ Программа выполняет вызов замены без предшествующего вызова удержания. |
4 | DA Программа вносит изменение в ключевое поле сегмента перед вызовом REPL или DLET. |
Вторичное индексирование используется, когда мы хотим получить доступ к базе данных без использования полного сцепленного ключа или когда мы не хотим использовать первичные поля последовательности.
Сегмент указателя индекса
DL / I сохраняет указатель на сегменты индексированной базы данных в отдельной базе данных. Сегмент указателя индекса - единственный тип вторичного индекса. Он состоит из двух частей -
- Префиксный элемент
- Элемент данных
Префиксный элемент
Префиксная часть сегмента указателя индекса содержит указатель на целевой сегмент индекса. Целевой сегмент индекса - это сегмент, доступный с помощью вторичного индекса.
Элемент данных
Элемент данных содержит значение ключа из сегмента индексированной базы данных, по которому строится индекс. Это также известно как сегмент источника индекса.
Вот ключевые моменты, которые следует отметить о вторичном индексировании -
Исходный сегмент индекса и целевой исходный сегмент не обязательно должны совпадать.
Когда мы настраиваем вторичный индекс, он автоматически поддерживается DL / I.
Администратор базы данных определяет множество вторичных индексов в соответствии с путями множественного доступа. Эти вторичные индексы хранятся в отдельной базе данных индексов.
Нам не следует создавать дополнительные вторичные индексы, поскольку они накладывают дополнительную нагрузку на обработку DL / I.
Вторичные ключи
На заметку -
Поле в исходном сегменте индекса, по которому строится вторичный индекс, называется вторичным ключом.
Любое поле можно использовать как вторичный ключ. Это не обязательно должно быть поле последовательности сегментов.
Вторичные ключи могут быть любой комбинацией отдельных полей в исходном сегменте индекса.
Значения вторичных ключей не обязательно должны быть уникальными.
Вторичные структуры данных
На заметку -
Когда мы строим вторичный индекс, очевидная иерархическая структура базы данных также изменяется.
Целевой сегмент индекса становится очевидным корневым сегментом. Как показано на следующем изображении, инженерный сегмент становится корневым сегментом, даже если он не является корневым сегментом.
Перестройка структуры базы данных, вызванная вторичным индексом, известна как вторичная структура данных.
Вторичные структуры данных не вносят никаких изменений в основную физическую структуру базы данных, присутствующую на диске. Это всего лишь способ изменить структуру базы данных перед прикладной программой.
Независимый оператор 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. Когда мы создаем вторичные индексы, задействованы две базы данных. Администратору баз данных необходимо создать два DBD, используя два DBDGEN для создания связи между индексированной базой данных и вторичной индексированной базой данных.
Требования PSBGEN
После создания вторичного индекса для базы данных администратору базы данных необходимо создать PSB. PSBGEN для программы указывает правильную последовательность обработки для базы данных в параметре PROCSEQ макроса PSB. Для параметра PROCSEQ администратор базы данных кодирует имя DBD для базы данных вторичного индекса.
В базе данных IMS есть правило, согласно которому у каждого типа сегмента может быть только один родитель. Это ограничивает сложность физической базы данных. Многие приложения DL / I требуют сложной структуры, которая позволяет сегменту иметь два родительских типа. Чтобы преодолеть это ограничение, DL / I позволяет администратору баз данных реализовывать логические отношения, в которых сегмент может иметь как физических, так и логических родителей. Мы можем создавать дополнительные отношения в одной физической базе данных. Новая структура данных после реализации логической связи известна как логическая база данных.
Логическая связь
Логическая связь имеет следующие свойства -
Логическая связь - это путь между двумя сегментами, которые связаны логически, а не физически.
Обычно между отдельными базами данных устанавливается логическая связь. Но возможна связь между сегментами одной конкретной базы данных.
На следующем изображении показаны две разные базы данных. Одна - это база данных студентов, а другая - база данных библиотеки. Мы создаем логическую связь между сегментом «Книги, выданные» из базы данных учеников и сегментом «Книги» из базы данных библиотеки.
Вот как выглядит логическая база данных, когда вы создаете логические отношения -
Логический дочерний сегмент
Логический дочерний сегмент - основа логической связи. Это физический сегмент данных, но для DL / I кажется, что у него есть два родителя. Сегмент "Книги" в приведенном выше примере имеет два родительских сегмента. Сегмент выпущенных книг является логическим родителем, а сегмент библиотеки - физическим родителем. Одно вхождение логического дочернего сегмента имеет только одно вхождение логического родительского сегмента, а одно вхождение логического родительского сегмента может иметь множество вхождений логического дочернего сегмента.
Логические близнецы
Логические близнецы - это вхождения типа логического дочернего сегмента, которые все подчинены одному вхождению типа логического родительского сегмента. DL / I делает логический дочерний сегмент похожим на реальный физический дочерний сегмент. Это также известно как виртуальный логический дочерний сегмент.
Типы логических отношений
Администратор базы данных создает логические отношения между сегментами. Для реализации логической взаимосвязи администратор базы данных должен указать ее в DBDGEN для задействованных физических баз данных. Есть три типа логических отношений -
- Unidirectional
- Двунаправленный виртуальный
- Двунаправленный физический
Однонаправленный
Логическое соединение идет от логического потомка к логическому родителю и не может быть наоборот.
Двунаправленный виртуальный
Это позволяет доступ в обоих направлениях. Логический дочерний элемент по своей физической структуре и соответствующий виртуальный логический дочерний элемент можно рассматривать как парные сегменты.
Двунаправленный физический
Логический ребенок - это физически сохраненный подчиненный как своим физическим, так и логическим родителям. Для прикладных программ он выглядит так же, как двунаправленный виртуальный логический дочерний элемент.
Соображения по программированию
Соображения по программированию для использования логической базы данных следующие:
Вызовы DL / I для доступа к базе данных остаются такими же, как и для логической базы данных.
Блок спецификации программы указывает структуру, которую мы используем в наших вызовах. В некоторых случаях мы не можем определить, что используем логическую базу данных.
Логические отношения добавляют новое измерение в программирование баз данных.
Вы должны быть осторожны при работе с логическими базами данных, так как две базы данных интегрированы вместе. Если вы изменяете одну базу данных, те же изменения должны быть отражены в другой базе данных.
Спецификации программы должны указывать, какая обработка разрешена в базе данных. Если правило обработки нарушено, вы получите непустой код состояния.
Составной сегмент
Логический дочерний сегмент всегда начинается с полного сцепленного ключа целевого родителя. Это называется объединенным родительским ключом назначения (DPCK). Вам необходимо всегда кодировать DPCK в начале области ввода-вывода вашего сегмента для логического дочернего элемента. В логической базе данных объединенный сегмент устанавливает соединение между сегментами, которые определены в разных физических базах данных. Объединенный сегмент состоит из следующих двух частей -
- Логический дочерний сегмент
- Целевой родительский сегмент
Логический дочерний сегмент состоит из следующих двух частей -
- Конкатенированный родительский ключ назначения (DPCK)
- Логические дочерние пользовательские данные
Когда мы работаем с конкатенированными сегментами во время обновления, можно добавить или изменить данные как в логическом дочернем, так и в целевом родительском элементе с помощью одного вызова. Это также зависит от правил, установленных администратором базы данных для базы данных. Для вставки установите DPCK в правильном положении. Для замены или удаления не изменяйте DPCK или данные поля последовательности ни в одной части объединенного сегмента.
Администратору базы данных необходимо спланировать восстановление базы данных в случае сбоев системы. Сбои могут быть разных типов, например, сбои приложений, аппаратные ошибки, сбои питания и т. Д.
Простой подход
Вот некоторые простые подходы к восстановлению базы данных:
Периодически создавайте резервные копии важных наборов данных, чтобы все транзакции, проводимые с наборами данных, сохранялись.
Если набор данных поврежден из-за сбоя системы, эта проблема устраняется путем восстановления резервной копии. Затем накопленные транзакции повторно разносятся в резервную копию, чтобы привести их в актуальное состояние.
Недостатки простого подхода
Недостатки простого подхода к восстановлению базы данных следующие:
Повторная проводка накопленных транзакций отнимает много времени.
Всем остальным приложениям необходимо дождаться выполнения, пока не завершится восстановление.
Восстановление базы данных занимает больше времени, чем восстановление файлов, если задействованы логические и вторичные отношения индекса.
Процедуры ненормального завершения
Сбой программы DL / I отличается от сбоя стандартной программы, поскольку стандартная программа выполняется непосредственно операционной системой, а программа DL / I - нет. Используя процедуру аварийного завершения, система вмешивается, так что восстановление может быть выполнено после аварийного завершения (ABEND). Процедура аварийного завершения выполняет следующие действия:
- Закрывает все наборы данных
- Отменяет все незавершенные задания в очереди
- Создает дамп хранилища, чтобы выяснить основную причину ABEND
Ограничение этой процедуры состоит в том, что она не гарантирует, являются ли используемые данные точными или нет.
DL / I журнал
Когда прикладная программа ABEND отказывается, необходимо отменить изменения, сделанные прикладной программой, исправить ошибку и повторно запустить прикладную программу. Для этого необходим журнал DL / I. Вот ключевые моменты о ведении журнала DL / I -
DL / I записывает все изменения, сделанные прикладной программой, в файл, который известен как файл журнала.
Когда прикладная программа изменяет сегмент, DL / I создает его изображения до и после.
Эти образы сегментов можно использовать для восстановления сегментов в случае сбоя прикладной программы.
DL / I использует технику, называемую упреждающей записью, для записи изменений в базе данных. При ведении журнала с упреждающей записью изменение базы данных записывается в набор данных журнала до того, как оно будет записано в фактический набор данных.
Поскольку журнал всегда опережает базу данных, утилиты восстановления могут определять статус любого изменения базы данных.
Когда программа выполняет вызов для изменения сегмента базы данных, DL / I заботится о его части регистрации.
Восстановление - вперед и назад
Два подхода к восстановлению базы данных:
Forward Recovery - DL / I использует файл журнала для хранения данных об изменениях. Накопленные транзакции повторно разносятся с использованием этого файла журнала.
Backward Recovery- Обратное восстановление также известно как восстановление после отмены. Записи журнала для программы читаются в обратном порядке, и их влияние в базе данных отменяется. Когда откат завершен, базы данных находятся в том же состоянии, в котором они были до сбоя, при условии, что за это время никакая другая прикладная программа не изменила базу данных.
Контрольно-пропускной пункт
Контрольная точка - это этап, на котором изменения базы данных, внесенные прикладной программой, считаются полными и точными. Ниже перечислены моменты, на которые следует обратить внимание о контрольно-пропускном пункте.
Изменения базы данных, сделанные до последней контрольной точки, не отменяются обратным восстановлением.
Изменения базы данных, зарегистрированные после последней контрольной точки, не применяются к копии базы данных во время прямого восстановления.
Используя метод контрольной точки, база данных восстанавливается до состояния на последней контрольной точке, когда процесс восстановления завершается.
По умолчанию для пакетных программ контрольной точкой является начало программы.
Контрольную точку можно установить с помощью вызова контрольной точки (CHKP).
Вызов контрольной точки вызывает запись контрольной точки в журнал DL / I.
Ниже показан синтаксис вызова CHKP -
CALL 'CBLTDLI' USING DLI-CHKP
PCB-NAME
CHECKPOINT-ID
Есть два метода контрольной точки -
Basic Checkpointing - Это позволяет программисту выполнять вызовы контрольных точек, которые утилиты восстановления DL / I используют во время обработки восстановления.
Symbolic Checkpointing- Это расширенная форма контрольных точек, которая используется в сочетании с функцией расширенного перезапуска. Символическая контрольная точка и расширенный перезапуск вместе позволяют прикладному программисту кодировать программы так, чтобы они могли возобновить обработку в точке сразу после контрольной точки.