Вы находитесь на странице: 1из 22

Программы на Kоболе и базы данных IMS

Оглавление
Предисловие и список рекомендуемой документации..............................3
Разработка прикладных программ на КОБОЛЕ, которые работают с базами данных IMS3
Программа первоначальной загрузки базы данных................................4
Исходный текст программы.......................................................4
Задание на трансляцию и создание загрузочного модуля программы................5
Блок DBD.......................................................................6
DBD для базы данных HISAM.....................................................6
Генерация DBD.................................................................7
Блок PSB.......................................................................8
Определение...................................................................8
Генерация PSB.................................................................9
Выполнение программы первоначальной загрузки...................................9
Задание на загрузку базы данных HISAM.......................................10
Входной набор данных для загрузки............................................11
Результат выполнения программы для метода HISAM..............................11
Программа выборки (чтения) базы данных......................................12
Исходный текст программы......................................................12
Задание на трансляцию и создание загрузочного модуля программы выборки.......12
Блок DBD......................................................................13
Блок PSB......................................................................13
Выполнение программы выборки..................................................13
Задание для выполнения.......................................................13
Результат выполнения.........................................................14
Программа добавления сегментов в базу данных................................14
Исходный текст программы......................................................14
Задание на трансляцию и создание загрузочного модуля программы добавления....16
Блок DBD......................................................................17
Блок PSB......................................................................17
Выполнение программы добавления сегментов.....................................17
Задание для выполнения - HISAM..............................................18
Входной набор данных для программы добавления сегментов......................18
Результат выполнения программы добавления сегментов – файл PRINTOUT..........19
Реализация нескольких бизнес-процессов работы с базой данных больниц........19
Поступил пациент..............................................................19
Пациенту назначен доктор......................................................19
Проведено обследование, установлен диагноз....................................19
Пациенту назначено лечение....................................................20
Пациента выписывают из больницы...............................................20
DBDGEN utility..............................................................20
IMS access method HISAM - VSAM data sets......................................20
Приложение. Примеры ошибок при выполнения программы загрузки................22

Page 1 of 22
Программы на Kоболе и базы данных IMS
Пример 1. Неправильное определение буферного пула для VSAM...................22
Пример 2. Нарушение последовательности ключей при загрузке...................23

Page 2 of 22
Программы на Kоболе и базы данных IMS

Предисловие и список рекомендуемой документации


Данный документ содержит примеры работы с базами данных IMS с помощью программ на
Коболе в среде z/OS.
Используются следующие программные пакеты
- z/OS 1.9
- IMS Version 8 Release 1
- Enterprise COBOL for z/OS. Version 3 Release 4
Приведенные в примерах имена наборов данных являются точной копией имен, которые
используются для выполнения в вышеуказанной среде используемого сервере ИБА. При
переносе в другую среду должны быть изменены.
Ниже приведены документы, которые необходимы для работы:
o Информацию о структуре базы данных и об особенностях работы с различными
методами доступа IMS можно найти в документе
IMS Version 8. Administration Guide: Database Manager. Document Number SC27-
1283-00. Program Number 5655-C56
o Информацию о том, как разрабатывать прикладные программы, работающие с базами
данных IMS, можно найти в документе
IMS. Application Programming: Database Manager. Version 8. Document Number
SC27-1286-04. Program Number 5655-C56
o Информацию об управляющих блоках IMS можно найти в документе
IMS Version 8. Utilities Reference: System. Document Number SC27-1309-00.
Program Number 5655-C56
o Информацию о компиляции, редактировании и выполнении программ можно найти в
документе
IMS Version 8. Installation Volume 2: System Definition and Tailoring. Document
Number GC27-1298-00. Program Number 5655-C56
o Информацию об ошибках и других ситуациях, которые возникают при выполнении
программы, можно найти в документах
IMS Version 8. Messages and Codes Volume 1. Document Number GC27-1301-00.
Program Number 5655-C56
IMS Version 8. Messages and Codes Volume 2. Document Number GC27-1302-00.
Program Number 5655-C56
o Информацию, специфическую для используемого компилятора Кобола, можно найти в
соответствующем руководстве по программированию, например
Enterprise COBOL for z/OS. Programming Guide. Version 3 Release 3. Document
Number SC27-1412-02. Program Number 5655-G53

Разработка прикладных программ на КОБОЛЕ, которые работают с базами


данных IMS
Прежде, чем начать изучение предложенных ниже программ на КОБОЛЕ, рекомендуется
ознакомиться с общими положениями, которые можно найти в документе
IMS. Application Programming: Database Manager. Version 8. Document Number SC27-
1286-04. Program Number 5655-C56.
Особенно полезны следующие разделы:
1.1 How Application Programs Work with the IMS Database Manager
1.2 Writing Your Application Programs
1.3.1 Formatting DL/I Calls for Language Interfaces
1.3.4 Application Programming for COBOL
1.3.9 Specifying the DB PCB Mask
1.3.13 Specifying the I/O Areas
1.3.14 Segment Search Arguments

Page 3 of 22
Программы на Kоболе и базы данных IMS
1.3.17 Specifying the Language Specific Entry Point
1.4 Writing DL/I Calls for Database Management
1.6 Monitoring Your Position in the Database

Программа первоначальной загрузки базы данных


Вообще говоря, первоначальная загрузка и, в особенности, построение управляющих
блоков, является ответственностью не прикладного программиста, а администратора
базы данных. Но прикладному программисту будет трудно работать, не понимая этого
процесса.
В данном разделе приведен небольшой пример, с которого можно начинать изучение
данного предмета.

Исходный текст программы


Программа загрузки не зависит от метода доступа IMS, который используется для
построения базы данных. Физическая организация базы данных определяется
управляющим блоком DBD. А способ доступа программы к базе данных – управляющим
блоком PSB.
Во время загрузки включаемые в базу данных сегменты должны следовать в правильной
иерерхической последовательности. Представленная программа читает сегменты из
исходного набора данных. Информация каждого сегмента находится в двух
последовательных записях входного набора данных.
Значение статус-кода при загрузке
LB — сегмент уже существует
LC — значения ключей не упорядочены
LD — для загружаемого сегмента нет исходного(parent) сегмента
LE — сегменты не упорядочены по типам
Программа не проводит анализ статус-кода (status-code), который устанавливается
как результат выполнения каждого вызова DL/1.
Если статус-код равен пробелу, выполнение программы продолжается. В противном
случае программа завершается после попытки загрузить сегмент, в результате которой
был установлен статус-код, отличный от пробела.
Несколько примеров ошибочных ситуаций при загрузке приведены в Приложении.
*************************************************
* This program performs initial loading IMS data base
* Loaded segments are read from input file
*************************************************
id division.
program-id. dbload.
environment division.

input-output section.
file-control.
select card-file assign to cards.

data division.
file section.
fd card-file
label records are omitted.
01 card.
03 seg-name pic x(8).
03 card-data pic x(64).
03 filler pic x(8).

working-storage section.

77 isrt pic x(4) value 'ISRT'.


77 line-count pic s99 value 50 comp-3.

Page 4 of 22
Программы на Kоболе и базы данных IMS
01 unqual-ssa.
03 segname pic x(8).
03 filler pic x value ' '.

01 i-o-area.
03 first-half pic x(64).
03 second-half pic x(64).

linkage section.

