COBOL - Краткое руководство
Введение в COBOL
COBOL - это язык высокого уровня. Нужно понимать, как работает COBOL. Компьютеры понимают только машинный код, двоичный поток нулей и единиц. Код COBOL должен быть преобразован в машинный код с помощьюcompiler. Запустите исходный код программы через компилятор. Компилятор сначала проверяет наличие синтаксических ошибок, а затем преобразует их в машинный язык. Компилятор создает выходной файл, известный какload module. Этот выходной файл содержит исполняемый код в виде нулей и единиц.
Эволюция COBOL
В течение 1950-х годов, когда в западной части мира росли предприятия, возникла потребность в автоматизации различных процессов для упрощения работы, и это привело к появлению языка программирования высокого уровня, предназначенного для обработки бизнес-данных.
В 1959 году COBOL был разработан CODASYL (Конференция по языку систем данных).
Следующая версия, COBOL-61, была выпущена в 1961 году с некоторыми изменениями.
В 1968 году COBOL был одобрен ANSI в качестве стандартного языка для коммерческого использования (COBOL-68).
Он был снова переработан в 1974 и 1985 годах для разработки последующих версий, названных COBOL-74 и COBOL-85 соответственно.
В 2002 году был выпущен объектно-ориентированный COBOL, который мог использовать инкапсулированные объекты как обычную часть программирования COBOL.
Важность COBOL
COBOL был первым широко используемым языком программирования высокого уровня. Это английский язык, удобный для пользователя. Все инструкции можно закодировать простыми английскими словами.
COBOL также используется как язык самодокументирования.
COBOL может обрабатывать огромные объемы данных.
COBOL совместим со своими предыдущими версиями.
COBOL имеет эффективные сообщения об ошибках, поэтому устранение ошибок проще.
Особенности COBOL
Стандартный язык
COBOL - это стандартный язык, который можно компилировать и запускать на таких машинах, как IBM AS / 400, персональных компьютерах и т. Д.
Ориентированный на бизнес
COBOL был разработан для бизнес-приложений, связанных с финансовой областью, областью защиты и т. Д. Он может обрабатывать огромные объемы данных благодаря своим расширенным возможностям обработки файлов.
Надежный язык
COBOL - надежный язык, поскольку его многочисленные инструменты отладки и тестирования доступны практически для всех компьютерных платформ.
Структурированный язык
Логические управляющие структуры доступны в COBOL, что упрощает чтение и изменение. COBOL имеет разные подразделения, поэтому его легко отлаживать.
Установка COBOL в Windows / Linux
Для Windows доступно множество бесплатных эмуляторов мэйнфреймов, которые можно использовать для написания и изучения простых программ на COBOL.
Одним из таких эмуляторов является Hercules, который можно легко установить в Windows, выполнив несколько простых шагов, как указано ниже:
Загрузите и установите эмулятор Hercules, который доступен на домашнем сайте Hercules: www.hercules-390.eu
После того, как вы установили пакет на компьютере с Windows, он создаст папку вроде C:/hercules/mvs/cobol.
Запустите командную строку (CMD) и перейдите в каталог C: / hercules / mvs / cobol на CMD.
Полное руководство по различным командам для написания и выполнения программ JCL и COBOL можно найти по адресу:
www.jaymoseley.com/hercules/installmvs/instmvs2.htm
Hercules - это программная реализация с открытым исходным кодом архитектур System / 370 и ESA / 390 для мэйнфреймов в дополнение к новейшей 64-битной z / Architecture. Hercules работает под Linux, Windows, Solaris, FreeBSD и Mac OS X.
Пользователь может подключиться к серверу мэйнфрейма несколькими способами, такими как тонкий клиент, фиктивный терминал, система виртуального клиента (VCS) или система виртуального рабочего стола (VDS). Каждому действующему пользователю предоставляется идентификатор входа в систему для входа в интерфейс Z / OS (TSO / E или ISPF).
Компиляция программ COBOL
Чтобы выполнить программу COBOL в пакетном режиме с использованием JCL, программу необходимо скомпилировать и создать загрузочный модуль со всеми подпрограммами. JCL использует модуль загрузки, а не фактическую программу во время выполнения. Библиотеки загрузки объединяются и передаются в JCL во время выполнения с использованиемJCLLIB или же STEPLIB.
Для компиляции программы на языке COBOL доступно множество утилит компилятора мэйнфрейма. Некоторые корпоративные компании используют такие инструменты управления изменениями, какEndevor, который компилирует и хранит каждую версию программы. Это полезно для отслеживания изменений, внесенных в программу.
//COMPILE JOB ,CLASS = 6,MSGCLASS = X,NOTIFY = &SYSUID
//*
//STEP1 EXEC IGYCRCTL,PARM = RMODE,DYNAM,SSRANGE
//SYSIN DD DSN = MYDATA.URMI.SOURCES(MYCOBB),DISP = SHR
//SYSLIB DD DSN = MYDATA.URMI.COPYBOOK(MYCOPY),DISP = SHR
//SYSLMOD DD DSN = MYDATA.URMI.LOAD(MYCOBB),DISP = SHR
//SYSPRINT DD SYSOUT=*
//*
IGYCRCTL - это утилита компилятора IBM COBOL. Параметры компилятора передаются с помощью параметра PARM. В приведенном выше примере RMODE инструктирует компилятор использовать режим относительной адресации в программе. Программа COBOL передается с помощью параметра SYSIN. Тетрадь - это библиотека, используемая программой в SYSLIB.
Выполнение программ COBOL
Ниже приведен пример JCL, где программа MYPROG выполняется с использованием входного файла MYDATA.URMI.INPUT и создает два выходных файла, записанных в спул.
//COBBSTEP JOB CLASS = 6,NOTIFY = &SYSUID
//
//STEP10 EXEC PGM = MYPROG,PARM = ACCT5000
//STEPLIB DD DSN = MYDATA.URMI.LOADLIB,DISP = SHR
//INPUT1 DD DSN = MYDATA.URMI.INPUT,DISP = SHR
//OUT1 DD SYSOUT=*
//OUT2 DD SYSOUT=*
//SYSIN DD *
//CUST1 1000
//CUST2 1001
/*
Загрузочный модуль MYPROG находится в MYDATA.URMI.LOADLIB. Важно отметить, что приведенный выше JCL можно использовать только для модуля COBOL, отличного от DB2.
Выполнение программ COBOL-DB2
Для запуска программы COBOL-DB2 в JCL и программе используется специализированная утилита IBM; Регион DB2 и необходимые параметры передаются утилите в качестве входных данных.
Шаги, выполняемые при запуске программы COBOL-DB2, следующие:
Когда программа COBOL-DB2 компилируется, вместе с загрузочным модулем создается DBRM (модуль запроса базы данных). DBRM содержит операторы SQL программ COBOL, синтаксис которых проверяется на правильность.
DBRM привязан к региону (среде) DB2, в котором будет работать COBOL. Это можно сделать с помощью утилиты IKJEFT01 в JCL.
После этапа связывания программа COBOL-DB2 запускается с использованием IKJEFT01 (снова) с библиотекой загрузки и библиотекой DBRM в качестве входных данных для JCL.
//STEP001 EXEC PGM = IKJEFT01
//*
//STEPLIB DD DSN = MYDATA.URMI.DBRMLIB,DISP = SHR
//*
//input files
//output files
//SYSPRINT DD SYSOUT=*
//SYSABOUT DD SYSOUT=*
//SYSDBOUT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//DISPLAY DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(SSID)
RUN PROGRAM(MYCOBB) PLAN(PLANNAME) PARM(parameters to cobol program) -
LIB('MYDATA.URMI.LOADLIB')
END
/*
В приведенном выше примере MYCOBB - это программа COBOL-DB2, запускаемая с использованием IKJEFT01. Обратите внимание, что имя программы, идентификатор подсистемы DB2 (SSID) и имя плана DB2 передаются в операторе SYSTSIN DD. Библиотека DBRM указана в STEPLIB.
Структура программы COBOL состоит из разделов, как показано на следующем изображении -
Краткое введение в эти подразделения приведено ниже -
Sectionsявляются логическим подразделением программной логики. Раздел - это набор абзацев.
Paragraphsявляются подразделением секции или подразделения. Это либо определенное пользователем, либо предварительно определенное имя, за которым следует точка, и состоит из нуля или более предложений / записей.
Sentencesявляются комбинацией одного или нескольких утверждений. Приговоры появляются только в разделе «Процедура». Предложение должно заканчиваться точкой.
Statements значимые операторы COBOL, которые выполняют некоторую обработку.
Characters являются самыми низкими в иерархии и не могут быть делимыми.
Вы можете связать вышеупомянутые термины с программой COBOL в следующем примере -
PROCEDURE DIVISION.
A0000-FIRST-PARA SECTION.
FIRST-PARAGRAPH.
ACCEPT WS-ID - Statement-1 -----|
MOVE '10' TO WS-ID - Statement-2 |-- Sentence - 1
DISPLAY WS-ID - Statement-3 -----|
.
Подразделения
Программа COBOL состоит из четырех частей.
Отдел идентификации
Это первый и единственный обязательный раздел каждой программы COBOL. Программист и компилятор используют это разделение для идентификации программы. В этом разделе PROGRAM-ID - единственный обязательный параграф. PROGRAM-ID определяет имя программы, которое может содержать от 1 до 30 символов.
Попробуйте следующий пример, используя Live Demo вариант онлайн.
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
DISPLAY 'Welcome to Tutorialspoint'.
STOP RUN.
Ниже приводится JCL для выполнения указанной выше программы COBOL.
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
Welcome to Tutorialspoint
Отдел окружающей среды
Разделение среды используется для указания входных и выходных файлов для программы. Он состоит из двух разделов -
Configuration sectionпредоставляет информацию о системе, в которой программа написана и выполняется. Он состоит из двух абзацев -
Исходный компьютер - система, используемая для компиляции программы.
Объектный компьютер - система, используемая для выполнения программы.
Input-Output sectionпредоставляет информацию о файлах, которые будут использоваться в программе. Он состоит из двух абзацев -
Файловый контроль - предоставляет информацию о наборах внешних данных, используемых в программе.
Контроль ввода-вывода - предоставляет информацию о файлах, используемых в программе.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. XXX-ZOS.
OBJECT-COMPUTER. XXX-ZOS.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FILEN ASSIGN TO DDNAME
ORGANIZATION IS SEQUENTIAL.
Отдел данных
Разделение данных используется для определения переменных, используемых в программе. Он состоит из четырех разделов -
File section используется для определения структуры записи файла.
Working-Storage section используется для объявления временных переменных и файловых структур, которые используются в программе.
Local-Storage sectionаналогичен разделу «Рабочее хранилище». Единственное отличие состоит в том, что переменные будут выделяться и инициализироваться каждый раз при запуске программы.
Linkage section используется для описания имен данных, полученных от внешней программы.
COBOL Program
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT FILEN ASSIGN TO INPUT.
ORGANIZATION IS SEQUENTIAL.
ACCESS IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD FILEN
01 NAME PIC A(25).
WORKING-STORAGE SECTION.
01 WS-STUDENT PIC A(30).
01 WS-ID PIC 9(5).
LOCAL-STORAGE SECTION.
01 LS-CLASS PIC 9(3).
LINKAGE SECTION.
01 LS-ID PIC 9(5).
PROCEDURE DIVISION.
DISPLAY 'Executing COBOL program using JCL'.
STOP RUN.
В JCL выполнить указанную выше программу COBOL следующим образом:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//INPUT DD DSN = ABC.EFG.XYZ,DISP = SHR
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
Executing COBOL program using JCL
Отдел процедур
Разделение процедур используется для включения логики программы. Он состоит из исполняемых операторов, использующих переменные, определенные в разделе данных. В этом разделе имена абзацев и разделов определяются пользователем.
В процедурном разделе должно быть хотя бы одно заявление. Последним оператором, завершающим выполнение в этом разделе, является либоSTOP RUN который используется в вызывающих программах или EXIT PROGRAM который используется в названных программах.
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME PIC A(30).
01 WS-ID PIC 9(5) VALUE 12345.
PROCEDURE DIVISION.
A000-FIRST-PARA.
DISPLAY 'Hello World'.
MOVE 'TutorialsPoint' TO WS-NAME.
DISPLAY "My name is : "WS-NAME.
DISPLAY "My ID is : "WS-ID.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
Hello World
My name is : TutorialsPoint
My ID is : 12345
Набор символов
«Персонажи» - самые низкие в иерархии, и их нельзя разделить дальше. Набор символов COBOL включает 78 символов, которые показаны ниже -
Sr.No. | Характер и описание |
---|---|
1 | A-Z Алфавиты (верхний регистр) |
2 | a-z Алфавиты (нижний регистр) |
3 | 0-9 Числовой |
4 |
Космос |
5 | + Знак плюс |
6 | - Знак минус или дефис |
7 | * Звездочка |
8 | / Косая черта |
9 | $ Знак валюты |
10 | , Запятая |
11 | ; Точка с запятой |
12 | . Десятичная точка или точка |
13 | " Кавычки |
14 | ( Левая скобка |
15 | ) Правая скобка |
16 | > Лучше чем |
17 | < Меньше, чем |
18 | : Двоеточие |
19 | ' Апостроф |
20 | = Знак равенства |
Лист кодирования
Исходная программа COBOL должна быть написана в формате, приемлемом для компиляторов. Программы COBOL написаны на таблицах кодирования COBOL. В каждой строке кода кода имеется 80 позиций.
Позиции символов сгруппированы в следующие пять полей -
Позиции | Поле | Описание |
---|---|---|
1-6 | Номера столбцов | Зарезервировано для номеров строк. |
7 | Индикатор | Он может иметь звездочку (*), обозначающую комментарии, дефис (-), обозначающий продолжение, и косую черту (/), обозначающий подачу формы. |
8-11 | Площадь А | Все разделы, разделы, параграфы и некоторые специальные записи COBOL должны начинаться в области A. |
12-72 | Площадь B | Все операторы COBOL должны начинаться в области B. |
73-80 | Зона идентификации | Программист может использовать его по мере необходимости. |
пример
В следующем примере показана таблица кодирования COBOL -
000100 IDENTIFICATION DIVISION. 000100
000200 PROGRAM-ID. HELLO. 000101
000250* THIS IS A COMMENT LINE 000102
000300 PROCEDURE DIVISION. 000103
000350 A000-FIRST-PARA. 000104
000400 DISPLAY “Coding Sheet”. 000105
000500 STOP RUN. 000106
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
Coding Sheet
Строки символов
Строки символов образуются путем объединения отдельных символов. Строка символов может быть
- Comment,
- Буквальный, или
- COBOL слово.
Все строки символов должны заканчиваться separators. Разделитель используется для разделения символьных строк.
Часто используемые разделители - пробел, запятая, точка, апостроф, левая / правая скобка и кавычки.
Комментарий
Комментарий - это строка символов, не влияющая на выполнение программы. Это может быть любая комбинация символов.
Есть два типа комментариев -
Строка комментария
Строку комментария можно написать в любом столбце. Компилятор не проверяет синтаксис строки комментария и обрабатывает ее для документации.
Запись комментария
Записи комментариев - это те, которые включены в необязательные параграфы Идентификационного отдела. Они написаны в области B, и программисты используют ее для справки.
Текст выделен Bold прокомментированные записи в следующем примере -
000100 IDENTIFICATION DIVISION. 000100
000150 PROGRAM-ID. HELLO. 000101
000200 AUTHOR. TUTORIALSPOINT. 000102
000250* THIS IS A COMMENT LINE 000103
000300 PROCEDURE DIVISION. 000104
000350 A000-FIRST-PARA. 000105
000360/ First Para Begins - Documentation Purpose 000106
000400 DISPLAY “Comment line”. 000107
000500 STOP RUN. 000108
JCL выполнить вышеуказанную программу COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
Comment Line
Буквальный
Литерал - это константа, которая жестко запрограммирована в программе. В следующем примере «Hello World» является буквальным.
PROCEDURE DIVISION.
DISPLAY 'Hello World'.
Как обсуждается ниже, существует два типа литералов:
Буквенно-цифровой литерал
Буквенно-цифровые литералы заключаются в кавычки или апострофы. Длина может быть до 160 символов. Апостроф или цитата могут быть частью литерала, только если они парные. Начало и конец буквального слова должны быть одинаковыми, апостроф или цитата.
Example
В следующем примере показаны допустимые и недопустимые буквенно-цифровые литералы -
Valid:
‘This is valid’
"This is valid"
‘This isn’’t invalid’
Invalid:
‘This is invalid”
‘This isn’t valid’
Числовой литерал
Числовой литерал - это комбинация цифр от 0 до 9, +, - или десятичной точки. Длина может быть до 18 символов. Знак не может быть самым правым символом. Десятичная точка не должна стоять в конце.
Example
В следующем примере показаны допустимые и недопустимые числовые литералы -
Valid:
100
+10.9
-1.9
Invalid:
1,00
10.
10.9-
COBOL Word
COBOL Word - это строка символов, которая может быть зарезервированным словом или заданным пользователем словом. Длина может быть до 30 символов.
Определяемые пользователем
Пользовательские слова используются для именования файлов, данных, записей, имен абзацев и разделов. При формировании слов, определяемых пользователем, можно использовать буквы, цифры и дефисы. Вы не можете использовать зарезервированные слова COBOL.
Зарезервированные слова
Зарезервированные слова - это заранее определенные слова в COBOL. Различные типы зарезервированных слов, которые мы часто используем, следующие:
Keywords например ДОБАВИТЬ, ПРИНЯТЬ, ПЕРЕМЕСТИТЬ и т. д.
Special characters такие слова, как +, -, *, <, <= и т. д.
Figurative constants являются постоянными значениями, такими как ZERO, SPACES и т.д. Все постоянные значения образных констант указаны в следующей таблице.
Образные константы
Sr.No. | Образные константы и описание |
---|---|
1 | HIGH-VALUES Один или несколько символов, занимающих наивысшую позицию в порядке убывания. |
2 | LOW-VALUES Один или несколько символов имеют нули в двоичном представлении. |
3 | ZERO/ZEROES Один или несколько нулей в зависимости от размера переменной. |
4 | SPACES Одно или несколько пробелов. |
5 | QUOTES Одиночные или двойные кавычки. |
6 | ALL literal Заполняет элемент данных литералом. |
Data Division используется для определения переменных, используемых в программе. Чтобы описать данные в COBOL, нужно понимать следующие термины -
- Имя данных
- Номер уровня
- Пункт с изображением
- Предложение о стоимости
01 TOTAL-STUDENTS PIC9(5) VALUE '125'.
| | | |
| | | |
| | | |
Level Number Data Name Picture Clause Value Clause
Имя данных
Имена данных должны быть определены в Отделе данных перед их использованием в Отделе процедур. У них должно быть определенное пользователем имя; зарезервированные слова не могут быть использованы. Имена данных указывают на ячейки памяти, в которых хранятся фактические данные. Они могут быть элементарного или группового типа.
пример
В следующем примере показаны допустимые и недопустимые имена данных -
Valid:
WS-NAME
TOTAL-STUDENTS
A100
100B
Invalid:
MOVE (Reserved Words)
COMPUTE (Reserved Words)
100 (No Alphabet)
100+B (+ is not allowed)
Номер уровня
Номер уровня используется для указания уровня данных в записи. Они используются, чтобы различать элементарные элементы и элементы группы. Элементарные элементы можно сгруппировать вместе для создания групповых элементов.
Sr.No. | Номер и описание уровня |
---|---|
1 | 01 Запись описания записи |
2 | 02 to 49 Групповые и элементарные предметы |
3 | 66 Переименовать пункты статьи |
4 | 77 Предметы, которые нельзя разделить |
5 | 88 Запись названия условия |
Elementary itemsне могут быть разделены дальше. Номер уровня, имя данных, предложение Picture и предложение Value (необязательно) используются для описания элементарного элемента.
Group itemsсостоят из одного или нескольких элементарных элементов. Номер уровня, имя данных и предложение Value (необязательно) используются для описания элемента группы. Номер уровня группы всегда 01.
пример
В следующем примере показаны групповые и элементарные элементы -
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME PIC X(25). ---> ELEMENTARY ITEM
01 WS-CLASS PIC 9(2) VALUE '10'. ---> ELEMENTARY ITEM
01 WS-ADDRESS. ---> GROUP ITEM
05 WS-HOUSE-NUMBER PIC 9(3). ---> ELEMENTARY ITEM
05 WS-STREET PIC X(15). ---> ELEMENTARY ITEM
05 WS-CITY PIC X(15). ---> ELEMENTARY ITEM
05 WS-COUNTRY PIC X(15) VALUE 'INDIA'. ---> ELEMENTARY ITEM
Пункт с изображением
Предложение Picture используется для определения следующих элементов -
Data typeможет быть числовым, буквенным или буквенно-цифровым. Числовой тип состоит только из цифр от 0 до 9. Алфавитный тип состоит из букв от A до Z и пробелов. Буквенно-цифровой тип состоит из цифр, букв и специальных символов.
Signможно использовать с числовыми данными. Может быть либо +, либо -.
Decimal point positionможно использовать с числовыми данными. Предполагаемая позиция - это позиция десятичной точки, которая не включается в данные.
Length определяет количество байтов, используемых элементом данных.
Символы, используемые в предложении Picture -
Sr.No. | Символ и описание |
---|---|
1 | 9 Числовой |
2 | A По алфавиту |
3 | X Буквенно-цифровой |
4 | V Неявное десятичное число |
5 | S Подписать |
6 | P Предполагаемый десятичный |
пример
В следующем примере показано использование предложения PIC -
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC S9(3)V9(2).
01 WS-NUM2 PIC PPP999.
01 WS-NUM3 PIC S9(3)V9(2) VALUE -123.45.
01 WS-NAME PIC A(6) VALUE 'ABCDEF'.
01 WS-ID PIC X(5) VALUE 'A121$'.
PROCEDURE DIVISION.
DISPLAY "WS-NUM1 : "WS-NUM1.
DISPLAY "WS-NUM2 : "WS-NUM2.
DISPLAY "WS-NUM3 : "WS-NUM3.
DISPLAY "WS-NAME : "WS-NAME.
DISPLAY "WS-ID : "WS-ID.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-NUM1 : +000.00
WS-NUM2 : .000000
WS-NUM3 : -123.45
WS-NAME : ABCDEF
WS-ID : A121$
Предложение о стоимости
Предложение Value - это необязательное предложение, которое используется для инициализации элементов данных. Значения могут быть числовым буквальным, буквенно-цифровым буквальным или образной константой. Его можно использовать как с групповыми, так и с элементарными элементами.
пример
В следующем примере показано использование предложения VALUE -
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 99V9 VALUE IS 3.5.
01 WS-NAME PIC A(6) VALUE 'ABCD'.
01 WS-ID PIC 99 VALUE ZERO.
PROCEDURE DIVISION.
DISPLAY "WS-NUM1 : "WS-NUM1.
DISPLAY "WS-NAME : "WS-NAME.
DISPLAY "WS-ID : "WS-ID.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-NUM1 : 03.5
WS-NAME : ABCD
WS-ID : 00
COBOL-глаголы используются в разделении процедур для обработки данных. Утверждение всегда начинается с глагола COBOL. Есть несколько глаголов COBOL с разными типами действий.
Глаголы ввода / вывода
Команды ввода / вывода используются для получения данных от пользователя и отображения вывода программ COBOL. Для этого процесса используются следующие два глагола -
Принять глагол
Глагол Accept используется для получения таких данных, как дата, время и день, из операционной системы или напрямую от пользователя. Если программа принимает данные от пользователя, их необходимо передать через JCL. При получении данных из операционной системы включена опция FROM, как показано в следующем примере -
ACCEPT WS-STUDENT-NAME.
ACCEPT WS-DATE FROM SYSTEM-DATE.
Показать глагол
Команда Display используется для отображения вывода программы COBOL.
DISPLAY WS-STUDENT-NAME.
DISPLAY "System date is : " WS-DATE.
COBOL PROGRAM
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STUDENT-NAME PIC X(25).
01 WS-DATE PIC X(10).
PROCEDURE DIVISION.
ACCEPT WS-STUDENT-NAME.
ACCEPT WS-DATE FROM DATE.
DISPLAY "Name : " WS-STUDENT-NAME.
DISPLAY "Date : " WS-DATE.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//INPUT DD DSN=PROGRAM.DIRECTORY,DISP=SHR
//SYSIN DD *
TutorialsPoint
/*
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
Name : TutorialsPoint
Date : 200623
Инициализировать глагол
Команда инициализации используется для инициализации элемента группы или элементарного элемента. Имена данных с предложением RENAME не могут быть инициализированы. Элементы числовых данных заменяются НУЛЯМИ. Буквенно-цифровые или буквенные элементы данных заменяются ПРОБЕЛОМ. Если мы включим термин REPLACING, то элементы данных могут быть инициализированы заданным замещающим значением, как показано в следующем примере:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NAME PIC A(30) VALUE 'ABCDEF'.
01 WS-ID PIC 9(5).
01 WS-ADDRESS.
05 WS-HOUSE-NUMBER PIC 9(3).
05 WS-COUNTRY PIC X(15).
05 WS-PINCODE PIC 9(6) VALUE 123456.
PROCEDURE DIVISION.
A000-FIRST-PARA.
INITIALIZE WS-NAME, WS-ADDRESS.
INITIALIZE WS-ID REPLACING NUMERIC DATA BY 12345.
DISPLAY "My name is : "WS-NAME.
DISPLAY "My ID is : "WS-ID.
DISPLAY "Address : "WS-ADDRESS.
DISPLAY "House Number : "WS-HOUSE-NUMBER.
DISPLAY "Country : "WS-COUNTRY.
DISPLAY "Pincode : "WS-PINCODE.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
My name is :
My ID is : 12345
Address : 000 000000
House Number : 000
Country :
Pincode : 000000
Переместить глагол
Команда перемещения используется для копирования данных из исходных данных в данные назначения. Его можно использовать как для элементарных, так и для групповых элементов данных. Для элементов данных группы используется MOVE CORRESPONDING / CORR. В варианте «попробуйте» MOVE CORR не работает; но на мэйнфрейм-сервере это будет работать.
Для перемещения данных из строки используется MOVE (x: l), где x - начальная позиция, а l - длина. Данные будут усечены, если предложение PIC элемента данных назначения меньше, чем предложение PIC элемента данных источника. Если предложение PIC элемента данных назначения больше, чем предложение PIC элемента данных источника, то в дополнительные байты будут добавлены НУЛИ или ПРОБЕЛЫ. Следующий пример проясняет это.
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9).
01 WS-NUM2 PIC 9(9).
01 WS-NUM3 PIC 9(5).
01 WS-NUM4 PIC 9(6).
01 WS-ADDRESS.
05 WS-HOUSE-NUMBER PIC 9(3).
05 WS-COUNTRY PIC X(5).
05 WS-PINCODE PIC 9(6).
01 WS-ADDRESS1.
05 WS-HOUSE-NUMBER1 PIC 9(3).
05 WS-COUNTRY1 PIC X(5).
05 WS-PINCODE1 PIC 9(6).
PROCEDURE DIVISION.
A000-FIRST-PARA.
MOVE 123456789 TO WS-NUM1.
MOVE WS-NUM1 TO WS-NUM2 WS-NUM3.
MOVE WS-NUM1(3:6) TO WS-NUM4.
MOVE 123 TO WS-HOUSE-NUMBER.
MOVE 'INDIA' TO WS-COUNTRY.
MOVE 112233 TO WS-PINCODE.
MOVE WS-ADDRESS TO WS-ADDRESS1.
DISPLAY "WS-NUM1 : " WS-NUM1
DISPLAY "WS-NUM2 : " WS-NUM2
DISPLAY "WS-NUM3 : " WS-NUM3
DISPLAY "WS-NUM4 : " WS-NUM4
DISPLAY "WS-ADDRESS : " WS-ADDRESS
DISPLAY "WS-ADDRESS1 : " WS-ADDRESS1
STOP RUN.
JCL для выполнения указанной выше программы COBOL.
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-NUM1 : 123456789
WS-NUM2 : 123456789
WS-NUM3 : 56789
WS-NUM4 : 345678
WS-ADDRESS : 123INDIA112233
WS-ADDRESS1 : 123INDIA112233
Правовые ходы
В следующей таблице представлена информация о законных ходах -
По алфавиту | Буквенно-цифровой | Числовой | |
---|---|---|---|
По алфавиту | Возможно | Возможно | Невозможно |
Буквенно-цифровой | Возможно | Возможно | Возможно |
Числовой | Невозможно | Возможно | Возможно |
Добавить глагол
Глагол добавления используется для сложения двух или более чисел и сохранения результата в операнде назначения.
Синтаксис
Ниже приведен синтаксис для добавления двух или более чисел -
ADD A B TO C D
ADD A B C TO D GIVING E
ADD CORR WS-GROUP1 TO WS-GROUP2
В синтаксисе-1 добавляются A, B, C, и результат сохраняется в C (C = A + B + C). A, B, D складываются, и результат сохраняется в D (D = A + B + D).
В синтаксисе-2 добавляются A, B, C, D, и результат сохраняется в E (E = A + B + C + D).
В синтаксисе-3 элементы подгруппы в WS-GROUP1 и WS-GROUP2 добавляются, а результат сохраняется в WS-GROUP2.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9) VALUE 10 .
01 WS-NUM2 PIC 9(9) VALUE 10.
01 WS-NUM3 PIC 9(9) VALUE 10.
01 WS-NUM4 PIC 9(9) VALUE 10.
01 WS-NUMA PIC 9(9) VALUE 10.
01 WS-NUMB PIC 9(9) VALUE 10.
01 WS-NUMC PIC 9(9) VALUE 10.
01 WS-NUMD PIC 9(9) VALUE 10.
01 WS-NUME PIC 9(9) VALUE 10.
PROCEDURE DIVISION.
ADD WS-NUM1 WS-NUM2 TO WS-NUM3 WS-NUM4.
ADD WS-NUMA WS-NUMB WS-NUMC TO WS-NUMD GIVING WS-NUME.
DISPLAY "WS-NUM1 : " WS-NUM1
DISPLAY "WS-NUM2 : " WS-NUM2
DISPLAY "WS-NUM3 : " WS-NUM3
DISPLAY "WS-NUM4 : " WS-NUM4
DISPLAY "WS-NUMA : " WS-NUMA
DISPLAY "WS-NUMB : " WS-NUMB
DISPLAY "WS-NUMC : " WS-NUMC
DISPLAY "WS-NUMD : " WS-NUMD
DISPLAY "WS-NUME : " WS-NUME
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-NUM1 : 000000010
WS-NUM2 : 000000010
WS-NUM3 : 000000030
WS-NUM4 : 000000030
WS-NUMA : 000000010
WS-NUMB : 000000010
WS-NUMC : 000000010
WS-NUMD : 000000010
WS-NUME : 000000040
Вычесть глагол
Глагол вычитания используется для операций вычитания.
Синтаксис
Ниже приведен синтаксис для операций вычитания -
SUBTRACT A B FROM C D
SUBTRACT A B C FROM D GIVING E
SUBTRACT CORR WS-GROUP1 TO WS-GROUP2
В синтаксисе-1 A и B складываются и вычитаются из C. Результат сохраняется в C (C = C- (A + B)). A и B складываются и вычитаются из D. Результат сохраняется в D (D = D- (A + B)).
В синтаксисе-2 A, B, C складываются и вычитаются из D. Результат сохраняется в E (E = D- (A + B + C))
В синтаксисе-3 элементы подгруппы в WS-GROUP1 и WS-GROUP2 вычитаются, и результат сохраняется в WS-GROUP2.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9) VALUE 10 .
01 WS-NUM2 PIC 9(9) VALUE 10.
01 WS-NUM3 PIC 9(9) VALUE 100.
01 WS-NUM4 PIC 9(9) VALUE 100.
01 WS-NUMA PIC 9(9) VALUE 10.
01 WS-NUMB PIC 9(9) VALUE 10.
01 WS-NUMC PIC 9(9) VALUE 10.
01 WS-NUMD PIC 9(9) VALUE 100.
01 WS-NUME PIC 9(9) VALUE 10.
PROCEDURE DIVISION.
SUBTRACT WS-NUM1 WS-NUM2 FROM WS-NUM3 WS-NUM4.
SUBTRACT WS-NUMA WS-NUMB WS-NUMC FROM WS-NUMD GIVING WS-NUME.
DISPLAY "WS-NUM1 : " WS-NUM1
DISPLAY "WS-NUM2 : " WS-NUM2
DISPLAY "WS-NUM3 : " WS-NUM3
DISPLAY "WS-NUM4 : " WS-NUM4
DISPLAY "WS-NUMA : " WS-NUMA
DISPLAY "WS-NUMB : " WS-NUMB
DISPLAY "WS-NUMC : " WS-NUMC
DISPLAY "WS-NUMD : " WS-NUMD
DISPLAY "WS-NUME : " WS-NUME
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-NUM1 : 000000010
WS-NUM2 : 000000010
WS-NUM3 : 000000080
WS-NUM4 : 000000080
WS-NUMA : 000000010
WS-NUMB : 000000010
WS-NUMC : 000000010
WS-NUMD : 000000100
WS-NUME : 000000070
Умножить глагол
Глагол умножения используется для операций умножения.
Синтаксис
Ниже приведен синтаксис для умножения двух или более чисел -
MULTIPLY A BY B C
MULTIPLY A BY B GIVING E
В синтаксисе-1 A и B умножаются, и результат сохраняется в B (B = A * B). A и C умножаются, и результат сохраняется в C (C = A * C).
В синтаксисе-2 A и B умножаются, и результат сохраняется в E (E = A * B).
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9) VALUE 10 .
01 WS-NUM2 PIC 9(9) VALUE 10.
01 WS-NUM3 PIC 9(9) VALUE 10.
01 WS-NUMA PIC 9(9) VALUE 10.
01 WS-NUMB PIC 9(9) VALUE 10.
01 WS-NUMC PIC 9(9) VALUE 10.
PROCEDURE DIVISION.
MULTIPLY WS-NUM1 BY WS-NUM2 WS-NUM3.
MULTIPLY WS-NUMA BY WS-NUMB GIVING WS-NUMC.
DISPLAY "WS-NUM1 : " WS-NUM1
DISPLAY "WS-NUM2 : " WS-NUM2
DISPLAY "WS-NUM3 : " WS-NUM3
DISPLAY "WS-NUMA : " WS-NUMA
DISPLAY "WS-NUMB : " WS-NUMB
DISPLAY "WS-NUMC : " WS-NUMC
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-NUM1 : 000000010
WS-NUM2 : 000000100
WS-NUM3 : 000000100
WS-NUMA : 000000010
WS-NUMB : 000000010
WS-NUMC : 000000100
Разделить глагол
Глагол Divide используется для операций деления.
Синтаксис
Ниже приведен синтаксис для операций деления -
DIVIDE A INTO B
DIVIDE A BY B GIVING C REMAINDER R
В синтаксисе-1 B делится на A, и результат сохраняется в B (B = B / A).
В синтаксисе 2 A делится на B, и результат сохраняется в C (C = A / B), а остаток сохраняется в R.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9) VALUE 5.
01 WS-NUM2 PIC 9(9) VALUE 250.
01 WS-NUMA PIC 9(9) VALUE 100.
01 WS-NUMB PIC 9(9) VALUE 15.
01 WS-NUMC PIC 9(9).
01 WS-REM PIC 9(9).
PROCEDURE DIVISION.
DIVIDE WS-NUM1 INTO WS-NUM2.
DIVIDE WS-NUMA BY WS-NUMB GIVING WS-NUMC REMAINDER WS-REM.
DISPLAY "WS-NUM1 : " WS-NUM1
DISPLAY "WS-NUM2 : " WS-NUM2
DISPLAY "WS-NUMA : " WS-NUMA
DISPLAY "WS-NUMB : " WS-NUMB
DISPLAY "WS-NUMC : " WS-NUMC
DISPLAY "WS-REM : " WS-REM
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-NUM1 : 000000005
WS-NUM2 : 000000050
WS-NUMA : 000000100
WS-NUMB : 000000015
WS-NUMC : 000000006
WS-REM : 000000010
Вычислить заявление
Оператор Compute используется для записи арифметических выражений в COBOL. Это замена для сложения, вычитания, умножения и деления.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9) VALUE 10 .
01 WS-NUM2 PIC 9(9) VALUE 10.
01 WS-NUM3 PIC 9(9) VALUE 10.
01 WS-NUMA PIC 9(9) VALUE 50.
01 WS-NUMB PIC 9(9) VALUE 10.
01 WS-NUMC PIC 9(9).
PROCEDURE DIVISION.
COMPUTE WS-NUMC= (WS-NUM1 * WS-NUM2) - (WS-NUMA / WS-NUMB) + WS-NUM3.
DISPLAY "WS-NUM1 : " WS-NUM1
DISPLAY "WS-NUM2 : " WS-NUM2
DISPLAY "WS-NUM3 : " WS-NUM3
DISPLAY "WS-NUMA : " WS-NUMA
DISPLAY "WS-NUMB : " WS-NUMB
DISPLAY "WS-NUMC : " WS-NUMC
STOP RUN.
JCL для выполнения указанной выше программы COBOL.
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-NUM1 : 000000010
WS-NUM2 : 000000010
WS-NUM3 : 000000010
WS-NUMA : 000000050
WS-NUMB : 000000010
WS-NUMC : 000000105
Макет COBOL - это описание использования каждого поля и содержащихся в нем значений. Ниже приведены записи описания данных, используемые в COBOL.
- Новое определение статьи
- Пункт переименования
- Положение об использовании
- Copybooks
Новое определение статьи
Предложение Redefines используется для определения хранилища с другим описанием данных. Если один или несколько элементов данных не используются одновременно, то то же хранилище можно использовать для другого элемента данных. Таким образом, одно и то же хранилище может относиться к разным элементам данных.
Синтаксис
Ниже приведен синтаксис предложения Redefines -
01 WS-OLD PIC X(10).
01 WS-NEW1 REDEFINES WS-OLD PIC 9(8).
01 WS-NEW2 REDEFINES WS-OLD PIC A(10).
Ниже приведены подробные сведения об используемых параметрах -
- WS-OLD - это переопределенный элемент
- WS-NEW1 и WS-NEW2 - это новое определение
Номера уровней переопределяемого предмета и переопределяемого предмета должны быть одинаковыми и не могут быть номерами 66 или 88. Не используйте предложение VALUE с переопределяющим элементом. В разделе файлов не используйте предложение переопределения с номером уровня 01. Определение переопределения должно быть следующим описанием данных, которое вы хотите переопределить. Переопределенный элемент всегда будет иметь то же значение, что и переопределенный элемент.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DESCRIPTION.
05 WS-DATE1 VALUE '20140831'.
10 WS-YEAR PIC X(4).
10 WS-MONTH PIC X(2).
10 WS-DATE PIC X(2).
05 WS-DATE2 REDEFINES WS-DATE1 PIC 9(8).
PROCEDURE DIVISION.
DISPLAY "WS-DATE1 : "WS-DATE1.
DISPLAY "WS-DATE2 : "WS-DATE2.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-DATE1 : 20140831
WS-DATE2 : 20140831
Пункт переименования
Предложение Renames используется для присвоения различных имен существующим элементам данных. Он используется для повторной группировки имен данных и присвоения им нового имени. Новые имена данных можно переименовывать в группах или элементарных элементах. Уровень 66 зарезервирован для переименований.
Syntax
Ниже приведен синтаксис предложения Renames -
01 WS-OLD.
10 WS-A PIC 9(12).
10 WS-B PIC X(20).
10 WS-C PIC A(25).
10 WS-D PIC X(12).
66 WS-NEW RENAMES WS-A THRU WS-C.
Переименование возможно только на том же уровне. В приведенном выше примере WS-A, WS-B и WS-C находятся на одном уровне. Определение переименования должно быть следующим описанием данных, которое вы хотите переименовать. Не используйте Renames с номером уровня 01, 77 или 66. Имена данных, используемые для переименований, должны идти последовательно. Элементы данных с предложением происходят не могут быть переименованы.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DESCRIPTION.
05 WS-NUM.
10 WS-NUM1 PIC 9(2) VALUE 20.
10 WS-NUM2 PIC 9(2) VALUE 56.
05 WS-CHAR.
10 WS-CHAR1 PIC X(2) VALUE 'AA'.
10 WS-CHAR2 PIC X(2) VALUE 'BB'.
66 WS-RENAME RENAMES WS-NUM2 THRU WS-CHAR2.
PROCEDURE DIVISION.
DISPLAY "WS-RENAME : " WS-RENAME.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-RENAME : 56AABB
Положение об использовании
Предложение Usage определяет операционную систему, в которой хранятся данные формата. Его нельзя использовать с номерами уровней 66 или 88. Если условие использования указано для группы, тогда все элементарные элементы будут иметь одинаковое предложение использования. Различные варианты, доступные с предложением использования, следующие:
Дисплей
Элемент данных хранится в формате ASCII, и каждый символ занимает 1 байт. Это использование по умолчанию.
В следующем примере вычисляется количество требуемых байтов -
01 WS-NUM PIC S9(5)V9(3) USAGE IS DISPLAY.
It requires 8 bytes as sign and decimal doesn't require any byte.
01 WS-NUM PIC 9(5) USAGE IS DISPLAY.
It requires 5 bytes as sign.
ВЫЧИСЛИТЕЛЬНЫЙ / КОМП
Элемент данных хранится в двоичном формате. Здесь элементы данных должны быть целыми.
В следующем примере вычисляется количество требуемых байтов -
01 WS-NUM PIC S9(n) USAGE IS COMP.
If 'n' = 1 to 4, it takes 2 bytes.
If 'n' = 5 to 9, it takes 4 bytes.
If 'n' = 10 to 18, it takes 8 bytes.
КОМП-1
Элемент данных похож на Real или Float и представлен как число с плавающей запятой одинарной точности. Внутри данные хранятся в шестнадцатеричном формате. COMP-1 не принимает пункт PIC. Здесь 1 слово равно 4 байтам.
КОМП-2
Элемент данных похож на Long или Double и представлен как число с плавающей запятой двойной точности. Внутри данные хранятся в шестнадцатеричном формате. COMP-2 не определяет пункт PIC. Здесь 2 слова равны 8 байтам.
КОМП-3
Элемент данных хранится в упакованном десятичном формате. Каждая цифра занимает полбайта (1 полубайт), а знак сохраняется в крайнем правом полубайте.
В следующем примере вычисляется количество требуемых байтов -
01 WS-NUM PIC 9(n) USAGE IS COMP.
Number of bytes = n/2 (If n is even)
Number of bytes = n/2 + 1(If n is odd, consider only integer part)
01 WS-NUM PIC 9(4) USAGE IS COMP-3 VALUE 21.
It requires 2 bytes of storage as each digit occupies half a byte.
01 WS-NUM PIC 9(5) USAGE IS COMP-3 VALUE 21.
It requires 3 bytes of storage as each digit occupies half a byte.
Тетради
Записная книжка COBOL - это набор кода, который определяет структуры данных. Если во многих программах используется определенная структура данных, то вместо повторной записи той же структуры данных мы можем использовать тетрадки. Мы используем оператор COPY, чтобы включить тетрадь в программу. Оператор COPY используется в разделе WorkingStorage.
Следующий пример включает тетрадь внутри программы COBOL -
DATA DIVISION.
WORKING-STORAGE SECTION.
COPY ABC.
Здесь ABC - название тетради. Следующие элементы данных в тетради ABC могут использоваться внутри программы.
01 WS-DESCRIPTION.
05 WS-NUM.
10 WS-NUM1 PIC 9(2) VALUE 20.
10 WS-NUM2 PIC 9(2) VALUE 56.
05 WS-CHAR.
10 WS-CHAR1 PIC X(2) VALUE 'AA'.
10 WS-CHAR2 PIC X(2) VALUE 'BB'.
Условные операторы используются для изменения потока выполнения в зависимости от определенных условий, указанных программистом. Условные утверждения всегда будут иметь значение истина или ложь. Условия используются в операторах IF, Evaluate и Perform. Различные типы условий следующие:
- Заявление условия ЕСЛИ
- Условие отношения
- Условие знака
- Состояние класса
- Название условия Условие
- Отрицательное состояние
- Комбинированное состояние
Заявление условия ЕСЛИ
Оператор IF проверяет наличие условий. Если условие истинно, выполняется блок IF; и если условие ложно, выполняется блок ELSE.
END-IFиспользуется для завершения блока IF. Чтобы завершить блок IF, можно использовать точку вместо END-IF. Но всегда предпочтительнее использовать END-IF для нескольких блоков IF.
Nested-IF- IF-блоки появляются внутри другого IF-блока. Нет ограничений на глубину вложенных операторов IF.
Синтаксис
Ниже приведен синтаксис операторов условия IF:
IF [condition] THEN
[COBOL statements]
ELSE
[COBOL statements]
END-IF.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9).
01 WS-NUM2 PIC 9(9).
01 WS-NUM3 PIC 9(5).
01 WS-NUM4 PIC 9(6).
PROCEDURE DIVISION.
A000-FIRST-PARA.
MOVE 25 TO WS-NUM1 WS-NUM3.
MOVE 15 TO WS-NUM2 WS-NUM4.
IF WS-NUM1 > WS-NUM2 THEN
DISPLAY 'IN LOOP 1 - IF BLOCK'
IF WS-NUM3 = WS-NUM4 THEN
DISPLAY 'IN LOOP 2 - IF BLOCK'
ELSE
DISPLAY 'IN LOOP 2 - ELSE BLOCK'
END-IF
ELSE
DISPLAY 'IN LOOP 1 - ELSE BLOCK'
END-IF.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
IN LOOP 1 - IF BLOCK
IN LOOP 2 - ELSE BLOCK
Условие отношения
Условие отношения сравнивает два операнда, каждый из которых может быть идентификатором, литералом или арифметическим выражением. Алгебраическое сравнение числовых полей выполняется независимо от размера и условия использования.
For non-numeric operands
Если сравниваются два нечисловых операнда равного размера, то символы сравниваются слева с соответствующими позициями до тех пор, пока не будет достигнут конец. Операнд, содержащий большее количество символов, объявляется большим.
Если сравниваются два нечисловых операнда неравного размера, то к более короткому элементу данных добавляются пробелы в конце до тех пор, пока размер операндов не станет равным, а затем сравнивается в соответствии с правилами, упомянутыми в предыдущем пункте.
Синтаксис
Ниже приведен синтаксис операторов условия отношения -
[Data Name/Arithmetic Operation]
[IS] [NOT]
[Equal to (=),Greater than (>), Less than (<),
Greater than or Equal (>=), Less than or equal (<=) ]
[Data Name/Arithmetic Operation]
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(9).
01 WS-NUM2 PIC 9(9).
PROCEDURE DIVISION.
A000-FIRST-PARA.
MOVE 25 TO WS-NUM1.
MOVE 15 TO WS-NUM2.
IF WS-NUM1 IS GREATER THAN OR EQUAL TO WS-NUM2 THEN
DISPLAY 'WS-NUM1 IS GREATER THAN WS-NUM2'
ELSE
DISPLAY 'WS-NUM1 IS LESS THAN WS-NUM2'
END-IF.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-NUM1 IS GREATER THAN WS-NUM2
Условие знака
Условие знака используется для проверки знака числового операнда. Он определяет, является ли данное числовое значение больше, меньше или равно НУЛЮ.
Синтаксис
Ниже приведен синтаксис операторов условия подписи -
[Data Name/Arithmetic Operation]
[IS] [NOT]
[Positive, Negative or Zero]
[Data Name/Arithmetic Operation]
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC S9(9) VALUE -1234.
01 WS-NUM2 PIC S9(9) VALUE 123456.
PROCEDURE DIVISION.
A000-FIRST-PARA.
IF WS-NUM1 IS POSITIVE THEN
DISPLAY 'WS-NUM1 IS POSITIVE'.
IF WS-NUM1 IS NEGATIVE THEN
DISPLAY 'WS-NUM1 IS NEGATIVE'.
IF WS-NUM1 IS ZERO THEN
DISPLAY 'WS-NUM1 IS ZERO'.
IF WS-NUM2 IS POSITIVE THEN
DISPLAY 'WS-NUM2 IS POSITIVE'.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-NUM1 IS NEGATIVE
WS-NUM2 IS POSITIVE
Состояние класса
Условие класса используется для проверки того, содержит ли операнд только буквы или числа. Пробелы рассматриваются в АЛФАВИТЕ, АЛФАВИТЕ ВНИЗ и ВЕРХНИЙ АЛФАВИТ.
Синтаксис
Ниже приведен синтаксис операторов условия класса -
[Data Name/Arithmetic Operation>]
[IS] [NOT]
[NUMERIC, ALPHABETIC, ALPHABETIC-LOWER, ALPHABETIC-UPPER]
[Data Name/Arithmetic Operation]
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC X(9) VALUE 'ABCD '.
01 WS-NUM2 PIC 9(9) VALUE 123456789.
PROCEDURE DIVISION.
A000-FIRST-PARA.
IF WS-NUM1 IS ALPHABETIC THEN
DISPLAY 'WS-NUM1 IS ALPHABETIC'.
IF WS-NUM1 IS NUMERIC THEN
DISPLAY 'WS-NUM1 IS NUMERIC'.
IF WS-NUM2 IS NUMERIC THEN
DISPLAY 'WS-NUM2 IS NUMERIC'.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-NUM1 IS ALPHABETIC
WS-NUM2 IS NUMERIC
Название условия Условие
Имя-условия - это имя, определяемое пользователем. Он содержит набор значений, заданных пользователем. Он ведет себя как логические переменные. Они определены с номером 88. У него не будет пункта PIC.
Синтаксис
Ниже приводится синтаксис определяемых пользователем операторов условий:
88 [Condition-Name] VALUE [IS, ARE] [LITERAL] [THRU LITERAL].
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM PIC 9(3).
88 PASS VALUES ARE 041 THRU 100.
88 FAIL VALUES ARE 000 THRU 40.
PROCEDURE DIVISION.
A000-FIRST-PARA.
MOVE 65 TO WS-NUM.
IF PASS
DISPLAY 'Passed with ' WS-NUM ' marks'.
IF FAIL
DISPLAY 'FAILED with ' WS-NUM 'marks'.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
Passed with 065 marks
Отрицательное состояние
Отрицательное условие задается ключевым словом NOT. Если условие истинно и перед ним мы указали НЕ, то его окончательное значение будет ложным.
Синтаксис
Ниже приведен синтаксис операторов отрицательного условия.
IF NOT [CONDITION]
COBOL Statements
END-IF.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(2) VALUE 20.
01 WS-NUM2 PIC 9(9) VALUE 25.
PROCEDURE DIVISION.
A000-FIRST-PARA.
IF NOT WS-NUM1 IS LESS THAN WS-NUM2 THEN
DISPLAY 'IF-BLOCK'
ELSE
DISPLAY 'ELSE-BLOCK'
END-IF.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
ELSE-BLOCK
Комбинированное состояние
Комбинированное условие содержит два или более условий, связанных с помощью логических операторов И или ИЛИ.
Синтаксис
Ниже приведен синтаксис комбинированных операторов условий -
IF [CONDITION] AND [CONDITION]
COBOL Statements
END-IF.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-NUM1 PIC 9(2) VALUE 20.
01 WS-NUM2 PIC 9(2) VALUE 25.
01 WS-NUM3 PIC 9(2) VALUE 20.
PROCEDURE DIVISION.
A000-FIRST-PARA.
IF WS-NUM1 IS LESS THAN WS-NUM2 AND WS-NUM1=WS-NUM3 THEN
DISPLAY 'Both condition OK'
ELSE
DISPLAY 'Error'
END-IF.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
Both condition OK
Оценить глагол
Глагол Evaluate заменяет серию операторов IF-ELSE. Его можно использовать для оценки более чем одного условия. Он похож на оператор SWITCH в программах на C.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9 VALUE 0.
PROCEDURE DIVISION.
MOVE 3 TO WS-A.
EVALUATE TRUE
WHEN WS-A > 2
DISPLAY 'WS-A GREATER THAN 2'
WHEN WS-A < 0
DISPLAY 'WS-A LESS THAN 0'
WHEN OTHER
DISPLAY 'INVALID VALUE OF WS-A'
END-EVALUATE.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-A GREATER THAN 2
Есть некоторые задачи, которые нужно выполнять снова и снова, например, чтение каждой записи файла до конца. Операторы цикла, используемые в COBOL:
- Выполнить через
- Выполнять до
- Время выполнения
- Выполнить Варьирование
Выполнить через
Perform Thru используется для выполнения серии абзацев, задавая имена первого и последнего абзаца в последовательности. После выполнения последнего абзаца управление возвращается обратно.
Встроенное исполнение
Операторы внутри PERFORM будут выполняться до достижения END-PERFORM.
Синтаксис
Ниже приведен синтаксис встроенного выполнения -
PERFORM
DISPLAY 'HELLO WORLD'
END-PERFORM.
Вне линии Выполнить
Здесь оператор выполняется в одном абзаце, а затем управление передается другому абзацу или разделу.
Синтаксис
Ниже приведен синтаксис выполнения вне очереди -
PERFORM PARAGRAPH1 THRU PARAGRAPH2
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
A-PARA.
PERFORM DISPLAY 'IN A-PARA'
END-PERFORM.
PERFORM C-PARA THRU E-PARA.
B-PARA.
DISPLAY 'IN B-PARA'.
STOP RUN.
C-PARA.
DISPLAY 'IN C-PARA'.
D-PARA.
DISPLAY 'IN D-PARA'.
E-PARA.
DISPLAY 'IN E-PARA'.
JCL для выполнения указанной выше программы COBOL.
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
IN A-PARA
IN C-PARA
IN D-PARA
IN E-PARA
IN B-PARA
Выполнять до
В «выполнять до» абзац выполняется до тех пор, пока данное условие не станет истинным. «С проверкой до» является условием по умолчанию и означает, что условие проверяется перед выполнением операторов в абзаце.
Синтаксис
Ниже приведен синтаксис выполнения до -
PERFORM A-PARA UNTIL COUNT=5
PERFORM A-PARA WITH TEST BEFORE UNTIL COUNT=5
PERFORM A-PARA WITH TEST AFTER UNTIL COUNT=5
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CNT PIC 9(1) VALUE 0.
PROCEDURE DIVISION.
A-PARA.
PERFORM B-PARA WITH TEST AFTER UNTIL WS-CNT>3.
STOP RUN.
B-PARA.
DISPLAY 'WS-CNT : 'WS-CNT.
ADD 1 TO WS-CNT.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-CNT : 0
WS-CNT : 1
WS-CNT : 2
WS-CNT : 3
Время выполнения
В поле «раз выполнения» абзац будет выполняться указанное количество раз.
Синтаксис
Ниже приведен синтаксис времени выполнения -
PERFORM A-PARA 5 TIMES.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
PROCEDURE DIVISION.
A-PARA.
PERFORM B-PARA 3 TIMES.
STOP RUN.
B-PARA.
DISPLAY 'IN B-PARA'.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
IN B-PARA
IN B-PARA
IN B-PARA
Выполнить Варьирование
При изменении выполнения абзац будет выполняться до тех пор, пока условие в фразе «До» не станет истинным.
Синтаксис
Ниже приведен синтаксис изменения выполнения -
PERFORM A-PARA VARYING A FROM 1 BY 1 UNTIL A = 5.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9 VALUE 0.
PROCEDURE DIVISION.
A-PARA.
PERFORM B-PARA VARYING WS-A FROM 1 BY 1 UNTIL WS-A=5
STOP RUN.
B-PARA.
DISPLAY 'IN B-PARA ' WS-A.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
IN B-PARA 1
IN B-PARA 2
IN B-PARA 3
IN B-PARA 4
ПЕРЕЙТИ К Заявлению
Оператор GO TO используется для изменения потока выполнения в программе. В операторах GO TO перевод идет только в прямом направлении. Используется для выхода из абзаца. Используются различные типы операторов GO TO:
Безусловный ПЕРЕЙТИ К
GO TO para-name.
Условный переход к
GO TO para-1 para-2 para-3 DEPENDING ON x.
Если «x» равно 1, то управление будет передано первому абзацу; и если «x» равно 2, то управление будет передано второму абзацу и так далее.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-A PIC 9 VALUE 2.
PROCEDURE DIVISION.
A-PARA.
DISPLAY 'IN A-PARA'
GO TO B-PARA.
B-PARA.
DISPLAY 'IN B-PARA '.
GO TO C-PARA D-PARA DEPENDING ON WS-A.
C-PARA.
DISPLAY 'IN C-PARA '.
D-PARA.
DISPLAY 'IN D-PARA '.
STOP RUN.
JCL чтобы выполнить указанную выше программу COBOL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете указанную выше программу, она дает следующий результат:
IN A-PARA
IN B-PARA
IN D-PARA
Операторы обработки строк в COBOL используются для выполнения нескольких функциональных операций со строками. Ниже приведены операторы обработки строк -
- Inspect
- String
- Unstring
Осмотреть
Глагол проверки используется для подсчета или замены символов в строке. Строковые операции могут выполняться с буквенно-цифровыми, числовыми или буквенными значениями. Операции проверки выполняются слева направо. Параметры, используемые для строковых операций, следующие:
Подсчет
Опция подсчета используется для подсчета символов строки.
Syntax
Ниже приведен синтаксис опции Tallying -
INSPECT input-string
TALLYING output-count FOR ALL CHARACTERS
Используемые параметры:
- input-string - строка, символы которой нужно подсчитать.
- output-count - Элемент данных для хранения количества символов.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-CNT1 PIC 9(2) VALUE 0.
01 WS-CNT2 PIC 9(2) VALUE 0.
01 WS-STRING PIC X(15) VALUE 'ABCDACDADEAAAFF'.
PROCEDURE DIVISION.
INSPECT WS-STRING TALLYING WS-CNT1 FOR CHARACTER.
DISPLAY "WS-CNT1 : "WS-CNT1.
INSPECT WS-STRING TALLYING WS-CNT2 FOR ALL 'A'.
DISPLAY "WS-CNT2 : "WS-CNT2
STOP RUN.
JCL для выполнения указанной выше программы COBOL.
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-CNT1 : 15
WS-CNT2 : 06
Замена
Параметр замены используется для замены строковых символов.
Syntax
Ниже приведен синтаксис опции замены -
INSPECT input-string REPLACING ALL char1 BY char2.
Используемый параметр -
input-string - Строка, символы которой нужно заменить с char1 на char2.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STRING PIC X(15) VALUE 'ABCDACDADEAAAFF'.
PROCEDURE DIVISION.
DISPLAY "OLD STRING : "WS-STRING.
INSPECT WS-STRING REPLACING ALL 'A' BY 'X'.
DISPLAY "NEW STRING : "WS-STRING.
STOP RUN.
JCL для выполнения указанной выше программы COBOL.
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
OLD STRING : ABCDACDADEAAAFF
NEW STRING : XBCDXCDXDEXXXFF
Строка
Глагол String используется для объединения строк. Используя оператор STRING, можно объединить две или более строки символов в более длинную строку. Условие «с разделителями» является обязательным.
Syntax
Ниже приведен синтаксис строкового глагола -
STRING ws-string1 DELIMITED BY SPACE
ws-string2 DELIMITED BY SIZE
INTO ws-destination-string
WITH POINTER ws-count
ON OVERFLOW DISPLAY message1
NOT ON OVERFLOW DISPLAY message2
END-STRING.
Ниже приведены подробные сведения об используемых параметрах -
- ws-string1 и ws-string2: входные строки для объединения
- ws-string: Выходная строка
- ws-count: используется для подсчета длины новой объединенной строки
- С разделителями указывает конец строки
- Указатель и переполнение не являются обязательными
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STRING PIC A(30).
01 WS-STR1 PIC A(15) VALUE 'Tutorialspoint'.
01 WS-STR2 PIC A(7) VALUE 'Welcome'.
01 WS-STR3 PIC A(7) VALUE 'To AND'.
01 WS-COUNT PIC 99 VALUE 1.
PROCEDURE DIVISION.
STRING WS-STR2 DELIMITED BY SIZE
WS-STR3 DELIMITED BY SPACE
WS-STR1 DELIMITED BY SIZE
INTO WS-STRING
WITH POINTER WS-COUNT
ON OVERFLOW DISPLAY 'OVERFLOW!'
END-STRING.
DISPLAY 'WS-STRING : 'WS-STRING.
DISPLAY 'WS-COUNT : 'WS-COUNT.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-STRING : WelcomeToTutorialspoint
WS-COUNT : 25
Unstring
Глагол Unstring используется для разделения одной строки на несколько подстрок. Пункт с разделителями является обязательным.
Syntax
Ниже приводится синтаксис глагола Unstring -
UNSTRING ws-string DELIMITED BY SPACE
INTO ws-str1, ws-str2
WITH POINTER ws-count
ON OVERFLOW DISPLAY message
NOT ON OVERFLOW DISPLAY message
END-UNSTRING.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STRING PIC A(30) VALUE 'WELCOME TO TUTORIALSPOINT'.
01 WS-STR1 PIC A(7).
01 WS-STR2 PIC A(2).
01 WS-STR3 PIC A(15).
01 WS-COUNT PIC 99 VALUE 1.
PROCEDURE DIVISION.
UNSTRING WS-STRING DELIMITED BY SPACE
INTO WS-STR1, WS-STR2, WS-STR3
END-UNSTRING.
DISPLAY 'WS-STR1 : 'WS-STR1.
DISPLAY 'WS-STR2 : 'WS-STR2.
DISPLAY 'WS-STR3 : 'WS-STR3.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-STR1 : WELCOME
WS-STR2 : TO
WS-STR3 : TUTORIALSPOINT
Массивы в COBOL известны как таблицы. Массив - это линейная структура данных, представляющая собой набор отдельных элементов данных одного типа. Элементы данных таблицы сортируются внутри.
Объявление таблицы
Таблица объявлена в Data Division. Occursпредложение используется для определения таблицы. Предложение Occurs указывает на повторение определения имени данных. Его можно использовать только с номерами уровней, начинающимися с 02 по 49. Не использовать условие возникновения с переопределениями. Описание одномерной и двухмерной таблицы выглядит следующим образом -
Одномерный стол
В одномерной таблице occursПредложение используется только один раз в объявлении. WSTABLE - это элемент группы, содержащий таблицу. WS-B называет элементы таблицы, которые встречаются 10 раз.
Syntax
Ниже приведен синтаксис для определения одномерной таблицы:
01 WS-TABLE.
05 WS-A PIC A(10) OCCURS 10 TIMES.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A PIC A(10) VALUE 'TUTORIALS' OCCURS 5 TIMES.
PROCEDURE DIVISION.
DISPLAY "ONE-D TABLE : "WS-TABLE.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
ONE-D TABLE : TUTORIALS TUTORIALS TUTORIALS TUTORIALS TUTORIALS
Двумерный стол
Двумерная таблица создается с обоими элементами данных переменной длины. Для справки просмотрите синтаксис, а затем попробуйте проанализировать таблицу. Первый массив (WS-A) может встречаться от 1 до 10 раз, а внутренний массив (WS-C) может встречаться от 1 до 5 раз. Каждой записи WS-A соответствует 5 записей WS-C.
Syntax
Ниже приведен синтаксис для определения двумерной таблицы:
01 WS-TABLE.
05 WS-A OCCURS 10 TIMES.
10 WS-B PIC A(10).
10 WS-C OCCURS 5 TIMES.
15 WS-D PIC X(6).
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A OCCURS 2 TIMES.
10 WS-B PIC A(10) VALUE ' TUTORIALS'.
10 WS-C OCCURS 2 TIMES.
15 WS-D PIC X(6) VALUE ' POINT'.
PROCEDURE DIVISION.
DISPLAY "TWO-D TABLE : "WS-TABLE.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
TWO-D TABLE : TUTORIALS POINT POINT TUTORIALS POINT POINT
Нижний индекс
Доступ к отдельным элементам таблицы можно получить с помощью нижнего индекса. Значения нижнего индекса могут варьироваться от 1 до количества раз, когда таблица встречается. Нижний индекс может быть любым положительным числом. Никакого объявления в разделе данных не требуется. Он автоматически создается с предложением происходит.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A OCCURS 3 TIMES.
10 WS-B PIC A(2).
10 WS-C OCCURS 2 TIMES.
15 WS-D PIC X(3).
PROCEDURE DIVISION.
MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
DISPLAY 'WS-TABLE : ' WS-TABLE.
DISPLAY 'WS-A(1) : ' WS-A(1).
DISPLAY 'WS-C(1,1) : ' WS-C(1,1).
DISPLAY 'WS-C(1,2) : ' WS-C(1,2).
DISPLAY 'WS-A(2) : ' WS-A(2).
DISPLAY 'WS-C(2,1) : ' WS-C(2,1).
DISPLAY 'WS-C(2,2) : ' WS-C(2,2).
DISPLAY 'WS-A(3) : ' WS-A(3).
DISPLAY 'WS-C(3,1) : ' WS-C(3,1).
DISPLAY 'WS-C(3,2) : ' WS-C(3,2).
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
WS-TABLE : 12ABCDEF34GHIJKL56MNOPQR
WS-A(1) : 12ABCDEF
WS-C(1,1) : ABC
WS-C(1,2) : DEF
WS-A(2) : 34GHIJKL
WS-C(2,1) : GHI
WS-C(2,2) : JKL
WS-A(3) : 56MNOPQR
WS-C(3,1) : MNO
WS-C(3,2) : PQR
Индекс
Доступ к элементам таблицы также можно получить с помощью index. Индекс - это смещение элемента от начала таблицы. Индекс объявляется с помощью предложения Occurs с использованием предложения INDEXED BY. Значение индекса можно изменить с помощью оператора SET и опции PERFORM Varying.
Syntax
Ниже приведен синтаксис для определения индекса в таблице.
01 WS-TABLE.
05 WS-A PIC A(10) OCCURS 10 TIMES INDEXED BY I.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A OCCURS 3 TIMES INDEXED BY I.
10 WS-B PIC A(2).
10 WS-C OCCURS 2 TIMES INDEXED BY J.
15 WS-D PIC X(3).
PROCEDURE DIVISION.
MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
PERFORM A-PARA VARYING I FROM 1 BY 1 UNTIL I >3
STOP RUN.
A-PARA.
PERFORM C-PARA VARYING J FROM 1 BY 1 UNTIL J>2.
C-PARA.
DISPLAY WS-C(I,J).
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
ABC
DEF
GHI
JKL
MNO
PQR
Установить заявление
Оператор Set используется для изменения значения индекса. Команда установки используется для инициализации, увеличения или уменьшения значения индекса. Он используется с Поиском и Поиском по всем для поиска элементов в таблице.
Syntax
Ниже приведен синтаксис использования оператора Set -
SET I J TO positive-number
SET I TO J
SET I TO 5
SET I J UP BY 1
SET J DOWN BY 5
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A OCCURS 3 TIMES INDEXED BY I.
10 WS-B PIC A(2).
10 WS-C OCCURS 2 TIMES INDEXED BY J.
15 WS-D PIC X(3).
PROCEDURE DIVISION.
MOVE '12ABCDEF34GHIJKL56MNOPQR' TO WS-TABLE.
SET I J TO 1.
DISPLAY WS-C(I,J).
SET I J UP BY 1.
DISPLAY WS-C(I,J).
STOP RUN.
JCL для выполнения указанной выше программы COBOL.
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
ABC
JKL
Поиск
Поиск - это метод линейного поиска, который используется для поиска элементов внутри таблицы. Это может быть выполнено как на отсортированной, так и на несортированной таблице. Используется только для таблиц, объявленных индексной фразой. Начинается с начального значения index. Если искомый элемент не найден, индекс автоматически увеличивается на 1 и продолжается до конца таблицы.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-A PIC X(1) OCCURS 18 TIMES INDEXED BY I.
01 WS-SRCH PIC A(1) VALUE 'M'.
PROCEDURE DIVISION.
MOVE 'ABCDEFGHIJKLMNOPQR' TO WS-TABLE.
SET I TO 1.
SEARCH WS-A
AT END DISPLAY 'M NOT FOUND IN TABLE'
WHEN WS-A(I) = WS-SRCH
DISPLAY 'LETTER M FOUND IN TABLE'
END-SEARCH.
STOP RUN.
JCL для выполнения указанной выше программы COBOL.
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
LETTER M FOUND IN TABLE
Искать все
Search All - это метод двоичного поиска, который используется для поиска элементов внутри таблицы. Для опции Искать все таблица должна быть отсортирована. Индекс не требует инициализации. При двоичном поиске таблица делится на две половины и определяет, в какой половине находится искомый элемент. Этот процесс повторяется до тех пор, пока элемент не будет найден или не будет достигнут конец.
Example
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE.
05 WS-RECORD OCCURS 10 TIMES ASCENDING KEY IS WS-NUM INDEXED BY I.
10 WS-NUM PIC 9(2).
10 WS-NAME PIC A(3).
PROCEDURE DIVISION.
MOVE '12ABC56DEF34GHI78JKL93MNO11PQR' TO WS-TABLE.
SEARCH ALL WS-RECORD
AT END DISPLAY 'RECORD NOT FOUND'
WHEN WS-NUM(I) = 93
DISPLAY 'RECORD FOUND '
DISPLAY WS-NUM(I)
DISPLAY WS-NAME(I)
END-SEARCH.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
RECORD FOUND
93
MNO
Концепция файлов в COBOL отличается от C / C ++. Изучая основы работы с файлами в COBOL, концепции обоих языков не должны совпадать. Простые текстовые файлы нельзя использовать в COBOL, вместо этогоPS (Physical Sequential) и VSAMфайлы используются. Файлы PS будут рассмотрены в этом модуле.
Чтобы понять работу с файлами в COBOL, нужно знать основные термины. Эти термины служат только для понимания основ работы с файлами. Более подробно терминология будет обсуждаться в главе «Глаголы обработки файлов». Ниже приведены основные термины -
- Field
- Record
- Физическая запись
- Логическая запись
- File
Следующий пример помогает понять эти термины -
Поле
Поле используется для обозначения данных, хранящихся об элементе. Он представляет собой один элемент, как показано в приведенном выше примере, такой как идентификатор студента, имя, оценки, общие оценки и процент. Количество символов в любом поле называется размером поля, например, имя студента может состоять из 10 символов. Поля могут иметь следующие атрибуты -
Primary keys- это те поля, которые уникальны для каждой записи и используются для идентификации конкретной записи. Например, в файле оценок учащихся у каждого учащегося будет уникальный идентификатор учащегося, который образует первичный ключ.
Secondary keysуникальные или неуникальные поля, которые используются для поиска связанных данных. Например, в файле оценок учащихся полное имя учащегося может использоваться как дополнительный ключ, если идентификатор учащегося неизвестен.
Descriptorsполя используются для описания сущности. Например, в файле оценок учащихся известными дескрипторами являются поля оценок и процентов, которые добавляют значение записи.
Запись
Запись - это набор полей, который используется для описания сущности. Одно или несколько полей вместе образуют запись. Например, в файле оценок учащихся идентификатор учащегося, имя, оценки, общие оценки и процентное соотношение образуют одну запись. Совокупный размер всех полей в записи известен как размер записи. Записи в файле могут быть фиксированной или переменной длины.
Физическая запись
Физическая запись - это информация, которая существует на внешнем устройстве. Он также известен как блок.
Логическая запись
Логическая запись - это информация, используемая программой. В программах на языке COBOL в любой момент времени может обрабатываться только одна запись, и она называется логической записью.
файл
Файл - это набор связанных записей. Например, файл оценок студентов состоит из записей всех студентов.
Файловая организация указывает, как записи организованы в файле. Существуют различные типы организаций для файлов, чтобы повысить эффективность доступа к записям. Ниже приведены типы схем организации файлов -
- Последовательная организация файлов
- Индексированная последовательная файловая организация
- Относительная файловая организация
Синтаксисы в этом модуле, упомянутые вместе с соответствующими терминами, относятся только к их использованию в программе. Полные программы, использующие этот синтаксис, будут обсуждаться в главе «Глаголы обработки файлов».
Последовательная организация файлов
Последовательный файл состоит из записей, которые хранятся и доступны в последовательном порядке. Ниже приведены ключевые атрибуты последовательной организации файлов.
Записи можно читать в последовательном порядке. Для чтения 10- й записи необходимо прочитать все предыдущие 9 записей.
Записи пишутся в последовательном порядке. Новую запись нельзя вставить между ними. Новая запись всегда вставляется в конец файла.
После помещения записи в последовательный файл невозможно удалить, сократить или удлинить запись.
Порядок вставленных записей никогда не может быть изменен.
Возможно обновление записи. Запись может быть перезаписана, если длина новой записи такая же, как длина старой записи.
Файлы с последовательным выводом - хороший вариант для печати.
Синтаксис
Ниже приведен синтаксис последовательной организации файлов -
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name-jcl
ORGANIZATION IS SEQUENTIAL
Индексированная последовательная организация файлов
Индексированный последовательный файл состоит из записей, к которым можно получить доступ последовательно. Также возможен прямой доступ. Он состоит из двух частей -
Data File содержит записи в последовательной схеме.
Index File содержит первичный ключ и его адрес в файле данных.
Ниже приведены ключевые атрибуты последовательной организации файлов.
Записи можно читать в последовательном порядке, как при последовательной организации файлов.
Доступ к записям можно получить случайным образом, если известен первичный ключ. Индексный файл используется для получения адреса записи, а затем запись выбирается из файла данных.
В этой файловой системе поддерживается отсортированный индекс, который связывает значение ключа с позицией записи в файле.
Также можно создать альтернативный индекс для выборки записей.
Синтаксис
Ниже приведен синтаксис индексированной последовательной файловой организации.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name-jcl
ORGANIZATION IS INDEXED
RECORD KEY IS primary-key
ALTERNATE RECORD KEY IS rec-key
Относительная организация файлов
Относительный файл состоит из записей, упорядоченных по их relative address. Ниже приведены ключевые атрибуты относительной организации файлов.
Записи можно читать в последовательном порядке, как при последовательной и индексированной файловой организации.
Доступ к записям можно получить с помощью относительного ключа. Относительный ключ представляет собой расположение записи относительно адреса начала файла.
Записи могут быть вставлены с использованием относительного ключа. Относительный адрес рассчитывается с использованием относительного ключа.
Относительный файл обеспечивает самый быстрый доступ к записям.
Основным недостатком этой файловой системы является то, что если некоторые промежуточные записи отсутствуют, они также будут занимать место.
Синтаксис
Ниже приведен синтаксис относительной организации файлов -
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name-jcl
ORGANIZATION IS RELATIVE
RELATIVE KEY IS rec-key
До сих пор обсуждались схемы организации файлов. Для каждой схемы организации файлов могут использоваться разные режимы доступа. Ниже приведены типы режимов доступа к файлам -
- Последовательный доступ
- Произвольный доступ
- Динамический доступ
Синтаксисы в этом модуле, упомянутые вместе с соответствующими терминами, относятся только к их использованию в программе. Полные программы, использующие этот синтаксис, будут обсуждаться в следующей главе.
Последовательный доступ
Когда режим доступа является последовательным, метод извлечения записи изменяется в соответствии с выбранной файловой организацией.
За sequential files, записи доступны в том же порядке, в котором они были вставлены.
За indexed files, параметр, используемый для выборки записей, - это значения ключей записи.
За relative files, относительные ключи записи используются для извлечения записей.
Синтаксис
Ниже приведен синтаксис режима последовательного доступа -
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS SEQUENTIAL
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name
ORGANIZATION IS INDEXED
ACCESS MODE IS SEQUENTIAL
RECORD KEY IS rec-key1
ALTERNATE RECORD KEY IS rec-key2
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name
ORGANIZATION IS RELATIVE
ACCESS MODE IS SEQUENTIAL
RELATIVE KEY IS rec-key1
Произвольный доступ
Когда режим доступа - СЛУЧАЙНЫЙ, метод извлечения записи изменяется в соответствии с выбранной файловой организацией.
За indexed filesдоступ к записям осуществляется в соответствии со значением, помещенным в поле ключа, которое может быть первичным или альтернативным ключом. Может быть один или несколько альтернативных индексов.
За relative files , записи извлекаются с помощью относительных ключей записи.
Синтаксис
Ниже приведен синтаксис режима произвольного доступа -
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name
ORGANIZATION IS INDEXED
ACCESS MODE IS RANDOM
RECORD KEY IS rec-key1
ALTERNATE RECORD KEY IS rec-key2
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name
ORGANIZATION IS RELATIVE
ACCESS MODE IS RANDOM
RELATIVE KEY IS rec-key1
Динамический доступ
Динамический доступ поддерживает как последовательный, так и произвольный доступ в одной программе. При динамическом доступе одно определение файла используется для выполнения как последовательной, так и произвольной обработки, такой как доступ к некоторым записям в последовательном порядке и другим записям по их ключам.
Для относительных и индексированных файлов режим динамического доступа позволяет переключаться между режимом последовательного доступа и режимом произвольного доступа при чтении файла с помощью фразы NEXT в операторе READ. Функции NEXT и READ будут рассмотрены в следующей главе.
Синтаксис
Ниже приведен синтаксис режима динамического доступа -
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name
ORGANIZATION IS SEQUENTIAL
ACCESS MODE IS DYNAMIC
RECORD KEY IS rec-key1
ALTERNATE RECORD KEY IS rec-key2
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT file-name ASSIGN TO dd-name
ORGANIZATION IS RELATIVE
ACCESS MODE IS DYNAMIC
RELATIVE KEY IS rec-key1
Глаголы обработки файлов используются для выполнения различных операций с файлами. Ниже приведены глаголы обработки файлов -
- Open
- Read
- Write
- Rewrite
- Delete
- Start
- Close
Открытый глагол
Открыть - это первая операция с файлом, которую необходимо выполнить. В случае успешного открытия с файлом возможны только дальнейшие операции. Только после открытия файла переменные в файловой структуре доступны для обработки.FILE STATUS переменная обновляется после каждой файловой операции.
Синтаксис
OPEN "mode" file-name.
Здесь имя-файла - это строковый литерал, который вы будете использовать для имени файла. Файл можно открыть в следующих режимах -
Sr.No. | Режим и описание |
---|---|
1 | Input Режим ввода используется для существующих файлов. В этом режиме мы можем только читать файл, другие операции с файлом запрещены. |
2 | Output Режим вывода используется для вставки записей в файлы. Еслиsequential fileиспользуется и файл содержит несколько записей, то сначала будут удалены существующие записи, а затем в файл будут вставлены новые записи. Этого не произойдет в случаеindexed file или relative file. |
3 | Extend Режим расширения используется для добавления записей в sequential file. В этом режиме записи вставляются в конец. Если режим доступа к файлуRandom или же Dynamic, то режим расширения использовать нельзя. |
4 | I-O Режим ввода-вывода используется для чтения и перезаписи записей файла. |
Читать глагол
Глагол чтения используется для чтения файловых записей. Функция чтения - получить записи из файла. При каждой команде чтения в файловую структуру может быть прочитана только одна запись. Чтобы выполнить операцию чтения, откройте файл в режиме INPUT или IO. В каждом операторе чтения указатель файла увеличивается, и, следовательно, считываются последующие записи.
Синтаксис
Ниже приведен синтаксис для чтения записей при последовательном режиме доступа к файлам:
READ file-name NEXT RECORD INTO ws-file-structure
AT END DISPLAY 'End of File'
NOT AT END DISPLAY 'Record Details:' ws-file-structure
END-READ.
Ниже приведены используемые параметры -
СЛЕДУЮЩАЯ ЗАПИСЬ является необязательной и указывается, когда индексированный последовательный файл читается последовательно.
Предложение INTO не является обязательным. ws-file-structure определяется в разделе WorkingStorage для получения значений из оператора READ.
Условие AT END становится истинным, когда достигается конец файла.
Example- В следующем примере выполняется чтение существующего файла с использованием последовательной организации строк. Эту программу можно скомпилировать и запустить с помощьюLive Demo вариант, в котором будут отображаться все записи, присутствующие в файле.
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO 'input.txt'
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD STUDENT.
01 STUDENT-FILE.
05 STUDENT-ID PIC 9(5).
05 NAME PIC A(25).
WORKING-STORAGE SECTION.
01 WS-STUDENT.
05 WS-STUDENT-ID PIC 9(5).
05 WS-NAME PIC A(25).
01 WS-EOF PIC A(1).
PROCEDURE DIVISION.
OPEN INPUT STUDENT.
PERFORM UNTIL WS-EOF='Y'
READ STUDENT INTO WS-STUDENT
AT END MOVE 'Y' TO WS-EOF
NOT AT END DISPLAY WS-STUDENT
END-READ
END-PERFORM.
CLOSE STUDENT.
STOP RUN.
Предположим, что данные входного файла доступны в input.txt файл содержит следующее -
20003 Mohtashim M.
20004 Nishant Malik
20005 Amitabh Bachhan
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
20003 Mohtashim M.
20004 Nishant Malik
20005 Amitabh Bachhan
Синтаксис
Ниже приведен синтаксис для чтения записи, когда режим доступа к файлу является случайным:
READ file-name RECORD INTO ws-file-structure
KEY IS rec-key
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'Record Details: ' ws-file-structure
END-READ.
Example- В следующем примере выполняется чтение существующего файла с использованием индексированной организации. Эту программу можно скомпилировать и запустить с помощьюJCLна мэйнфреймах, где будут отображаться все записи, присутствующие в файле. На сервере мэйнфреймов мы не используем текстовые файлы; вместо этого мы используем файлы PS.
Предположим, что файл, представленный на мэйнфреймах, имеет то же содержимое, что и файл input.txt в приведенном выше примере.
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO IN1
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
RECORD KEY IS STUDENT-ID
FILE STATUS IS FS.
DATA DIVISION.
FILE SECTION.
FD STUDENT.
01 STUDENT-FILE.
05 STUDENT-ID PIC 9(5).
05 NAME PIC A(25).
WORKING-STORAGE SECTION.
01 WS-STUDENT.
05 WS-STUDENT-ID PIC 9(5).
05 WS-NAME PIC A(25).
PROCEDURE DIVISION.
OPEN INPUT STUDENT.
MOVE 20005 TO STUDENT-ID.
READ STUDENT RECORD INTO WS-STUDENT-FILE
KEY IS STUDENT-ID
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY WS-STUDENT-FILE
END-READ.
CLOSE STUDENT.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN1 DD DSN = STUDENT-FILE-NAME,DISP=SHR
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
20005 Amitabh Bachhan
Написать глагол
Глагол записи используется для вставки записей в файл. После того, как запись записана, она больше не доступна в буфере записи. Перед вставкой записей в файл переместите значения в буфер записи и затем выполните команду записи.
Оператор записи может использоваться с FROMвозможность напрямую записывать записи из переменных рабочего хранилища. From - необязательное предложение. Если режим доступа последовательный, то для записи записи файл должен открываться в режиме вывода или расширении. Если режим доступа является случайным или динамическим, то для записи записи файл должен открываться в режиме вывода или режиме ввода-вывода.
Синтаксис
Ниже приведен синтаксис для чтения записи, когда файловая организация является последовательной:
WRITE record-buffer [FROM ws-file-structure]
END-WRITE.
Ниже приводится синтаксис для чтения записи, когда файловая организация является индексированной или относительной:
WRITE record-buffer [FROM ws-file-structure]
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'Record Inserted'
END-WRITE.
Example - В следующем примере показано, как вставить новую запись в новый файл, если организация является последовательной.
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO OUT1
ORGANIZATION IS SEQUENTIAL
ACCESS IS SEQUENTIAL
FILE STATUS IS FS.
DATA DIVISION.
FILE SECTION.
FD STUDENT
01 STUDENT-FILE.
05 STUDENT-ID PIC 9(5).
05 NAME PIC A(25).
05 CLASS PIC X(3).
WORKING-STORAGE SECTION.
01 WS-STUDENT.
05 WS-STUDENT-ID PIC 9(5).
05 WS-NAME PIC A(25).
05 WS-CLASS PIC X(3).
PROCEDURE DIVISION.
OPEN EXTEND STUDENT.
MOVE 1000 TO STUDENT-ID.
MOVE 'Tim' TO NAME.
MOVE '10' TO CLASS.
WRITE STUDENT-FILE
END-WRITE.
CLOSE STUDENT.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//OUT1 DD DSN = OUTPUT-FILE-NAME,DISP = (NEW,CATALOG,DELETE)
Когда вы скомпилируете и выполните указанную выше программу, она добавит новую запись в выходной файл.
1000 Tim 10
Переписать глагол
Глагол перезаписи используется для обновления записей. Для операций перезаписи файл должен быть открыт в режиме ввода-вывода. Его можно использовать только после успешной операции чтения. Команда перезаписи перезаписывает последнюю прочитанную запись.
Синтаксис
Ниже приведен синтаксис для чтения записи, когда файловая организация является последовательной:
REWRITE record-buffer [FROM ws-file-structure]
END-REWRITE.
Ниже приводится синтаксис для чтения записи, когда файловая организация является индексированной или относительной:
REWRITE record-buffer [FROM ws-file-structure]
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'Record Updated'
END-REWRITE.
Example - В следующем примере показано, как обновить существующую запись, которую мы вставили на предыдущем шаге записи -
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO IN1
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
RECORD KEY IS STUDENT-ID
FILE STATUS IS FS.
DATA DIVISION.
FILE SECTION.
FD STUDENT
01 STUDENT-FILE.
05 STUDENT-ID PIC 9(4).
05 NAME PIC A(12).
05 CLASS PIC X(3).
WORKING-STORAGE SECTION.
01 WS-STUDENT.
05 WS-STUDENT-ID PIC 9(5).
05 WS-NAME PIC A(25).
05 WS-CLASS PIC X(3).
PROCEDURE DIVISION.
OPEN I-O STUDENT.
MOVE '1000' TO STUDENT-ID.
READ STUDENT
KEY IS STUDENT-ID
INVALID KEY DISPLAY ‘KEY IS NOT EXISTING’
END-READ.
MOVE 'Tim Dumais' TO NAME.
REWRITE STUDENT-FILE
END-REWRITE.
CLOSE STUDENT.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN1 DD DSN = OUTPUT-FILE-NAME,DISP = SHR
Когда вы скомпилируете и выполните указанную выше программу, она обновит запись -
1000 Tim Dumais 10
Удалить глагол
Команда удаления может выполняться только для индексированных и относительных файлов. Файл должен быть открыт в режиме ввода-вывода. При последовательной организации файлов записи не могут быть удалены. Запись, последняя прочитанная оператором Read, удаляется в случае режима последовательного доступа. В режиме произвольного доступа укажите ключ записи, а затем выполните операцию удаления.
Синтаксис
Ниже приводится синтаксис для удаления записи -
DELETE file-name RECORD
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'Record Deleted'
END-DELETE.
Example - удалить существующую запись -
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT STUDENT ASSIGN TO OUT1
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
RECORD KEY IS STUDENT-ID
FILE STATUS IS FS.
DATA DIVISION.
FILE SECTION.
FD STUDENT
01 STUDENT-FILE.
05 STUDENT-ID PIC 9(4).
05 NAME PIC A(12).
05 CLASS PIC X(3).
WORKING-STORAGE SECTION.
01 WS-STUDENT.
05 WS-STUDENT-ID PIC 9(5).
05 WS-NAME PIC A(25).
05 WS-CLASS PIC X(3).
PROCEDURE DIVISION.
OPEN I-O STUDENT.
MOVE '1000' TO STUDENT-ID.
DELETE STUDENT RECORD
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'Record Deleted'
END-DELETE.
CLOSE STUDENT.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//OUT1 DD DSN = OUTPUT-FILE-NAME,DISP = SHR
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
Record Deleted
Начать глагол
Команда запуска может выполняться только для индексированных и относительных файлов. Он используется для размещения указателя файла на определенной записи. Режим доступа должен быть последовательным или динамическим. Файл должен быть открыт в режиме ввода-вывода или ввода.
Синтаксис
Ниже приведен синтаксис для размещения указателя на определенной записи:
START file-name KEY IS [=, >, <, NOT, <= or >=] rec-key
INVALID KEY DISPLAY 'Invalid Key'
NOT INVALID KEY DISPLAY 'File Pointer Updated'
END-START.
Закрыть глагол
Глагол закрытия используется для закрытия файла. После выполнения операции закрытия переменные в файловой структуре не будут доступны для обработки. Связь между программой и файлом потеряна.
Синтаксис
Ниже приведен синтаксис для закрытия файла -
CLOSE file-name.
Подпрограмма Cobol - это программа, которая может быть скомпилирована независимо, но не может быть выполнена независимо. Есть два типа подпрограмм:internal subroutines нравиться Perform заявления и external подпрограммы, такие как глагол CALL.
Call Verb
Глагол вызова используется для передачи управления от одной программы к другой программе. Программа, содержащая глагол CALL, являетсяCalling Program и вызываемая программа известна как Called Program. Выполнение вызывающей программы будет остановлено до тех пор, пока вызываемая программа не завершит выполнение. Оператор Exit Program используется в вызываемой программе для передачи управления обратно.
Вызываемые программные ограничения
Ниже приведены названные требования к программе -
Linkage sectionдолжен быть определен в вызываемой программе. Он состоит из элементов данных, переданных в программе. В элементах данных не должно быть предложения Value. Предложение PIC должно быть совместимо с переменными, переданными через вызывающую программу.
Procedure division using имеет список переменных, переданных из вызывающей программы, и порядок должен быть таким же, как указано в глаголе Call.
Exit programОператор используется в вызываемой программе для передачи управления обратно. Это должен быть последний оператор в вызываемой программе.
Параметры могут передаваться между программами двумя способами:
- По ссылке
- По содержанию
Звоните по ссылке
Если значения переменных в вызываемой программе изменены, то их новые значения будут отражены в вызывающей программе. ЕслиBY предложение не указано, то переменные всегда передаются по ссылке.
Синтаксис
Ниже приводится синтаксис вызова подпрограммы по ссылке -
CALL sub-prog-name USING variable-1, variable-2.
Example
Следующий пример - это ОСНОВНАЯ вызывающая программа, а UTIL - это вызываемая программа.
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.
PROCEDURE DIVISION.
CALL 'UTIL' USING WS-STUDENT-ID, WS-STUDENT-NAME.
DISPLAY 'Student Id : ' WS-STUDENT-ID
DISPLAY 'Student Name : ' WS-STUDENT-NAME
STOP RUN.
Вызывается программа
IDENTIFICATION DIVISION.
PROGRAM-ID. UTIL.
DATA DIVISION.
LINKAGE SECTION.
01 LS-STUDENT-ID PIC 9(4).
01 LS-STUDENT-NAME PIC A(15).
PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.
DISPLAY 'In Called Program'.
MOVE 1111 TO LS-STUDENT-ID.
EXIT PROGRAM.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = MAIN
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
In Called Program
Student Id : 1111
Student Name : Tim
Звоните по содержанию
Если значения переменных в вызываемой программе изменены, то их новые значения не будут отражены в вызывающей программе.
Синтаксис
Ниже приведен синтаксис вызова подпрограммы по содержимому -
CALL sub-prog-name USING
BY CONTENT variable-1, BY CONTENT variable-2.
Example
Следующий пример - это ОСНОВНАЯ вызывающая программа, а UTIL - это вызываемая программа.
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-STUDENT-ID PIC 9(4) VALUE 1000.
01 WS-STUDENT-NAME PIC A(15) VALUE 'Tim'.
PROCEDURE DIVISION.
CALL 'UTIL' USING BY CONTENT WS-STUDENT-ID, BY CONTENT WS-STUDENT-NAME.
DISPLAY 'Student Id : ' WS-STUDENT-ID
DISPLAY 'Student Name : ' WS-STUDENT-NAME
STOP RUN.
Вызывается программа
IDENTIFICATION DIVISION.
PROGRAM-ID. UTIL.
DATA DIVISION.
LINKAGE SECTION.
01 LS-STUDENT-ID PIC 9(4).
01 LS-STUDENT-NAME PIC A(15).
PROCEDURE DIVISION USING LS-STUDENT-ID, LS-STUDENT-NAME.
DISPLAY 'In Called Program'.
MOVE 1111 TO LS-STUDENT-ID.
EXIT PROGRAM.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = MAIN
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
In Called Program
Student Id : 1000
Student Name : Tim
Типы звонков
Есть два типа звонков -
Static Callвозникает, когда программа компилируется с параметром компилятора NODYNAM. Статическая вызываемая программа загружается в хранилище во время компиляции.
Dynamic Callвозникает, когда программа компилируется с опциями компилятора DYNAM и NODLL. Динамически вызываемая программа загружается в хранилище во время выполнения.
Сортировка данных в файле или слияние двух или более файлов - обычная необходимость почти во всех бизнес-приложениях. Сортировка используется для упорядочения записей в порядке возрастания или убывания, чтобы можно было выполнять последовательную обработку. Есть два метода, которые используются для сортировки файлов в COBOL:
External sortиспользуется для сортировки файлов с помощью утилиты SORT в JCL. Мы обсуждали это в главе JCL. На данный момент мы сосредоточимся на внутренней сортировке.
Internal sort используется для сортировки файлов в программе COBOL. SORT глагол используется для сортировки файла.
Сортировка глагола
В процессе сортировки в COBOL используются три файла:
Input file - это файл, который мы должны отсортировать в порядке возрастания или убывания.
Work fileиспользуется для хранения записей в процессе сортировки. Записи входного файла передаются в рабочий файл для процесса сортировки. Этот файл должен быть определен в разделе файлов под записью SD.
Output fileэто файл, который мы получаем после процесса сортировки. Это окончательный результат команды Sort.
Синтаксис
Ниже приведен синтаксис для сортировки файла:
SORT work-file ON ASCENDING KEY rec-key1
[ON DESCENDING KEY rec-key2]
USING input-file GIVING output-file.
SORT выполняет следующие операции -
Открывает рабочий файл в режиме ввода-вывода, файл ввода в режиме ввода и файл вывода в режиме вывода.
Переносит записи, присутствующие во входном файле, в рабочий файл.
Сортирует SORT-FILE в возрастающей / убывающей последовательности по ключу записи.
Переносит отсортированные записи из рабочего файла в выходной файл.
Закрывает входной файл и выходной файл и удаляет рабочий файл.
Example
В следующем примере INPUT - это входной файл, который необходимо отсортировать в порядке возрастания:
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUT ASSIGN TO IN.
SELECT OUTPUT ASSIGN TO OUT.
SELECT WORK ASSIGN TO WRK.
DATA DIVISION.
FILE SECTION.
FD INPUT.
01 INPUT-STUDENT.
05 STUDENT-ID-I PIC 9(5).
05 STUDENT-NAME-I PIC A(25).
FD OUTPUT.
01 OUTPUT-STUDENT.
05 STUDENT-ID-O PIC 9(5).
05 STUDENT-NAME-O PIC A(25).
SD WORK.
01 WORK-STUDENT.
05 STUDENT-ID-W PIC 9(5).
05 STUDENT-NAME-W PIC A(25).
PROCEDURE DIVISION.
SORT WORK ON ASCENDING KEY STUDENT-ID-O
USING INPUT GIVING OUTPUT.
DISPLAY 'Sort Successful'.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN DD DSN = INPUT-FILE-NAME,DISP = SHR
//OUT DD DSN = OUTPUT-FILE-NAME,DISP = SHR
//WRK DD DSN = &&TEMP
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
Sort Successful
Глагол слияния
Два или более файла с одинаковой последовательностью объединяются с помощью оператора Merge. Файлы, используемые в процессе слияния -
- Входные файлы - Вход-1, Вход-2
- Рабочий файл
- Выходной файл
Синтаксис
Ниже приведен синтаксис для объединения двух или более файлов:
MERGE work-file ON ASCENDING KEY rec-key1
[ON DESCENDING KEY rec-key2]
USING input-1, input-2 GIVING output-file.
Слияние выполняет следующие операции -
Открывает рабочий файл в режиме ввода-вывода, файлы ввода в режиме ввода и файл вывода в режиме вывода.
Переносит записи, присутствующие во входных файлах, в рабочий файл.
Сортирует SORT-FILE в возрастающей / убывающей последовательности по ключу записи.
Переносит отсортированные записи из рабочего файла в выходной файл.
Закрывает входной файл и выходной файл и удаляет рабочий файл.
Example
В следующем примере INPUT1 и INPUT2 - это входные файлы, которые должны быть объединены в порядке возрастания -
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUT1 ASSIGN TO IN1.
SELECT INPUT2 ASSIGN TO IN2.
SELECT OUTPUT ASSIGN TO OUT.
SELECT WORK ASSIGN TO WRK.
DATA DIVISION.
FILE SECTION.
FD INPUT1.
01 INPUT1-STUDENT.
05 STUDENT-ID-I1 PIC 9(5).
05 STUDENT-NAME-I1 PIC A(25).
FD INPUT2.
01 INPUT2-STUDENT.
05 STUDENT-ID-I2 PIC 9(5).
05 STUDENT-NAME-I2 PIC A(25).
FD OUTPUT.
01 OUTPUT-STUDENT.
05 STUDENT-ID-O PIC 9(5).
05 STUDENT-NAME-O PIC A(25).
SD WORK.
01 WORK-STUDENT.
05 STUDENT-ID-W PIC 9(5).
05 STUDENT-NAME-W PIC A(25).
PROCEDURE DIVISION.
MERGE WORK ON ASCENDING KEY STUDENT-ID-O
USING INPUT1, INPUT2 GIVING OUTPUT.
DISPLAY 'Merge Successful'.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP1 EXEC PGM = HELLO
//IN1 DD DSN=INPUT1-FILE-NAME,DISP=SHR
//IN2 DD DSN=INPUT2-FILE-NAME,DISP=SHR
//OUT DD DSN = OUTPUT-FILE-NAME,DISP=SHR
//WRK DD DSN = &&TEMP
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
Merge Successful
На данный момент мы научились использовать файлы в COBOL. Теперь мы обсудим, как программа COBOL взаимодействует с DB2. Он включает в себя следующие термины -
- Встроенный SQL
- Программирование приложений DB2
- Переменные хоста
- SQLCA
- SQL запросы
- Cursors
Встроенный SQL
Встроенные операторы SQL используются в программах на языке COBOL для выполнения стандартных операций SQL. Встроенные операторы SQL предварительно обрабатываются процессором SQL перед компиляцией прикладной программы. COBOL известен какHost Language. Приложения COBOL-DB2 - это те приложения, которые включают как COBOL, так и DB2.
Встроенные операторы SQL работают как обычные операторы SQL с небольшими изменениями. Например, результат запроса направляется к заранее определенному набору переменных, которые называютсяHost Variables. Дополнительное предложение INTO помещается в оператор SELECT.
Программирование приложений DB2
Ниже приведены правила, которые необходимо соблюдать при написании программы на COBOL-DB2.
Все операторы SQL должны быть разделены между EXEC SQL и ENDEXEC..
Операторы SQL должны быть закодированы в области B.
Все таблицы, которые используются в программе, должны быть объявлены в разделе WorkingStorage. Это делается с помощьюINCLUDE заявление.
Все операторы SQL, кроме INCLUDE и DECLARE TABLE, должны появляться в разделе «Процедуры».
Переменные хоста
Переменные хоста используются для получения данных из таблицы или вставки данных в таблицу. Переменные хоста должны быть объявлены для всех значений, которые должны передаваться между программой и DB2. Они заявлены в разделе «Рабочее хранилище».
Переменные хоста не могут быть элементами группы, но они могут быть сгруппированы вместе в структуре хоста. Они не могут бытьRenamed или же Redefined. Используя переменные хоста с операторами SQL, добавьте к ним префиксcolon (:)..
Синтаксис
Ниже приведен синтаксис для объявления переменных хоста и включения таблиц в раздел «Рабочее хранилище».
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE table-name
END-EXEC.
EXEC SQL BEGIN DECLARE SECTION
END-EXEC.
01 STUDENT-REC.
05 STUDENT-ID PIC 9(4).
05 STUDENT-NAME PIC X(25).
05 STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.
SQLCA
SQLCA - это область связи SQL, через которую DB2 передает программе обратную связь о выполнении SQL. Он сообщает программе, было ли выполнение успешным или нет. В SQLCA есть ряд предопределенных переменных, напримерSQLCODEкоторый содержит код ошибки. Значение «000» в SQLCODE указывает на успешное выполнение.
Синтаксис
Ниже приведен синтаксис для объявления SQLCA в разделе рабочего хранилища.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
SQL запросы
Предположим, у нас есть одна таблица с именем «Студент», которая содержит идентификатор студента, имя студента и адрес студента.
Таблица СТУДЕНТ содержит следующие данные -
Student Id Student Name Student Address
1001 Mohtashim M. Hyderabad
1002 Nishant Malik Delhi
1003 Amitabh Bachan Mumbai
1004 Chulbul Pandey Lucknow
В следующем примере показано использование SELECT запрос в программе COBOL -
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
EXEC SQL
INCLUDE STUDENT
END-EXEC.
EXEC SQL BEGIN DECLARE SECTION
END-EXEC.
01 WS-STUDENT-REC.
05 WS-STUDENT-ID PIC 9(4).
05 WS-STUDENT-NAME PIC X(25).
05 WS-STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.
PROCEDURE DIVISION.
EXEC SQL
SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS
INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS FROM STUDENT
WHERE STUDENT-ID=1004
END-EXEC.
IF SQLCODE = 0
DISPLAY WS-STUDENT-RECORD
ELSE DISPLAY 'Error'
END-IF.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001 EXEC PGM = IKJEFT01
//STEPLIB DD DSN = MYDATA.URMI.DBRMLIB,DISP = SHR
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(SSID)
RUN PROGRAM(HELLO) PLAN(PLANNAME) -
END
/*
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
1004 Chulbul Pandey Lucknow
В следующем примере показано использование INSERT запрос в программе COBOL -
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
EXEC SQL
INCLUDE STUDENT
END-EXEC.
EXEC SQL BEGIN DECLARE SECTION
END-EXEC.
01 WS-STUDENT-REC.
05 WS-STUDENT-ID PIC 9(4).
05 WS-STUDENT-NAME PIC X(25).
05 WS-STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.
PROCEDURE DIVISION.
MOVE 1005 TO WS-STUDENT-ID.
MOVE 'TutorialsPoint' TO WS-STUDENT-NAME.
MOVE 'Hyderabad' TO WS-STUDENT-ADDRESS.
EXEC SQL
INSERT INTO STUDENT(STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS)
VALUES (:WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS)
END-EXEC.
IF SQLCODE = 0
DISPLAY 'Record Inserted Successfully'
DISPLAY WS-STUDENT-REC
ELSE DISPLAY 'Error'
END-IF.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001 EXEC PGM = IKJEFT01
//STEPLIB DD DSN = MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT = *
//SYSUDUMP DD SYSOUT = *
//SYSOUT DD SYSOUT = *
//SYSTSIN DD *
DSN SYSTEM(SSID)
RUN PROGRAM(HELLO) PLAN(PLANNAME) -
END
/*
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
Record Inserted Successfully
1005 TutorialsPoint Hyderabad
В следующем примере показано использование UPDATE запрос в программе COBOL -
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
EXEC SQL
INCLUDE STUDENT
END-EXEC.
EXEC SQL BEGIN DECLARE SECTION
END-EXEC.
01 WS-STUDENT-REC.
05 WS-STUDENT-ID PIC 9(4).
05 WS-STUDENT-NAME PIC X(25).
05 WS-STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.
PROCEDURE DIVISION.
MOVE 'Bangalore' TO WS-STUDENT-ADDRESS.
EXEC SQL
UPDATE STUDENT SET STUDENT-ADDRESS=:WS-STUDENT-ADDRESS
WHERE STUDENT-ID = 1003
END-EXEC.
IF SQLCODE = 0
DISPLAY 'Record Updated Successfully'
ELSE DISPLAY 'Error'
END-IF.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001 EXEC PGM = IKJEFT01
//STEPLIB DD DSN = MYDATA.URMI.DBRMLIB,DISP = SHR
//SYSPRINT DD SYSOUT = *
//SYSUDUMP DD SYSOUT = *
//SYSOUT DD SYSOUT = *
//SYSTSIN DD *
DSN SYSTEM(SSID)
RUN PROGRAM(HELLO) PLAN(PLANNAME) -
END
/*
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
Record Updated Successfully
Следующее example показывает использование DELETE запрос в программе COBOL -
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
EXEC SQL
INCLUDE STUDENT
END-EXEC.
EXEC SQL BEGIN DECLARE SECTION
END-EXEC.
01 WS-STUDENT-REC.
05 WS-STUDENT-ID PIC 9(4).
05 WS-STUDENT-NAME PIC X(25).
05 WS-STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.
PROCEDURE DIVISION.
MOVE 1005 TO WS-STUDENT-ID.
EXEC SQL
DELETE FROM STUDENT
WHERE STUDENT-ID=:WS-STUDENT-ID
END-EXEC.
IF SQLCODE = 0
DISPLAY 'Record Deleted Successfully'
ELSE DISPLAY 'Error'
END-IF.
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001 EXEC PGM = IKJEFT01
//STEPLIB DD DSN = MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT = *
//SYSUDUMP DD SYSOUT = *
//SYSOUT DD SYSOUT = *
//SYSTSIN DD *
DSN SYSTEM(SSID)
RUN PROGRAM(HELLO) PLAN(PLANNAME) -
END
/*
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
Record Deleted Successfully
Курсоры
Курсоры используются для одновременного выбора нескольких строк. Это структуры данных, содержащие все результаты запроса. Их можно определить в разделе «Рабочее хранилище» или в разделе «Процедуры». Ниже приведены операции, связанные с курсором -
- Declare
- Open
- Close
- Fetch
Объявить курсор
Объявление курсора может быть выполнено в разделе рабочего хранилища или в разделе процедур. Первый оператор - это оператор DECLARE, который является невыполнимым оператором.
EXEC SQL
DECLARE STUDCUR CURSOR FOR
SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT
WHERE STUDENT-ID >:WS-STUDENT-ID
END-EXEC.
открыто
Перед использованием курсора необходимо выполнить оператор Open. Оператор Open подготавливает SELECT к выполнению.
EXEC SQL
OPEN STUDCUR
END-EXEC.
Закрыть
Оператор Close освобождает всю память, занятую курсором. Перед завершением программы обязательно закрыть курсор.
EXEC SQL
CLOSE STUDCUR
END-EXEC.
Получить
Оператор Fetch идентифицирует курсор и помещает значение в предложение INTO. Оператор Fetch закодирован в цикле, так как мы получаем по одной строке за раз.
EXEC SQL
FETCH STUDCUR
INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS
END-EXEC.
В следующем примере показано использование курсора для извлечения всех записей из таблицы STUDENT.
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
EXEC SQL
INCLUDE STUDENT
END-EXEC.
EXEC SQL BEGIN DECLARE SECTION
END-EXEC.
01 WS-STUDENT-REC.
05 WS-STUDENT-ID PIC 9(4).
05 WS-STUDENT-NAME PIC X(25).
05 WS-STUDENT-ADDRESS X(50).
EXEC SQL END DECLARE SECTION
END-EXEC.
EXEC SQL
DECLARE STUDCUR CURSOR FOR
SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT
WHERE STUDENT-ID >:WS-STUDENT-ID
END-EXEC.
PROCEDURE DIVISION.
MOVE 1001 TO WS-STUDENT-ID.
PERFORM UNTIL SQLCODE = 100
EXEC SQL
FETCH STUDCUR
INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS
END-EXEC
DISPLAY WS-STUDENT-REC
END-PERFORM
STOP RUN.
JCL для выполнения вышеуказанной программы COBOL -
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS = A,MSGCLASS = C
//STEP001 EXEC PGM=IKJEFT01
//STEPLIB DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(SSID)
RUN PROGRAM(HELLO) PLAN(PLANNAME) -
END
/*
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
1001 Mohtashim M. Hyderabad
1002 Nishant Malik Delhi
1003 Amitabh Bachan Mumbai
1004 Chulbul Pandey Lucknow