01 pcb-mask.
03 dbdname pic x(8).
03 level-number pic xx.
03 status-code pic xx.
03 proc-options pic xxxx.
03 jcb-address pic xxxx.
03 segnent-name pic x(8).
03 key-length pic s9(5) comp.
03 number-segs pic s9(5) comp.
03 key-feedback.
05 hospname-key pic x(20).
05 wardno-key pic xx.
05 bedident-key pic xxxx.

procedure division.
start-of-program.
entry 'dlitcbl' using pcb-mask.

begin-here.
open input card-file.

* read segment info


read-card.
read card-file at end go to end-of-job.
move card-data to first-half.
display card.
read card-file at end go to end-of-job.
display card.
move card-data to second-half.
move seg-name of card to segname of unqual-ssa.

************************************************************
* Insert a read segment into data base using unqualified SSA
* Segments should be in the proper hierarchical sequence
************************************************************
call 'cbltdli' using isrt
pcb-mask
i-o-area
unqual-ssa.
if status-code is not equal to space
go to bad-status
else
go to read-card
end-if.

bad-status.
display 'bad status', status-code.
end-of-job.
close card-file.
goback.

Задание на трансляцию и создание загрузочного модуля программы


Используется Enterprise COBOL for z/OS V3R4

Page 5 of 22
Программы на Kоболе и базы данных IMS
Задание использует каталогизированную процедуру IGYWCL, которая поставляется с
библиотекой IGY.SIGYPROC
Специфические операторы DD на шаге редактирования необходимы для присоединения
модулей и интерфейса IMS :
- //SDFSRESL DD DSN=IMS910.SDFSRESL,DISP=SHR
Эта библиотека содержит модули IMS SVC.
- //SYSIN DD DSN=IMS910.PROCLIB(CBLTDLI),DISP=SHR
К обычному набору данных SYSLIN с помощью SYSIN присоединяется библиотека
процедур IMS. Раздел CBLTDLI этой библиотеки содержит управляющие
операторы редактора связей, которые необходимы для присоединения к
выполняемой программе модулей интерфейса IMS-COBOL.
Подробное описание операторов DD, необходимых для компиляции, редактирования и
выполнения программ, работающих с IMS, можно найти в документе
o IMS Version 8. Installation Volume 2: System Definition and Tailoring. Document
Number GC27-1298-00. Program Number 5655-C56

//COBIMSCL JOB ,GEV,


// TIME=(1),MSGLEVEL=(1,1),MSGCLASS=H,CLASS=A
//PROCLIB JCLLIB ORDER=IGY.SIGYPROC
//*---------------------------------------------------------------------
//* COMPILE AND LINK COBOL & IMS PROGRAM
//* ENTERPRIZE COBOL FOR Z/OS V3R4
//* IMS V9R1
//*---------------------------------------------------------------------
//COMPL EXEC IGYWCL,LNGPRFX='IGY',REGION=0M,
// PARM='LIST,LIB,NODYNAM,RENT,XREF,NOLIST'
//COBOL.SYSIN DD DSN=GEV.IMS.COBOL(DBLOAD),DISP=SHR
//LKED.SYSLMOD DD DSN=GEV.IMS.PGMLIB(DBLOAD),DISP=SHR
//LKED.SDFSRESL DD DSN=IMS910.SDFSRESL,DISP=SHR
//LKED.SYSIN DD DSN=IMS910.PROCLIB(CBLTDLI),DISP=SHR

Последующие задания на выполнение программы не зависят от используемой версии


Кобола.

Блок DBD
Один и тот же блок DBD можно использовать как при загрузке, так и при обработке
базы данных.
Ниже приведены макрокоманды ассемблера(операторы утилиты DBDGEN), которые
используются для описания базы данных с использованием различных методов доступа
IMS.
Подробную информацию об утилите и ее операторах можно найти в документе
o IMS Version 8. Utilities Reference: System. Document Number SC27-1309-
00.Program Number 5655-C56
При загрузке базы данных значения явно заданных или сгенерированных параметров
BLOCK и RECORD оператора DATASET должны быть равны значениям, которые указаны
параметрами LRECL и BLKSIZE соответствующих операторов DD. Иначе программа
завершается с IMS status-code=AI.
Некоторые особенности процесса генерации, которые получены при реальной работе,
можно найти в разделе “DBDGEN utility”. В частности, используемая длина записи
получена в процессе генерации и извлечена из листинга генерации.

DBD для базы данных HISAM


DBD NAME=HDBHISAM,ACCESS=(HISAM,VSAM)
DATASET DD1=PRIME,OVFLW=OVF
*
SEGM NAME=HOSPITAL,PARENT=0,BYTES=60
FIELD NAME=(HOSPNAME,SEQ,U),BYTES=20,START=1,TYPE=C

Page 6 of 22
Программы на Kоболе и базы данных IMS
SEGM NAME=WARD,PARENT=HOSPITAL,BYTES=31
FIELD NAME=(WARDNO,SEQ,U),BYTES=2,START=1,TYPE=C
FIELD NAME=BEDAVAIL,BYTES=3,START=9,TYPE=C
FIELD NAME=WARDTYPE,BYTES=20,START=12,TYPE=C
SEGM NAME=PATIENT,PARENT=WARD,BYTES=125
FIELD NAME=(BEDIDENT,SEQ,U),BYTES=4,START=61,TYPE=C
FIELD NAME=PATNAME,BYTES=20,START=1,TYPE=C
FIELD NAME=DATEADMT,BYTES=6,START=65,TYPE=C
SEGM NAME=SYMPTOM,PARENT=PATIENT,BYTES=77
FIELD NAME=(SYMPDATE,SEQ),BYTES=6,START=21,TYPE=C
FIELD NAME=DIAGNOSE,BYTES=20,START=1,TYPE=C
SEGM NAME=TREATMNT,PARENT=PATIENT,BYTES=113
FIELD NAME=(TRDATE,SEQ),BYTES=6,START=21,TYPE=C
FIELD NAME=TRTYPE,BYTES=20,START=1,TYPE=C
SEGM NAME=DOCTOR,PARENT=PATIENT,BYTES=80
FIELD NAME=DOCTNAME,BYTES=20,START=1,TYPE=C
FIELD NAME=SPECIALT,BYTES=20,START=61,TYPE=C
SEGM NAME=FACILITY,PARENT=HOSPITAL,BYTES=26
FIELD NAME=FACTYPE,BYTES=20,START=1,TYPE=C
FIELD NAME=FACAVAIL,BYTES=3,START=24,TYPE=C
*
DBDGEN
FINISH
END

Как видно, в операторе DATASET не указаны параметры, которые управляют размером


записи базы данных. В этом случае размер записи подсчитывается при генерации и
выводится в качестве рекомендации в листинге трансляции. Затем эта информация
используется в соответствующих операторах DD задания на выполнения программы
загрузки (см. ниже раздел “Выполнение программы первоначальной загрузки”).
+*,* * * * * * * * * * * * * * * * * * * * * * * *
+*,*
+*,* RECOMMENDED VSAM DEFINE CLUSTER PARAMETERS
+*,*
+*,* * * * * * * * * * * * * * * * * * * * * * * *
+*,* * * * * * * * * * * * * * * * * * * * * * * *
+*,*
+*,* *NOTE1
+*,* DEFINE CLUSTER (NAME(PRIME) -
+*,* INDEXED KEYS (20,6) -
+*,* RECORDSIZE (194,194)) -
+*,* DATA (CONTROLINTERVALSIZE (4096))
+*,*
+*,* *NOTE1 - SHOULD SPECIFY DSNAME FOR DD PRIME
+*,*
+*,* * * * * * * * * * * * * * * * * * * * * * * *
+*,* * * * * * * * * * * * * * * * * * * * * * * *
+*,*
+*,* *NOTE2
+*,* DEFINE CLUSTER (NAME(OVF) NONINDEXED -
+*,* RECORDSIZE (194,194) -
+*,* CONTROLINTERVALSIZE (4096))
+*,*
+*,* *NOTE2 - SHOULD SPECIFY DSNAME FOR DD OVF
+*,*
+*,* * * * * * * * * * * * * * * * * * * * * * * *

Генерация DBD
Ниже приведено задание для генерации блока DBD. Оно создано на основе процедуры
DBDGEN, которая поставляется в библиотеке IMS910.PROCLIB.
На шаге компиляции подключается библиотека SDFSMAC, которая, в частности, содержит
определение макрокоманды DBDGEN.

Page 7 of 22
Программы на Kоболе и базы данных IMS
Задание универсально с точностью до имен а операторах DD SYSIN и SYSLMOD.
//DBDGEN1 JOB ,'GEV',
// TIME=(1),MSGLEVEL=(1,1),MSGCLASS=H,CLASS=A
//*
//* DBD GENERATION
//* IMS V9R1
//*
//* ASSEMBLER STEP
//*
//C EXEC PGM=ASMA90,
// PARM=(OBJECT,NODECK,NODBCS,
// 'SIZE(MAX,ABOVE)')
//SYSLIB DD DSN=IMS910.SDFSMAC,DISP=SHR
//SYSLIN DD UNIT=SYSDA,DISP=(,PASS),
// SPACE=(80,(100,100),RLSE),
// DCB=(BLKSIZE=80,RECFM=F,LRECL=80)
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD UNIT=SYSDA,DISP=(,DELETE),
// SPACE=(CYL,(10,5))
//SYSIN DD DSN=GEV.IMS.DBDPSB(HDBHISAM),DISP=SHR
//*
//* LINK EDITING
//*
//L EXEC PGM=IEWL,PARM='XREF,LIST',
// COND=(0,LT,C),REGION=4M
//SYSLIN DD DSN=*.C.SYSLIN,DISP=(OLD,DELETE)
//SYSPRINT DD SYSOUT=*
//SYSLMOD DD DISP=SHR, DSN=GEV.IMS.DBDLIB(HDBHISAM)
//SYSUT1 DD UNIT=(SYSDA,SEP=(SYSLMOD,SYSLIN)),
// SPACE=(1024,(100,10),RLSE),DISP=(,DELETE)

Блок PSB

Определение
Ниже приведены макрокоманды ассемблера(операторы утилиты PSBGEN), которые
используются для построения PSB первоначальной загрузки.
Как видно, PSB не зависит от используемого метода доступа. Все физические
характеристики находятся в DBD. Блок PSB лишь ссылается на этот DBD, указывая его
имя.
Оператор PCB блока PSB, который используется для первоначальной загрузки базы
данных, должен указывать параметр PROCOPT=L или LS.
Подробную информацию об утилите PSBGEN и ее операторах можно найти в документе
o IMS Version 8. Utilities Reference: System. Document Number SC27-1309-
00.Program Number 5655-C56
В частности, описание параметра PROCOPT - в раздеде 1.2.3.2 “DL/I or Fast Path
Database PCB Statement” этого документа.
PCB TYPE=DB,DBDNAME=HDBHISAM,PROCOPT=L,KEYLEN=32
SENSEG NAME=HOSPITAL,PARENT=0
SENSEG NAME=WARD,PARENT=HOSPITAL
SENSEG NAME=PATIENT,PARENT=WARD
SENSEG NAME=SYMPTOM,PARENT=PATIENT
SENSEG NAME=TREATMNT,PARENT=PATIENT
SENSEG NAME=DOCTOR,PARENT=PATIENT
SENSEG NAME=FACILITY,PARENT=HOSPITAL
PSBGEN LANG=COBOL,PSBNAME=HPSHISAM
END

Генерация PSB

Page 8 of 22
Программы на Kоболе и базы данных IMS
Ниже приведено задание на генерацию блока PSB. Оно создано на основе процедуры
PSBGEN, которая поставляется в библиотеке IMS.V8R1.PROCLIB.
На шаге компиляции подключается библиотека SDFSMAC, которая, в частности, содержит
определение макрокоманды PSBGEN.
Задание универсально с точностью до имен а операторах DD SYSIN и SYSLMOD.
//PSBGEN1 JOB ,'GEV',
// TIME=(1),MSGLEVEL=(1,1),MSGCLASS=H,CLASS=A
//*
//* PSB GENERATION
//* IMS V8R1
//*
//* ASSEMBLER STEP
//*
//C EXEC PGM=ASMA90,REGION=0K,
// PARM=(OBJECT,NODECK,NODBCS,
// 'SIZE(MAX,ABOVE)')
//SYSLIB DD DSN=IMS.V8R1.SDFSMAC,DISP=SHR
//SYSLIN DD UNIT=SYSDA,DISP=(,PASS),
// SPACE=(80,(100,100),RLSE),
// DCB=(BLKSIZE=80,RECFM=F,LRECL=80)
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD UNIT=SYSDA,DISP=(,DELETE),
// SPACE=(CYL,(10,5))
//SYSIN DD DSN=GEV.IMS.DBDPSB(HPSHISAM),DISP=SHR
//*
//* LINK EDITING
//*
//L EXEC PGM=IEWL,PARM='XREF,LIST',
// COND=(0,LT,C),REGION=4M
//SYSLIN DD DSN=*.C.SYSLIN,DISP=(OLD,DELETE)
//SYSPRINT DD SYSOUT=*
//SYSLMOD DD DISP=SHR,DSN=GEV.IMS.PSBLIB(HPSHISAM)
//SYSUT1 DD UNIT=(SYSDA,SEP=(SYSLMOD,SYSLIN)),
// SPACE=(1024,(100,10),RLSE),DISP=(,DELETE)

Выполнение программы первоначальной загрузки


Одна и та же программа первоначальной загрузки используется для всех методов
доступа IMS.
В то же время, задание на выполнение программы зависит от используемого метода
доступа, т.к. должно содержать соответствующие операторы DD для загружаемой базы
данных.
Напомним, что имена операторов DD были указаны в DBD(оператор DATASET).
Ниже приведены задания на выполнение программы первоначальной загрузки базы
данных, использующих различные методы доступа IMS.
Задания построены на базе процедуры IMSCOBGO, которая поставляется в библиотеке
IMS910.PROCLIB.
Все комментарии и требования к используемым наборам данных (операторам DD), а
также описание параметров программы DFSRRC00 можно найти в документе
o IMS Version 8. Installation Volume 2: System Definition and Tailoring. Document
Number GC27-1298-00. Program Number 5655-C56. Раздел 4.24 DL/I Interfaces
Из неочевидных требований к используемым в данных заданиях наборах данных:
- для пакетных заданий IMS (IMS batch)все наборы нанных, указанные в операторах DD
с именами STEPLIB и SDFSRESL, должны быть авторизованы с помощью Authorized
Program Facility (APF).

Задание на загрузку базы данных HISAM


Используются:

Page 9 of 22
Программы на Kоболе и базы данных IMS
- Блок DBD с именем HDBHISAM
- Блок PSB с именем HPSHISAM
- Выполняемая программа на Коболе с именем DBLOAD.
- Операторы DD PRIME и OVF, которые используются для размещения наборов данных
для загружаемой базы. Их имена заданы параметрами DD1 и OVFLW блока DBD:
DD1=PRIME, OVFLW=OVF. Как видно, в DD учтены все рекомендации по формату записи
и ключа, которые были созданы во время генерации соответствующего DBD(см.
раздел “DBD для базы данных HISAM”).
Структура набора данных HISAM подробно описана в документе
o IMS Version 8. Administration Guide: Database Manager. Document
Number SC27-1283-00. Program Number 5655-C56. Раздел 2.2.7.2 How a
HISAM Record is Stored

- Оператор DD DFSVSAMP является обязательным для пакетных заданий, использующих


VSAM, и задает набор данных, который содержит управляющие операторы,
определяющие буферный пул для наборов данных VSAM.
В задании указаны 4 буфера по 20480 байтов каждый (5К). При меньшем размере
буфера возникает ошибка при открытии набора данных OVF с IMS статус-кодом AI
(status-code) - см. приложение 2. Размер буфера определен методом подбора,
начиная с размера управляющего интервала = 4096 (Control Interval – CI),
который подсчитан при генерации DBD. Вообще говоря, определение буферного пула
– это ответственность администратора базы данных.
Пример DFSVSAMP - на сервере ИБА 340_z в наборе данных
IMSBTS.V3R1.BTSIN(DFSVSAMP)
Более подробную информацию об этом можно найти в документах:
o IMS Version 8. Utilities Reference: System. Document Number SC27-
1309-00. Program Number 5655-C56. Раздел 1.1.4.5.1 DD Statements
Required for VSAM
o IMS Version 8. Installation Volume 2: System Definition and
Tailoring. Document Number GC27-1298-00. Program Number 5655-C56.
4.26 DD Statement Descriptions

//IMSHISAM JOB ,'GEV',


// TIME=(1),MSGLEVEL=(1,1),MSGCLASS=H,CLASS=A
//* JCL FOR LOAD PROGRAM EXECUTION - HISAM METHOD
//RUN EXEC PGM=DFSRRC00,REGION=4M,TIME=2,COND=(4,LT),
// PARM=(DLI,DBLOAD,HPSHISAM,7,0100,,0,,N,0,T,,,N,,,N,)
//STEPLIB DD DSN=GEV.IMS.PGMLIB,DISP=SHR
// DD DSN=IMS910.SDFSRESL,DISP=SHR
//SDFSRESL DD DSN=IMS910.SDFSRESL,DISP=SHR
//IMS DD DSN=GEV.IMS.PSBLIB,DISP=SHR
// DD DSN=GEV.IMS.DBDLIB,DISP=SHR
//PROCLIB DD DSN=IMS910.PROCLIB,DISP=SHR
//PRIME DD DSN=GEV.IMS.PRIME,DISP=(,KEEP),
// SPACE=(CYL,(20,5)),UNIT=3390,
// STORCLAS=Z19T,
// RECORG=KS,
// KEYLEN=20,KEYOFF=6,
// LRECL=194
//OVF DD DSN=GEV.IMS.OVF,DISP=(,KEEP),
// SPACE=(CYL,(20,5)),UNIT=3390,
// STORCLAS=Z19T,
// RECORG=ES,
// LRECL=194
//DFSVSAMP DD *
VSRBF=20480,4
/*
//CARDS DD DSN=GEV.IMS.DATA(HOSPLOAD),DISP=SHR
//

Page 10 of 22
Программы на Kоболе и базы данных IMS
//PRINTOUT DD SYSOUT=*
//

Входной набор данных для загрузки


Входной набор данных представлен в задании на выполнение оператором DD с именем
CARDS.
Сегменты расположены в правильной иерархической последовательности.
Каждый сегмент занимает 2 записи набора данных, которые имеют следующий формат:
Columns 1 - 08 segment name
09 – 72 first or second half of segment
73 – 80 sequence number
Sequence number образуется автоматически в процессе создания набора данных с
помощью текстового редактора.

Результат выполнения программы для метода HISAM


Результатом является база данных IMS, которая загружена записями из входного набора
данных.
Подробную информацию о структуре записи базы данных можно найти в документе
o IMS Version 8. Administration Guide: Database Manager. Document
Number SC27-1283-00. Program Number 5655-C56. Раздел 2.2.72 How an
HISAM Record is Stored

Кроме того, на системное устройство вывода выведены все прочитанные записи входного
набота данных
HOSPITALMAC_NEIL ADDR HOSPITAL MAC_NEIL TEL1 00010001
HOSPITAL 00020001
WARD 01N18 CARDIOLOGY 00030001
WARD 00030101
PATIENT MORIARTY ADDRESS OF MORIARTY TEL MORIAR000300031001
PATIENT 082377 00031101
SYMPTOM MORIARTY SYMPTOM1 082377 00031201
SYMPTOM 00031301
TREATMNTMORIARTY TREATMENT1 082377 00031401
TREATMNT 00031501
TREATMNTMORIARTY TREATMENT2 082577 00031601
TREATMNT 00031701
DOCTOR ADAMS ADDR OF DOCTOR ADAMS TEL ADAMS 00031801
DOCTOR 00031901
DOCTOR BANKS ADDR OF DOCTOR BANKS TEL BANKS 00032001
DOCTOR 00032101
PATIENT ALLISON ADDRESS OF ALLISON TEL ALLIS 000800032201
PATIENT 071477 00032301
SYMPTOM ALLISON SYMPTOM1 071477 00033001
SYMPTOM 00033102
TREATMNTALLISON TREATMENT1 082377 00034001
TREATMNT 00034101
DOCTOR EIFF ADDR OF DOCTOR EIFF TEL EIFF 00035001
DOCTOR 00036001
HOSPITALRIVEREDGE ADDR HOSPITAL RIVEREDGE TEL2 00040001
HOSPITAL 00050001
WARD 01003 INTENSE THERAPY 00060001
WARD 00070001
PATIENT BURNS ADDRESS OF BURNS TEL BURNS 000100080001
PATIENT 080877 00090001
SYMPTOM BURNS SYMPTOM1 080777 00100001
SYMPTOM 00110002
TREATMNTBURNS TREATMENT1 080877 00120001
TREATMNT 00130001
TREATMNTBURNS TREATMENT2 081077 00140001

Page 11 of 22
Программы на Kоболе и базы данных IMS
TREATMNT 00150001
TREATMNTBURNS TREATMENT3 081277 00160001
TREATMNT 00170001
DOCTOR WIND ADDR OF DOCTOR WIND TEL WIND 00180001
DOCTOR 00190001

Программа выборки (чтения) базы данных


В данном разделе приведен небольшой пример, с которого можно начинать изучение
данного предмета.
Одна и та же программа выборки используется для всех методов доступа IMS
Это программа демонстрирует несколько вариантов чтения информации из базы данных
IMS.
Вариант выборки 1. Необходимо составить список всех пациентов, независимо от того,
в каком госпитале они находятся.
Для этого достаточно использовать вызов Get Next c неквалифицированным SSA для
сегмента PATIENT.
Вариант выборки 2. Необходимо составить список всех пациентов госпиталя MAC_NEIL.
Шаг 1. Позиционирование базы данных на корневой сегмент HOSPITAL MAC_NEIL. Для
этого используется вызов Get Unique с квалифицированнмм SSA для сегмента HOSPITAL.
Шаг 2. Последовательное чтение всех сегментов PATIENT с помощью вызова Get Next до
тех пор, пока не будут прочитаны все сегменты, которые относятся к госпиталю
MAC_NEIL. После каждого вызова Get Next выполняется проверка, принадлежит ли
данный пациент госпиталю MAC_NEIL. Для проверки используется поле hospname-key из
pcb-mask, которое после каждого вызова Get Next содержит все ключевые поля,
полностью квалифицирующие прочитанный сегмент PATIENT.
Отметим, что после выполнения варианта 1 база позиционирована в оответствии с
состоянием “конец базы данных” (status-code=GB). Последующее выполнение Get Unique
с квалифицированным SSA для корневого сегмента находит нужный корневой сегмент и
позиционирует базу на сегмент, следующий за корневым в иерерхической
последовательности.
Значения статус-кода после выполнения операции Get Next
- GA — перемещение на уровень вверх
- GK — сегмент нового типа на том же уровне
- GB — конец базы данных
Значения статус-кода после выполнения операции Get Unique
- GE — сегмент не найден

Исходный текст программы

Задание на трансляцию и создание загрузочного модуля программы выборки


Задание полностью совпадает с заданием для программы загрузки, в котором
необходимо просто изменить имена наборов данных для исходного текста и
результирующей программы.
Исходный текст на первом шаге - компиляция
//COBOL.SYSIN DD DSN=GEV.IMS.COBOL(DBREAD),DISP=SHR
Результирующий модуль на последнем шаге – редактирование связей
//LKED.SYSLMOD DD DSN=GEV.IMS.PGMLIB(DBREAD),DISP=SHR

Блок DBD
Используем те же DBD, что и для программы загрузки.
В соответствующих операторах DD задания на выполнение программы достаточно указать
только DISP=SHR, не указывая параметры RECFM и LRECL.

Page 12 of 22
Программы на Kоболе и базы данных IMS
Блок PSB
Оператор PCB блока PSB, который используется только для выборки из базы данных,
должен указывать параметр PROCOPT=G. Таким образом, PSB для программы выборки не
может использоваться тот же PSB, что и для программы загрузки.
Ниже приведены макрокоманды ассемблера(операторы утилиты PSBGEN), которые
используются для построения PSB программы выборки. Как видно, PSB не зависит от
используемого метода доступа (в данном случае это HISAM). Все физические
характеристики находятся в DBD. Блок PSB лишь ссылается на этот DBD, указывая его
имя.
Подробную информацию об утилите PSBGEN и ее операторах можно найти в документе
o IMS Version 8. Utilities Reference: System. Document Number SC27-1309-00.
Program Number 5655-C56. 1.2 Program Specification Block (PSB) Generation
Подробную информацию об использовании PROCOPT можно найти в том же документе
документе Раздел 1.2.3.2 DL/I or Fast Path Database PCB statement

PCB TYPE=DB,DBDNAME=HDBHISAM,PROCOPT=G,KEYLEN=32
*
SENSEG NAME=HOSPITAL,PARENT=0
SENSEG NAME=WARD,PARENT=HOSPITAL
SENSEG NAME=PATIENT,PARENT=WARD
*
PSBGEN LANG=COBOL,PSBNAME=HPSHISMR
END

Этот PSB содержит операторы SENSEG только для тех сегментов, с которыми будет
работать программа. Следовательно, если программа захочет работать с другими
сегментами, PSB должен быть изменен и перегенерирован. Для того, чтобы избежать
дополнительных усилий по изменению PSB, можно сгенерировать “универсальный” PSB,
который содержить ссылки на все типы сегментов базы данных.

Выполнение программы выборки


Ниже приведены задания для выполнения программы выборки из базы данных HISAM.
Задания построены на базе процедуры IMSCOBGO, которая находится в библиотеке
IMS910.PROCLIB.
Все комментарии и требования к используемым наборам данных (операторам DD), а
также описание параметров программы DFSRRC00 можно найти в документе
o IMS Version 8. Installation Volume 2: System Definition and Tailoring. Document
Number GC27-1298-00. Program Number 5655-C56. Раздел 4.24 DL/I Interfaces
Из неочевидных требований к используемым в данном задании наборам данных:
- для пакетных заданий IMS (IMS batch)все наборы нанных, указанные в операторах DD
с именами STEPLIB и SDFSRESL, должны быть авторизованы с помощью Authorized
Program Facility (APF).

Задание для выполнения


Используются
- Блок DBD с именем HDBHISAM
- Блок PSB с именем HPSHISMR
- Выполняемая программа на Коболе с именем DBREAD.
- При выполнении программы сегменты выбираются из базы данных, которая содержится
в двух наборах данных, имена которых заданы параметрами DD1=PRIME и OVFLW=OVF
блока DBD
- Оператор DD DFSVSAMP является обязательным для пакетных заданий, использующих
VSAM, и задает набор данных, который содержит управляющие операторы,
определяющие буферный пул для наборов данных VSAM. Подробно об этом см. в
разделе Задание на загрузку базы данных HISAM .
//IMSHISMR JOB ,'GEV',

Page 13 of 22
Программы на Kоболе и базы данных IMS
// TIME=(1),MSGLEVEL=(1,1),MSGCLASS=H,CLASS=A
//* JCL FOR READ PROGRAM EXECUTION - HISAM METHOD
//RUN EXEC PGM=DFSRRC00,REGION=4M,TIME=2,COND=(4,LT),
// PARM=(DLI,DBREAD,HPSHISMR,7,0100,,0,,N,0,T,,,N,,,N,)
//STEPLIB DD DSN=GEV.IMS.PGMLIB,DISP=SHR
// DD DSN=IMS910.SDFSRESL,DISP=SHR
//SDFSRESL DD DSN=IMS910.SDFSRESL,DISP=SHR
//IMS DD DSN=GEV.IMS.PSBLIB,DISP=SHR
// DD DSN=GEV.IMS.DBDLIB,DISP=SHR
//PROCLIB DD DSN=IMS910.PROCLIB,DISP=SHR
//PRIME DD DSN=GEV.IMS.PRIME,DISP=SHR
//OVF DD DSN=GEV.IMS.OVF,DISP=SHR
//DFSVSAMP DD *
VSRBF=20480,4
/*
//PRINTOUT DD SYSOUT=*
//

Результат выполнения
All patients from data base
MORIARTY ADDRESS OF MORIARTY TEL MORIAR0003082377
ALLISON ADDRESS OF ALLISON TEL ALLIS 0008071477
BURNS ADDRESS OF BURNS TEL BURNS 0001080877
All patients of hospital MAC_NEIL
MORIARTY ADDRESS OF MORIARTY TEL MORIAR0003082377
ALLISON ADDRESS OF ALLISON TEL ALLIS 0008071477

Программа добавления сегментов в базу данных


В разделе приведена программа добавления сегментов PATIENT в базу данных HISAM,
которая создана программой первоначальной загрузки. Для добавления сегментов
используется команда ISRT, та же, что использовалась для первоначальной загрузки
базы данных. Различие – в блоке PSB, в котором задается другой режим обработки
PROCOPT=I вместо PROCOPT=L/LS при загрузке
Для баз данных HSAM любые изменения структуры, в том числе и добавление сегментов,
невозможны.

Исходный текст программы


Программа выполняет команды ISRT, чтобы добавить несколько пациентов (сегментов
PATIENT) в блок 01 госпиталя MAC_NEIL.
Используются квалифицированные SSA для родительских сегментов HOSPITAL и WARD с
уникальными ключами HOSPNAME и WARDNO (структуру базы данных см. в разделе “DBD
для базы данных HISAM” ).
Последним SSA в команде ISRT должен быть SSA для вставляемого сегмента - сегмента
PATIENT. И это должен быть НЕКВАЛИФИЦИРОВАННЫЙ SSA.
Сегменты PATIENT будут добавлены в базу данных в соответствии со значением в поле
уникального ключа - BEDIDENT.
Добавляемые сегменты читаются из входного набора данных, структура которого
полностью повторяет структуру входного набора данных для программы загрузки (см.
раздел “Входной набор данных для загрузки”.
Добавление 1. Первыми добавляются пациенты SMITH и HEPPEL, которые имеют
уникальный ключ BEDIDENT, равный 0005 и 0001, соответственно.
Добавление 2. Затем происходит неудачная попытка еще раз добавить пациента SMITH
с тем же BEDIDENT=0005. Операция завершается со статус-кодом ‘II’ – сегмент уже
существует в базе данных.
Добавление 3. Еще раз добавляем пациента SMITH, но уже с другим значением в
ключевом поле BEDIDENT=0010. Операция завершается успешно.

Page 14 of 22
Программы на Kоболе и базы данных IMS
*************************************************
* This program inserts some new PATIENT segments
* into existing IMS data base HOSPITAL
* Parent segments HOSPITAL and WARD are hardcoded
* Inserted segments are read from input file
*************************************************
id division.
program-id. dbinsrt.
environment division.
input-output section.
file-control.
select card-file assign to cards.

data division.
file section.
fd card-file
label records are standard
recording mode is f
block contains 0 records
data record is varied-info.

01 card.
03 seg-name pic x(8).
03 card-data pic x(64).
03 filler pic x(8).

working-storage section.

77 isrt pic x(4) value 'ISRT'.

01 hospital-ssa.
03 filler pic x(19) value 'HOSPITAL(HOSPNAMEEQ'.
03 hospname-ssa pic x(20).
03 filler pic x value ')'.

01 ward-ssa.
03 filler pic x(19) value 'WARD (WARDNO EQ'.
03 wardno-ssa pic x(2).
03 filler pic x value ')'.

01 pat-unqual-ssa.
03 seg-name pic x(08) value 'PATIENT '.
03 filler pic X value ' '.

01 i-o-area.
03 first-half pic x(64).
03 second-half pic x(64).

linkage section.

01 pcb-mask.
03 dbdname pic x(8).
03 level-number pic xx.
03 status-code pic xx.
03 proc-options pic xxxx.
03 jcb-address pic xxxx.
03 segnent-name pic x(8).
03 key-length pic s9(5) comp.
03 number-segs pic s9(5) comp.
03 key-feedback.
05 hospname-key pic x(20).
05 wardno-key pic xx.
05 bedident-key pic xxxx.

Page 15 of 22
Программы на Kоболе и базы данных IMS
procedure division.
start-of-program.
entry 'dlitcbl' using pcb-mask.

begin-here.
open input card-file.

* read patient segment info


read-card.
read card-file at end go to end-of-job.
move card-data to first-half.
read card-file at end go to end-of-job.
move card-data to second-half.
******************************************
* Insert a patient in between exesting
* patients of hospital MAC_NEIL
* Last SSA (PATIENT) should be UNQUALIFIED
*******************************************
move 'MAC_NEIL' to hospname-ssa.
move '01' to wardno-ssa.
call 'cbltdli' using isrt
pcb-mask
i-o-area
hospital-ssa
ward-ssa
pat-unqual-ssa.
if status-code is not equal to space
perform analyse-status
else
go to read-card
end-if.

analyse-status.
if status-code = 'II'
display 'Segment already exists in data base'
display 'i-o-area', i-o-area
else
display 'bad status=', status-code
display 'pcb-mask=',pcb-mask
end-if.
go to read-card.

end-of-job.
close card-file.
goback.

Задание на трансляцию и создание загрузочного модуля программы добавления


Задание полностью совпадает с заданием для программы загрузки, в котором
необходимо просто изменить имена наборов данных для исходного текста и
результирующей программы.
Исходный текст на первом шаге - компиляция
//COBOL.SYSIN DD DSN=GEV.IMS.COBOL(DBINSRT),DISP=SHR
Результирующий модуль на последнем шаге – редактирование связей
//LKED.SYSLMOD DD DSN=GEV.IMS.PGMLIB(DBINSRT),DISP=SHR

Блок DBD
Используем те же DBD, что и для программы загрузки.
В соответствующих операторах DD задания на выполнение программы достаточно указать
только DISP=SHR, не указывая параметры RECFM и LRECL.

Page 16 of 22
Программы на Kоболе и базы данных IMS
Блок PSB
Оператор PCB блока PSB, который используется только для добавления сегментов в
базу данных, должен указывать параметр PROCOPT=I. Таким образом, PSB для программы
добавления не может использоваться тот же PSB, что и для программы загрузки.
Ниже приведены макрокоманды ассемблера(операторы утилиты PSBGEN), которые
используются для построения PSB программы добавления. Как видно, PSB не зависит от
используемого метода доступа (в данном случае это HSAM или HISAM). Все физические
характеристики находятся в DBD. Блок PSB лишь ссылается на этот DBD, указывая его
имя.
Подробную информацию об утилите PSBGEN и ее операторах можно найти в документе
o IMS Version 8. Utilities Reference: System. Document Number SC27-1309-00.
Program Number 5655-C56. 1.2 Program Specification Block (PSB) Generation
Подробную информацию об использовании PROCOPT можно найти в том же документе
документе Раздел 1.2.3.2 DL/I or Fast Path Database PCB statement

PCB TYPE=DB,DBDNAME=HDBHISAM,PROCOPT=I,KEYLEN=32
*
SENSEG NAME=HOSPITAL,PARENT=0
SENSEG NAME=WARD,PARENT=HOSPITAL
SENSEG NAME=PATIENT,PARENT=WARD
*
PSBGEN LANG=COBOL,PSBNAME=HPSHISMI
END

Этот PSB содержит операторы SENSEG только для тех сегментов, с которыми будет
работать программа. Следовательно, если программа захочет работать с другими
сегментами, PSB должен быть изменен и перегенерирован. Для того, чтобы избежать
дополнительных усилий по изменению PSB, можно сгенерировать “универсальный” PSB,
который содержить ссылки на все типы сегментов базы данных.

Выполнение программы добавления сегментов


Ниже приведены задания для выполнения программы добавления сегментов в базу данных
HISAM.
Задания построены на базе процедуры IMSCOBGO, которая находится в библиотеке
IMS910.PROCLIB.
Все комментарии и требования к используемым наборам данных (операторам DD), а
также описание параметров программы DFSRRC00 можно найти в документе
o IMS Version 8. Installation Volume 2: System Definition and Tailoring. Document
Number GC27-1298-00. Program Number 5655-C56. Раздел 4.24 DL/I Interfaces
Из неочевидных требований к используемым в данном задании наборам данных:
- для пакетных заданий IMS (IMS batch)все наборы нанных, указанные в операторах DD
с именами STEPLIB и SDFSRESL, должны быть авторизованы с помощью Authorized
Program Facility (APF).

Задание для выполнения - HISAM


Задание практически полностью повторяет задание для выборки – изменены только имя
программы и имя PSB.
Используются
- Блок DBD с именем HDBHISAM
- Блок PSB с именем HPSHISMI
- Выполняемая программа на Коболе с именем DBINSRT.
- При выполнении программы сегменты добавляются в базу данных, которая содержится
в двух наборах данных, имена которых заданы параметрами DD1=PRIME и OVFLW=OVF
блока DBD
- Для выполнения программы, которая обновляет базу данных IMS, необходимо наличие
набора данных для IMS batch system log. Имя оператора DD для этого набора

Page 17 of 22
Программы на Kоболе и базы данных IMS
данных – IEFRDER. Информацию об этом наборе данных можно найти в документе IMS
Version 8. Installation Volume 2: System Definition and Tailoring, раздел 4.16
“IMSCOBGO Procedure”
- Оператор DD DFSVSAMP является обязательным для пакетных заданий, использующих
VSAM, и задает набор данных, который содержит управляющие операторы,
определяющие буферный пул для наборов данных VSAM. Подробно об этом см. в
разделе Задание на загрузку базы данных HISAM .
//IMSHISMI JOB ,'GOL',
// TIME=(1),MSGLEVEL=(1,1),MSGCLASS=H,CLASS=A
//* JCL FOR INSERT PROGRAM EXECUTION - HISAM METHOD
//RUN EXEC PGM=DFSRRC00,REGION=4M,TIME=2,COND=(4,LT),
// PARM=(DLI,DBINSRT,HPSHISMI,7,0100,,0,,N,0,T,,,N,,,N,)
//STEPLIB DD DSN=GEV.IMS.PGMLIB,DISP=SHR
// DD DSN=IMS910.SDFSRESL,DISP=SHR
//SDFSRESL DD DSN=IMS910.SDFSRESL,DISP=SHR
//IMS DD DSN=GEV.IMS.PSBLIB,DISP=SHR
// DD DSN=GEV.IMS.DBDLIB,DISP=SHR
//PROCLIB DD DSN=IMS910.PROCLIB,DISP=SHR
//IEFRDER DD DSN=GEV.IMS.IMSLOG,DISP=SHR
//*IEFRDER DD DSN=GEV.IMS.IMSLOG,DISP=(,KEEP),
//* SPACE=(CYL,(2,1)),UNIT=3390,
//* STORCLAS=Z19T,
//* DCB=(RECFM=VB,BLKSIZE=4096,
//* LRECL=4092,BUFNO=2)
//*SYSUDUMP DD SYSOUT=*
//PRIME DD DSN=GEV.IMS.PRIME,DISP=SHR
//OVF DD DSN=GEV.IMS.OVF,DISP=SHR
//DFSVSAMP DD *
VSRBF=20480,4
/*
//CARDS DD DSN=GEV.IMS.DATA(HOSPISRT),DISP=SHR
//PRINTOUT DD SYSOUT=*
//

Входной набор данных для программы добавления сегментов


Входной набор данных представлен в задании на выполнение оператором DD с именем
CARDS. Структура записи полностью совпадает со структурой записи входного набора
программы загрузки: “Входной набор данных для загрузки”.
PATIENT SMITH ADDRESS OF SMITH TEL SMITH 000500030210
PATIENT 150199 00030309
PATIENT HEPPEL ADDRESS OF HEPPEL TEL HEPPEL000100030412
PATIENT 080877 00030512
PATIENT SMITH ADDRESS OF SMITH TEL SMITH 000500030611
PATIENT 150199 00030711
PATIENT SMITH ADDRESS OF SMITH TEL SMITH 001000030813
PATIENT 150199 00030913

Результат выполнения программы добавления сегментов – файл PRINTOUT


R E A D C A R D S
PATIENT SMITH ADDRESS OF SMITH TEL SMITH 00050003021
PATIENT 150199 0003030
PATIENT HEPPEL ADDRESS OF HEPPEL TEL HEPPEL00010003041
PATIENT 080877 0003051
PATIENT SMITH ADDRESS OF SMITH TEL SMITH 00050003061
PATIENT 150199 0003071
PATIENT SMITH ADDRESS OF SMITH TEL SMITH 00100003081
PATIENT 150199 0003091
Segment already exists in data base
i-o-areaSMITH ADDRESS OF SMITH TEL SMITH 0005150199

Page 18 of 22
Программы на Kоболе и базы данных IMS
Ниже показано содержимое базы данных после добавления новых сегментов PATIENT. Как
видно, теперь два пациента с именем SMITH находятся в госпитале MAC_NEIL, в палате
(WARD) 01, но на разных койках (BEDIDENT).
Это результат последовательного чтения сегментов PATIENT с помощью программы
DBREAD (см. “Программа выборки (чтения) базы данных”). Как видно, сегменты
упорядочены по ключу, независимо от того, как они попали в базу данных.

All patients from data base


HEPPEL ADDRESS OF HEPPEL TEL HEPPEL0001080877
MORIARTY ADDRESS OF MORIARTY TEL MORIAR0003082377
SMITH ADDRESS OF SMITH TEL SMITH 0005150199
ALLISON ADDRESS OF ALLISON TEL ALLIS 0008071477
SMITH ADDRESS OF SMITH TEL SMITH 0010150199
BURNS ADDRESS OF BURNS TEL BURNS 0001080877
All patients of hospital MAC_NEIL
HEPPEL ADDRESS OF HEPPEL TEL HEPPEL0001080877
MORIARTY ADDRESS OF MORIARTY TEL MORIAR0003082377
SMITH ADDRESS OF SMITH TEL SMITH 0005150199
ALLISON ADDRESS OF ALLISON TEL ALLIS 0008071477
SMITH ADDRESS OF SMITH TEL SMITH 0010150199

Реализация нескольких бизнес-процессов работы с базой данных больниц


Поступил пациент
Бизнес-процесс
- требуется положить пациента в отделение кардиологии
- известны личные данные пациента (имя, адрес, телефон)
- известна дата поступления
- в любой из больниц необходимо найти кардиологическон отделение, в котором
имеются свободные места и поместить туда пациента

Пациенту назначен доктор


Бизнес-процесс
- пациенту назначен доктор-кардиолог
- пациенту назначен доктор-терапевт

Проведено обследование, установлен диагноз


Бизнес-процесс
- диагноз доктора-кардиолога
- диагноз доктора-терапевта

Пациенту назначено лечение


Бизнес-процесс
- пациенту назначено лечение доктора-кардиолога
- пациенту назначено лечение доктора-терапевта

Пациента выписывают из больницы


Бизнес-процесс
- пациент получает информацию (эпикриз) о болезни и предпринятом лечении
- пациент удаляется из базы данных больницы

DBDGEN utility
Подробную информацию об утилите и ее операторах можно найти в документе

Page 19 of 22
Программы на Kоболе и базы данных IMS
o IMS Version 8. Utilities Reference: System. Document Number SC27-1309-
00.Program Number 5655-C56

Подробную информацию о статус-кодах IMS можно найти в документе


o IMS Version 8. Messages and Codes Volume 1. Document Number GC27-1301-00.
Program Number 5655-C56. Appendix E. DL/I Codes

IMS access method HISAM - VSAM data sets


DBD generated contains the following statement:
DBD NAME=HOSPDBD,ACCESS=HISAM
DATASET DD1=PRIME5,OVFLW=OVFLW

Parameters values recommended for VSAM by DBDGEN utility – from DBDGEN execution
listing for HISAM – from DBD generation job listing
* * * * * * * * * ** * * * * * * * * * * * * * * *
* RECOMMENDED VSAMDEFINE CLUSTER PARAMETERS *
* * * * * * * * * ** * * * * * * * * * * * * * * *
* * * * * * * * * ** * * * * * * * * * * * * * * *
* *NOTE1
* DEFINE CLUSTER (NAME(PRIME5) -
* INDEXED KEYS (20,6) -
* RECORDSIZE (194,194)) -
* DATA (CONTROLINTERVALSIZE (512))
*
* *NOTE1 - SHOULD SPECIFY DSNAME FOR DD PRIME5
* * * * * * * * * * * * * * * * * * * * * * * * * *
* *NOTE2
* DEFINE CLUSTER (NAME(OVFLW) NONINDEXED -
* RECORDSIZE (194,194) -
* CONTROLINTERVALSIZE (512))
*
* *NOTE2 - SHOULD SPECIFY DSNAME FOR DD OVFLW
* * * * * * * * * * * * * * * * * * * * * * * * * *

Параметры оператора DATASET, которые определяют формат записи (RECORD, BLOCK)


являются необязательными. Но при этом формат записи в DATASET и формат записи в
соответствующем операторе DD должны совпадать, иначе программа завершается с IMS
status-code=AI.
Ниже приведены операторы DD, которые должны присутствовать в задании на загрузку
базы данных, которая определена с помощью приведенного выше DBD.
//PRIME5 DD DSN=GEV.IMS.V8R1.PRIME5,DISP=(,DELETE),
// SPACE=(CYL,(20,5)),UNIT=3390,
// RECORG=KS,
// KEYLEN=20,KEYOFF=6,LRECL=194
//OVFLW DD DSN=GEV.IMS.V8R1.OVFLW,DISP=(,DELETE),
// SPACE=(CYL,(20,5)),UNIT=3390,
// RECORG=ES,
// LRECL=194

Page 20 of 22
Программы на Kоболе и базы данных IMS

Приложение. Примеры ошибок при выполнения программы загрузки


Пример 1. Неправильное определение буферного пула для VSAM
Результат выполнения задания – системные сообщения
$HASP373 IMSHISAM STARTED - INIT 1 - CLASS A - SYS MVS1
IEF403I IMSHISAM - STARTED - TIME=13.17.24
+DFS035I BATCH INITIALIZATION COMPLETE IMSA
IEC161I 120-053,IMSHISAM,RUN,OVF,,,GEV.IMS.V8R1.OVF, 410
IEC161I GEV.IMS.V8R1.OVF.DATA,CATALOG.U01.UCAT
+DFS0730I UNABLE TO OPEN DATA SET WITH DDNAME OVF FOR REASON O,DC, DATA
DFS627I IMS RTM CLEANUP ( EOT ) COMPLETE FOR JS IMSHISAM.RUN . ,RC=0
- --TIMINGS (MINS.)-- ----PA
-JOBNAME STEPNAME PROCSTEP RC EXCP CPU SRB CLOCK SERV PG PAGE
-IMSHISAM RUN 00 1097 .00 .00 .02 3170 0 0
IEF404I IMSHISAM - ENDED - TIME=13.17.26

Пояснение к сообщению MVS IEC161I 120 – в документе


o z/OS MVS System Messages Volume 7 (IEB - IEE) Document Number SA22-7637-04.
Program Number 5694-A01, 5655-G52
Пояснения к сообщению IMS DFS0730I – в документе
o IMS Version 8. Messages and Codes Volume 2. Document Number GC27-1302-00.
Program Number 5655-C56
Оба пояснения малопригодны для понимания того, что нужно делать, чтобы исправить
ошибку без привлечения администратора.
Результат выполнения программы загрузки – статус-код=AI IMS, установленный при
попытке выполнить первую операцию Insert
HOSPITALMAC_NEIL ADDR HOSPITAL MAC_NEIL TEL1
HOSPITAL
PCB-mask after Insert
HDBHISAM00AILS HOVF
Программа вывела на печать первые 2 прочитанные входные записи, из которых
формируется первый корневой сегмент, и выдала Insert, чтобы поместить этот сегмент
в базу данных
PCB-mask после этого вызова содержит
HDBHISAM – имя DBD
00 - уровень сегмента
AI - статус-код IMS
LS - PROCOPT из PSB
OVF - имя DD того набора данных, при открытии которого произошла ошибка
Пояснения к статус-коду AI можно найти в документе
o IMS Version 8. Messages and Codes Volume 1. Document Number GC27-1301-00.
Program Number 5655-C56
Одна из возможных причин ошибки – буфер слишком мал, чтобы вместить запись. Этот
намек и привел к мысли увеличивать размер в буферном пуле до тех пор, пока ошибка
не исчезла.
Все вопросы о взаимосвязи размеров записи, управляющего интервала (Control
Interval - CI), буферов – к администратору базы данных.
Результат же, полученный для данной программы, состоит в том, что программа все-
таки выполнилась - пока без всякого обсуждения вопроса, почему это выполнение
стало возможным

Пример 2. Нарушение последовательности ключей при загрузке


Приведенная программа загрузки требует, чтобы сегменты были представлены программе
в иерархической последовательности. Другими словам и , корневые сегменты, должны

Page 21 of 22
Программы на Kоболе и базы данных IMS
быть представлены программе загрузки в последовательности, упорядоченной по
значениям их ключей, а все зависимые сегменты - в виде иерархически упорядоченных
цепочек, непосредственно следующих за каждым корневым сегментом.
Это требование основано на использовании вызовов Insert с использованием полностью
неквалифицированного SSA.
Ниже приведена часть входного набора данных, которая привела к ошибке при
загрузке.
HOSPITALMAC_NEIL ADDR HOSPITAL MAC_NEIL TEL1
HOSPITAL
WARD 01N18 CARDIOLOGY
WARD
PATIENT ALLISON ADDRESS OF ALLISON TEL ALLIS 0008
PATIENT 071477
SYMPTOM ALLISON SYMPTOM1 071477
SYMPTOM
TREATMNTALLISON TREATMENT1 082377
TREATMNT
DOCTOR EIFF ADDR OF DOCTOR EIFF TEL EIFF
DOCTOR
PATIENT MORIARTY ADDRESS OF MORIARTY TEL MORIAR0003
PATIENT 082377
SYMPTOM MORIARTY SYMPTOM1 082377
SYMPTOM

При загрузке этого файла в базу HSAM возникла ошибка загрузки и был выдан status-
code = LC:

Explanation: The key field of the segment being loaded is out of sequence.

Причина – пациент ALLISON был загружен раньше пациента MORIARTY, что неправильно,
т.к. при загрузке все ключевые поля должны подаваться в возрастающей
последовательности. А у пациента MORIARTY, сегмент PATIENT которого является
потомком сегмента WARD, имеет значение в поле WARDNO(0003) меньшее, чем
соответствующее значение пациента ALLISON - WARDNO(0008)
Ссылки
o IMS Version 8 . Messages and Codes Volume 1. Document Number GC27-1301-00.
Program Number 5655-C56. Appendix E. DL/I Codes

Page 22 of 22