JCL — Обзор
JCL используется в среде мэйнфреймов для взаимодействия между программой (например, COBOL, Assembler или PL / I) и операционной системой. В среде мэйнфреймов программы могут выполняться в пакетном и онлайн-режиме. Примером пакетной системы может быть обработка банковских транзакций через файл VSAM (метод доступа к виртуальному хранилищу) и его применение к соответствующим счетам. Примером онлайновой системы может служить экран бэк-офиса, используемый сотрудниками банка для открытия счета. В пакетном режиме программы передаются в операционную систему как задание через JCL.
Пакетная и оперативная обработка различаются по аспекту ввода, вывода и запроса на выполнение программы. При пакетной обработке эти аспекты передаются в JCL, который в свою очередь принимается операционной системой.
Обработка заданий
Работа — это единица работы, которая может состоять из множества рабочих шагов. Каждый шаг задания указывается на языке управления заданиями (JCL) посредством набора операторов управления заданиями.
Операционная система использует систему ввода заданий (JES) для приема заданий в операционную систему, для планирования их обработки и для управления выводом.
Обработка задания проходит через ряд шагов, как указано ниже:
-
Предоставление работы — Отправка JCL в JES.
-
Преобразование заданий — JCL вместе с PROC преобразуется в интерпретируемый текст для понимания JES и сохраняется в наборе данных, который мы называем SPOOL.
-
Очередь заданий — JES определяет приоритет задания на основе параметров CLASS и PRTY в операторе JOB (объяснено в главе JCL — Оператор JOB ). Ошибки JCL проверяются, и задание назначается в очередь заданий, если ошибок нет.
-
Выполнение задания — когда задание достигает наивысшего приоритета, оно берется для выполнения из очереди заданий. JCL считывается из SPOOL, программа выполняется, и выходные данные перенаправляются в соответствующее место назначения вывода, как указано в JCL.
-
Очистка — после завершения задания выделенные ресурсы и пространство JES SPOOL освобождаются. Чтобы сохранить журнал работ, нам нужно скопировать журнал работ в другой набор данных, прежде чем он будет выпущен из SPOOL.
Предоставление работы — Отправка JCL в JES.
Преобразование заданий — JCL вместе с PROC преобразуется в интерпретируемый текст для понимания JES и сохраняется в наборе данных, который мы называем SPOOL.
Очередь заданий — JES определяет приоритет задания на основе параметров CLASS и PRTY в операторе JOB (объяснено в главе JCL — Оператор JOB ). Ошибки JCL проверяются, и задание назначается в очередь заданий, если ошибок нет.
Выполнение задания — когда задание достигает наивысшего приоритета, оно берется для выполнения из очереди заданий. JCL считывается из SPOOL, программа выполняется, и выходные данные перенаправляются в соответствующее место назначения вывода, как указано в JCL.
Очистка — после завершения задания выделенные ресурсы и пространство JES SPOOL освобождаются. Чтобы сохранить журнал работ, нам нужно скопировать журнал работ в другой набор данных, прежде чем он будет выпущен из SPOOL.
JCL — Настройка среды
Установка JCL в Windows / Linux
Для Windows доступно множество бесплатных эмуляторов мэйнфреймов, которые можно использовать для написания и изучения примеров JCL.
Одним из таких эмуляторов является Hercules, который можно легко установить в Windows, выполнив несколько простых шагов, приведенных ниже:
-
Загрузите и установите эмулятор Hercules, доступный на домашнем сайте Hercules: www.hercules-390.eu
-
После того, как вы установили пакет на компьютер с Windows, он создаст папку типа C: \ Mainframes .
-
Запустите командную строку (CMD) и перейдите в каталог C: \ Mainframes на CMD.
-
Полное руководство по различным командам для написания и выполнения JCL можно найти по адресу www.jaymoseley.com/hercules/installmvs/instmvs2.htm.
Загрузите и установите эмулятор Hercules, доступный на домашнем сайте Hercules: www.hercules-390.eu
После того, как вы установили пакет на компьютер с Windows, он создаст папку типа C: \ Mainframes .
Запустите командную строку (CMD) и перейдите в каталог C: \ Mainframes на CMD.
Полное руководство по различным командам для написания и выполнения JCL можно найти по адресу www.jaymoseley.com/hercules/installmvs/instmvs2.htm.
Hercules — это программная реализация с открытым исходным кодом для архитектур мейнфреймов System / 370 и ESA / 390 в дополнение к новейшей 64-битной архитектуре z / Architecture. Hercules работает под Linux, Windows, Solaris, FreeBSD и Mac OS X.
Запуск JCL на мейнфреймах
Пользователь может подключиться к серверу мэйнфреймов несколькими способами, такими как тонкий клиент, фиктивный терминал, система виртуального клиента (VCS) или система виртуального рабочего стола (VDS).
Каждому действительному пользователю предоставляется логин для входа в интерфейс Z / OS (TSO / E или ISPF). В интерфейсе Z / OS JCL может быть закодирован и сохранен как элемент в многораздельном наборе данных (PDS). Когда JCL передается, он выполняется, и вывод получается, как описано в разделе обработки заданий предыдущей главы.
Структура JCL
Базовая структура JCL с общими утверждениями приведена ниже:
//SAMPJCL JOB 1,CLASS=6,MSGCLASS=0,NOTIFY=&SYSUID (1) //* (2) //STEP010 EXEC PGM=SORT (3) //SORTIN DD DSN=JCL.SAMPLE.INPUT,DISP=SHR (4) //SORTOUT DD DSN=JCL.SAMPLE.OUTPUT, (5) // DISP=(NEW,CATLG,CATLG),DATACLAS=DSIZE50 //SYSOUT DD SYSOUT=* (6) //SYSUDUMP DD SYSOUT=C (6) //SYSPRINT DD SYSOUT=* (6) //SYSIN DD * (6) SORT FIELDS=COPY INCLUDE COND=(28,3,CH,EQ,C'XXX') /* (7)
Описание программы
Нумерованные операторы JCL были объяснены ниже:
(1) Оператор JOB — Определяет информацию, необходимую для SPOOLing задания, такую как идентификатор задания, приоритет выполнения, идентификатор пользователя, который должен быть уведомлен после завершения задания.
(2) // * оператор — это оператор комментария.
(3) Оператор EXEC — указывает PROC / программу для выполнения. В приведенном выше примере выполняется программа SORT (т.е. сортировка входных данных в определенном порядке)
(4) Оператор ввода DD. Указывает тип ввода, передаваемого в программу, указанную в (3). В приведенном выше примере файл Physical Sequential (PS) передается в качестве входных данных в режиме совместного использования (DISP = SHR).
(5) Оператор DD вывода — указывает тип вывода, который будет произведен программой при выполнении. В приведенном выше примере создается файл PS. Если оператор выходит за пределы 70-й позиции в строке, то он продолжается на следующей строке, которая должна начинаться с «//», за которым следует один или несколько пробелов.
(6) Могут быть другие типы операторов DD для указания дополнительной информации для программы (в приведенном выше примере: условие SORT указано в операторе SYSIN DD) и для указания места назначения для журнала ошибок / выполнения (Пример: SYSUDUMP / SYSPRINT). Операторы DD могут содержаться в наборе данных (файл мэйнфрейма) или в данных потока (информация, жестко закодированная в JCL), как указано в примере выше.
(7) / * отмечает конец данных в потоке.
Все операторы JCL, кроме потоковых данных, начинаются с //. Должен быть как минимум один пробел до и после ключевых слов JOB, EXEC и DD, а в остальной части оператора не должно быть пробелов.
Типы параметров работы
Каждый из операторов JCL сопровождается набором параметров, помогающих операционным системам завершить выполнение программы. Параметры могут быть двух типов:
Позиционные параметры
-
Появляется в заранее определенной позиции и порядке в выписке. Пример: учетная информация Параметр может появляться только после ключевого слова JOB и перед параметром имени программиста и параметрами ключевого слова. Если позиционный параметр опущен, его необходимо заменить запятой.
-
Позиционные параметры присутствуют в операторах JOB и EXEC. В приведенном выше примере PGM — это позиционный параметр, закодированный после ключевого слова EXEC .
Появляется в заранее определенной позиции и порядке в выписке. Пример: учетная информация Параметр может появляться только после ключевого слова JOB и перед параметром имени программиста и параметрами ключевого слова. Если позиционный параметр опущен, его необходимо заменить запятой.
Позиционные параметры присутствуют в операторах JOB и EXEC. В приведенном выше примере PGM — это позиционный параметр, закодированный после ключевого слова EXEC .
Параметры ключевых слов
-
Они кодируются после позиционных параметров, но могут появляться в любом порядке. Параметры ключевых слов могут быть опущены, если не требуются. Общий синтаксис — KEYWORD = значение . Пример: MSGCLASS = X, т. Е. Журнал заданий перенаправляется на выходной SPOOL после завершения задания.
-
В приведенном выше примере CLASS, MSGCLASS и NOTIFY являются ключевыми параметрами оператора JOB. В выражении EXEC также могут быть параметры ключевых слов.
Они кодируются после позиционных параметров, но могут появляться в любом порядке. Параметры ключевых слов могут быть опущены, если не требуются. Общий синтаксис — KEYWORD = значение . Пример: MSGCLASS = X, т. Е. Журнал заданий перенаправляется на выходной SPOOL после завершения задания.
В приведенном выше примере CLASS, MSGCLASS и NOTIFY являются ключевыми параметрами оператора JOB. В выражении EXEC также могут быть параметры ключевых слов.
Эти параметры были подробно описаны в последующих главах вместе с соответствующими примерами.
JCL — Заявление о работе
Оператор JOB — это первый оператор управления в JCL. Это дает идентификатор задания операционной системе (ОС), в спуле и в планировщике. Параметры в операторе JOB помогают операционным системам в распределении правильного планировщика, необходимого времени ЦП и выдаче уведомлений пользователю.
Синтаксис
Ниже приведен основной синтаксис оператора JCL JOB:
//Job-name JOB Positional-param, Keyword-param
Описание
Давайте посмотрим описание терминов, использованных в приведенном выше синтаксисе оператора JOB.
Название работы
Это дает идентификатор задания при отправке его в ОС. Длина может быть от 1 до 8 с буквенно-цифровыми символами и начинается сразу после //.
РАБОТА
Это ключевое слово для определения его как оператора JOB.
Позиционные-пары
Есть позиционные параметры, которые могут быть двух типов:
Позиционный параметр | Описание |
---|---|
Информация об учетной записи | Это относится к человеку или группе, которым время CPU. Он устанавливается в соответствии с правилами компании, владеющей мэйнфреймами. Если он указан как (*), то он принимает идентификатор пользователя, который в настоящее время вошел в терминал мэйнфрейма. |
Имя программиста | Это идентифицирует человека или группу, которая отвечает за JCL. Это не обязательный параметр и может быть заменен запятой. |
Ключевые слово-пары
Ниже приведены различные параметры ключевых слов, которые можно использовать в операторе JOB. Вы можете использовать один или несколько параметров в зависимости от требований, и они разделяются запятой:
Параметр ключевого слова | Описание |
---|---|
УЧЕБНЫЙ КЛАСС |
В зависимости от продолжительности работы и количества ресурсов, необходимых для работы, компании назначают разные классы работы. Они могут быть визуализированы как отдельные планировщики, используемые ОС для получения заданий. Размещение заданий в правильном планировщике поможет в легком выполнении заданий. Некоторые компании имеют разные классы для работы в тестовой и производственной среде. Допустимые значения параметра CLASS: от A до Z и от 0 до 9 (длина 1). Ниже приводится синтаксис: КЛАСС = от 0 до 9 | От А до Я |
PRTY |
Чтобы указать приоритет работы в классе работы. Если этот параметр не указан, то задание добавляется в конец очереди в указанном КЛАССЕ. Ниже приводится синтаксис: PRTY = N Где N — это число от 0 до 15, и чем выше число, тем выше приоритет. |
ПОСТАВИТЬ В ИЗВЕСТНОСТЬ |
Система отправляет сообщение об успехе или ошибке (максимальный код условия) пользователю, указанному в этом параметре. Ниже приводится синтаксис: NOTIFY = «идентификатор пользователя | & SYSUID» Здесь система отправляет сообщение пользователю «идентификатор пользователя», но если мы используем NOTIFY = & SYSUID, то сообщение отправляется пользователю, отправляющему JCL. |
MSGCLASS |
Указание места назначения вывода для системы и сообщений о заданиях после завершения задания. Ниже приводится синтаксис: MSGCLASS = КЛАСС Допустимые значения CLASS могут быть от «A» до «Z» и от «0» до «9». MSGCLASS = Y можно установить как класс для отправки журнала заданий в JMR (JOBLOG Management and Retrieval: хранилище в мэйнфреймах для хранения статистики заданий). |
MSGLEVEL |
Определяет тип сообщений, которые должны быть записаны в место назначения вывода, указанное в MSGCLASS. Ниже приводится синтаксис: MSGLEVEL = ( ST, MSG ) ST = тип операторов, записанных в выходной журнал
MSG = Тип сообщений, записанных в выходной журнал.
|
TYPRUN |
Определяет специальную обработку для работы. Ниже приводится синтаксис: TYPRUN = SCAN | ДЕРЖАТЬ Где SCAN and HOLD имеет следующее описание
|
ВРЕМЯ |
Определяет промежуток времени, который будет использоваться процессором для выполнения задания. Ниже приводится синтаксис: ВРЕМЯ = (мм, сс) или ВРЕМЯ = сс Где мм = минуты и сс = секунды Этот параметр может быть полезен при тестировании недавно закодированной программы. Чтобы гарантировать, что программа не будет работать долго из-за ошибок зацикливания, параметр времени может быть закодирован так, что программа завершает работу при достижении указанного времени ЦП. |
ОБЛАСТЬ, КРАЙ |
Указывает адресное пространство, необходимое для выполнения шага задания внутри задания. Ниже приводится синтаксис: ОБЛАСТЬ = НК | нмоль Здесь регион может быть задан как nK или nM, где n — это число, K — это килобайт, а M — мегабайт. Когда REGION = 0K или 0M, для выполнения предоставляется наибольшее адресное пространство. В критических приложениях кодирование 0K или 0M запрещено во избежание потери адресного пространства. |
В зависимости от продолжительности работы и количества ресурсов, необходимых для работы, компании назначают разные классы работы. Они могут быть визуализированы как отдельные планировщики, используемые ОС для получения заданий. Размещение заданий в правильном планировщике поможет в легком выполнении заданий. Некоторые компании имеют разные классы для работы в тестовой и производственной среде.
Допустимые значения параметра CLASS: от A до Z и от 0 до 9 (длина 1). Ниже приводится синтаксис:
КЛАСС = от 0 до 9 | От А до Я
Чтобы указать приоритет работы в классе работы. Если этот параметр не указан, то задание добавляется в конец очереди в указанном КЛАССЕ. Ниже приводится синтаксис:
PRTY = N
Где N — это число от 0 до 15, и чем выше число, тем выше приоритет.
Система отправляет сообщение об успехе или ошибке (максимальный код условия) пользователю, указанному в этом параметре. Ниже приводится синтаксис:
NOTIFY = «идентификатор пользователя | & SYSUID»
Здесь система отправляет сообщение пользователю «идентификатор пользователя», но если мы используем NOTIFY = & SYSUID, то сообщение отправляется пользователю, отправляющему JCL.
Указание места назначения вывода для системы и сообщений о заданиях после завершения задания. Ниже приводится синтаксис:
MSGCLASS = КЛАСС
Допустимые значения CLASS могут быть от «A» до «Z» и от «0» до «9». MSGCLASS = Y можно установить как класс для отправки журнала заданий в JMR (JOBLOG Management and Retrieval: хранилище в мэйнфреймах для хранения статистики заданий).
Определяет тип сообщений, которые должны быть записаны в место назначения вывода, указанное в MSGCLASS. Ниже приводится синтаксис:
MSGLEVEL = ( ST, MSG )
ST = тип операторов, записанных в выходной журнал
Когда ST = 0, только заявления о работе.
Когда ST = 1, JCL вместе с символическими параметрами расширяется.
Когда ST = 2, вводите только JCL.
MSG = Тип сообщений, записанных в выходной журнал.
Когда MSG = 0, сообщения распределения и завершения записываются после ненормального завершения задания.
Когда MSG = 1, сообщения Allocation and Termination записываются независимо от характера завершения задания.
Определяет специальную обработку для работы. Ниже приводится синтаксис:
TYPRUN = SCAN | ДЕРЖАТЬ
Где SCAN and HOLD имеет следующее описание
TYPRUN = SCAN проверяет синтаксические ошибки JCL, не выполняя его.
TYPRUN = HOLD переводит задание в состояние HOLD в очередь заданий. Чтобы освободить задание, можно ввести «A» для задания в SPOOL, что приведет к выполнению задания.
Определяет промежуток времени, который будет использоваться процессором для выполнения задания. Ниже приводится синтаксис:
ВРЕМЯ = (мм, сс) или ВРЕМЯ = сс
Где мм = минуты и сс = секунды
Этот параметр может быть полезен при тестировании недавно закодированной программы. Чтобы гарантировать, что программа не будет работать долго из-за ошибок зацикливания, параметр времени может быть закодирован так, что программа завершает работу при достижении указанного времени ЦП.
Указывает адресное пространство, необходимое для выполнения шага задания внутри задания. Ниже приводится синтаксис:
ОБЛАСТЬ = НК | нмоль
Здесь регион может быть задан как nK или nM, где n — это число, K — это килобайт, а M — мегабайт.
Когда REGION = 0K или 0M, для выполнения предоставляется наибольшее адресное пространство. В критических приложениях кодирование 0K или 0M запрещено во избежание потери адресного пространства.
пример
//URMISAMP JOB (*),"tutpoint",CLASS=6,PRTY=10,NOTIFY=&SYSUID, // MSGCLASS=X,MSGLEVEL=(1,1),TYPRUN=SCAN, // TIME=(3,0),REGION=10K
Здесь оператор JOB расширяется за пределы 70-й позиции в строке, поэтому мы продолжаем в следующей строке, которая должна начинаться с «//», за которым следует один или несколько пробелов.
Разные параметры
Есть несколько других параметров, которые можно использовать с оператором JOB, но они используются не часто:
ADDRSPC | Тип используемого хранилища: виртуальное или реальное |
БАЙТ | Размер данных, которые будут записаны в выходной журнал, и действие, которое будет предпринято при превышении размера. |
ЛИНИИ | Максимальное количество строк, которые будут напечатаны в выходной журнал. |
СТР | Максимальное количество страниц для печати в выходной журнал. |
USER | Идентификатор пользователя, использованный для отправки работы |
ПАРОЛЬ | Пароль идентификатора пользователя, указанный в параметре USER. |
КОНД и РЕСТАРТ | Они используются в условной обработке шага задания и подробно объясняются при обсуждении условной обработки. |
JCL — Заявление EXEC
Каждый JCL может быть сделан из множества рабочих шагов. Каждый шаг задания может выполнять программу напрямую или вызывать процедуру, которая, в свою очередь, выполняет одну или несколько программ (этапы задания). Оператор, содержащий информацию о программе / процедуре шага задания, является оператором EXEC.
Цель оператора EXEC — предоставить необходимую информацию для программы / процедуры, выполняемой на шаге задания. Параметры, закодированные в этом операторе, могут передавать данные программе во время выполнения, могут переопределять определенные параметры оператора JOB и могут передавать параметры в процедуру, если оператор EXEC вызывает процедуру вместо непосредственного выполнения программы.
Синтаксис
Ниже приведен основной синтаксис оператора JCL EXEC:
//Step-name EXEC Positional-param, Keyword-param
Описание
Давайте посмотрим описание терминов, используемых в приведенном выше синтаксисе оператора EXEC.
STEP-NAME
Это идентифицирует шаг работы в JCL. Длина может быть от 1 до 8 с буквенно-цифровыми символами.
EXEC
Это ключевое слово для определения его как оператора EXEC.
POSITIONAL-PARAM
Это позиционные параметры, которые могут быть двух типов:
Позиционный параметр | Описание |
---|---|
PGM | Это относится к имени программы, которая будет выполнена на шаге задания. |
PROC | Это относится к имени процедуры, которая будет выполнена на шаге задания. Мы обсудим это в отдельной главе. |
СЛОВО-PARAM
Ниже приведены различные параметры ключевых слов для оператора EXEC. Вы можете использовать один или несколько параметров в зависимости от требований, и они разделяются запятой:
Параметр ключевого слова | Описание |
---|---|
PARM |
Используется для предоставления параметризованных данных программе, которая выполняется на шаге задания. Это поле зависит от программы и не имеет определенных правил, за исключением того, что значение PARM должно быть включено в кавычки в случае наличия специальных символов. Например, приведенный ниже, значение «CUST1000» передается в программу в виде буквенно-цифрового значения. Если программа находится в языке COBOL, значение, переданное через параметр PARM в JCL, принимается в разделе LINKAGE программы. |
ADDRSPC |
Это используется, чтобы указать, требуется ли для шага задания виртуальное или реальное хранилище для выполнения. Виртуальное хранилище является страничным, в то время как реальное хранилище — нет и помещается в основную память для выполнения Шаги задания, которые требуют более быстрого выполнения, могут быть размещены в реальном хранилище. Ниже приводится синтаксис: ADDRSPC = VIRT | РЕАЛЬНЫЙ Если ADDRSPC не закодирован, по умолчанию используется VIRT. |
АККТ |
Это указывает учетную информацию шага задания. Ниже приводится синтаксис: АССТ = (идентификатор пользователя) Это похоже на учетную информацию о позиционных параметрах в операторе JOB. Если он закодирован как в операторе JOB, так и в инструкции EXEC, то учетная информация в операторе JOB применяется ко всем шагам задания, где параметр ACCT не закодирован. Параметр ACCT в операторе EXEC переопределит тот, который присутствует в операторе JOB, только для этого шага задания. |
Используется для предоставления параметризованных данных программе, которая выполняется на шаге задания. Это поле зависит от программы и не имеет определенных правил, за исключением того, что значение PARM должно быть включено в кавычки в случае наличия специальных символов.
Например, приведенный ниже, значение «CUST1000» передается в программу в виде буквенно-цифрового значения. Если программа находится в языке COBOL, значение, переданное через параметр PARM в JCL, принимается в разделе LINKAGE программы.
Это используется, чтобы указать, требуется ли для шага задания виртуальное или реальное хранилище для выполнения. Виртуальное хранилище является страничным, в то время как реальное хранилище — нет и помещается в основную память для выполнения Шаги задания, которые требуют более быстрого выполнения, могут быть размещены в реальном хранилище. Ниже приводится синтаксис:
ADDRSPC = VIRT | РЕАЛЬНЫЙ
Если ADDRSPC не закодирован, по умолчанию используется VIRT.
Это указывает учетную информацию шага задания. Ниже приводится синтаксис:
АССТ = (идентификатор пользователя)
Это похоже на учетную информацию о позиционных параметрах в операторе JOB. Если он закодирован как в операторе JOB, так и в инструкции EXEC, то учетная информация в операторе JOB применяется ко всем шагам задания, где параметр ACCT не закодирован. Параметр ACCT в операторе EXEC переопределит тот, который присутствует в операторе JOB, только для этого шага задания.
Общие параметры ключевых слов оператора EXEC и JOB
Параметр ключевого слова | Описание |
---|---|
ADDRSPC | ADDRSPC, закодированный в операторе JOB, переопределяет ADDRSPC, закодированный в операторе EXEC любого шага задания. |
ВРЕМЯ | Если ВРЕМЯ закодирована в инструкции EXEC, то она применяется только к этому шагу задания. Если он указан в операторе JOB и EXEC, то оба будут действовать и могут вызвать ошибку тайм-аута из-за любого из них. Не рекомендуется использовать параметр TIME одновременно в операторе JOB и EXEC. |
ОБЛАСТЬ, КРАЙ |
Если REGION закодирован в операторе EXEC, он применяется только к этому шагу задания. REGION, закодированный в операторе JOB, переопределяет REGION, закодированный в операторе EXEC любого шага работы. |
COND |
Используется для управления выполнением шага задания на основе кода возврата предыдущего шага. Если параметр COND закодирован в инструкции EXEC шага задания, то параметр COND инструкции JOB (если имеется) игнорируется. Различные тесты, которые могут быть выполнены с использованием параметра COND, описаны в условной обработке. |
Если REGION закодирован в операторе EXEC, он применяется только к этому шагу задания.
REGION, закодированный в операторе JOB, переопределяет REGION, закодированный в операторе EXEC любого шага работы.
Используется для управления выполнением шага задания на основе кода возврата предыдущего шага.
Если параметр COND закодирован в инструкции EXEC шага задания, то параметр COND инструкции JOB (если имеется) игнорируется. Различные тесты, которые могут быть выполнены с использованием параметра COND, описаны в условной обработке.
пример
Ниже приведен простой пример сценария JCL вместе с операторами JOB и EXEC:
//TTYYSAMP JOB 'TUTO',CLASS=6,MSGCLASS=X,REGION=8K, // NOTIFY=&SYSUID //* //STEP010 EXEC PGM=MYCOBOL,PARAM=CUST1000, // ACCT=(XXXX),REGION=8K,ADDRSPC=REAL,TIME=1440
JCL — DD Заявление
Наборы данных — это файлы мэйнфреймов с записями, организованными в определенном формате. Наборы данных хранятся на устройстве хранения с прямым доступом (DASD) или на лентах мэйнфрейма и являются основными областями хранения данных. Если эти данные необходимо использовать / создать в пакетной программе, то физическое имя файла (т.е. набора данных) вместе с форматом файла и организацией кодируются в JCL.
Определение каждого набора данных, используемого в JCL, дается с помощью инструкции DD . Ресурсы ввода и вывода, необходимые для шага задания, должны быть описаны в операторе DD с такой информацией, как организация набора данных, требования к хранилищу и длина записи.
Синтаксис
Ниже приведен основной синтаксис оператора JCL DD:
//DD-name DD Parameters
Описание
Давайте посмотрим описание терминов, использованных в приведенном выше синтаксисе оператора DD.
DD-NAME
DD-NAME идентифицирует набор данных или ресурс ввода / вывода. Если это файл ввода / вывода, используемый программой на языке COBOL / Assembler, то файл упоминается в программе под этим именем.
DD
Это ключевое слово для определения его как оператора DD.
ПАРАМЕТРЫ
Ниже приведены различные параметры для оператора DD. Вы можете использовать один или несколько параметров в зависимости от требований, и они разделяются запятой:
параметр | Описание |
---|---|
DSN |
Параметр DSN относится к имени физического набора данных вновь созданного или существующего набора данных. Значение DSN может состоять из подимен, каждое длиной от 1 до 8 символов, разделенных точками, и общей длиной 44 символа (буквенно-цифровой). Ниже приводится синтаксис: DSN = физическое имя набора данных Временные наборы данных нуждаются в хранении только на время выполнения задания и удаляются при завершении задания. Такие наборы данных представлены как DSN = & name или просто без указания DSN. Если временный набор данных, созданный на шаге задания, будет использоваться на следующем шаге задания, то на него ссылаются как DSN = *. Stepname.ddname . Это называется обратной ссылкой. |
DISP |
Параметр DISP используется для описания состояния набора данных, расположения в конце шага задания при нормальном и ненормальном завершении. DISP не требуется в операторе DD, только когда набор данных создается и удаляется на одном шаге задания (например, временные наборы данных). Ниже приводится синтаксис: DISP = (статус, нормальное расположение, ненормальное расположение) Ниже приведены допустимые значения для статуса :
Параметр нормального расположения может принимать одно из следующих значений
Параметр ненормального расположения может принимать одно из следующих значений
Вот описание параметров CATLG, UNCATLG, DELETE, PASS и KEEP:
Если какой-либо из подпараметров DISP не указан, значения по умолчанию следующие:
|
DCB |
Параметр Data Control Block (DCB) детализирует физические характеристики набора данных. Этот параметр является обязательным для наборов данных, которые создаются на шаге задания. LRECL — длина каждой записи, хранящейся в наборе данных. RECFM — это формат записи набора данных. RECFM может содержать значения FB, V или VB. FB — это организация с фиксированным блоком, в которой одна или несколько логических записей сгруппированы в одном блоке. V — организация переменных, в которой одна логическая запись переменной длины размещена в одном физическом блоке. VB — это организация с переменным блоком, в которой одна или несколько логических записей переменной длины размещены в одном физическом блоке. BLKSIZE — это размер физического блока. Чем больше блок, тем больше записей для файла FB или VB. DSORG — это тип организации набора данных. DSORG может содержать значения PS (физическая последовательность), PO (разделенная организация) и DA (непосредственная организация). Когда необходимо реплицировать значения DCB одного набора данных в другой в пределах одного и того же шага задания или JCL, он указывается как DCB = *. Stepname.ddname, где stepname — это имя шага задания, а ddname — набор данных, из которого DCB копируется. Ниже приведен пример, где RECFM = FB, LRECL = 80 формирует DCB набора данных OUTPUT1. |
ПРОСТРАНСТВО |
Параметр SPACE указывает пространство, необходимое для набора данных в DASD (диск хранения прямого доступа). Ниже приводится синтаксис: SPACE = (spcunits, (pri, sec, dir), RLSE) Вот описание всех используемых параметров:
|
ЕДИНИЦА ИЗМЕРЕНИЯ |
Параметры UNIT и VOL перечислены в системном каталоге для каталогизированных наборов данных и, следовательно, доступны только с помощью физического имени DSN. Но для некаталогизированных наборов данных оператор DD должен включать эти параметры. Для создания новых наборов данных можно указать параметры UNIT / VOL или Z / OS назначит подходящее устройство и объем. Параметр UNIT указывает тип устройства, на котором хранится набор данных. Тип устройства может быть идентифицирован с использованием адреса аппаратного обеспечения или группы типов устройств. Ниже приводится синтаксис: UNIT = DASD | SYSDA Где DASD означает устройство хранения с прямым доступом, а SYSDA означает System Direct Access и относится к следующему доступному устройству хранения на диске. |
VOL |
Параметр VOL указывает номер тома на устройстве, указанном параметром UNIT. Ниже приводится синтаксис: VOL = SER = (v1, v2) Где v1, v2 — серийные номера томов. Вы также можете использовать следующий синтаксис: VOL = REF = *. DDNAME Где REF — обратная ссылка на серийный номер тома набора данных на любом из предыдущих этапов задания в JCL. |
SYSOUT |
Обсуждаемые до сих пор параметры оператора DD соответствуют данным, хранящимся в наборе данных. Параметр SYSOUT направляет данные на устройство вывода в соответствии с указанным классом. Ниже приводится синтаксис SYSOUT = класс Где, если class — это A, то он направляет вывод на принтер, а если class — *, то он направляет вывод в то же место назначения, что и параметр MSGCLASS в операторе JOB. |
Параметр DSN относится к имени физического набора данных вновь созданного или существующего набора данных. Значение DSN может состоять из подимен, каждое длиной от 1 до 8 символов, разделенных точками, и общей длиной 44 символа (буквенно-цифровой). Ниже приводится синтаксис:
DSN = физическое имя набора данных
Временные наборы данных нуждаются в хранении только на время выполнения задания и удаляются при завершении задания. Такие наборы данных представлены как DSN = & name или просто без указания DSN.
Если временный набор данных, созданный на шаге задания, будет использоваться на следующем шаге задания, то на него ссылаются как DSN = *. Stepname.ddname . Это называется обратной ссылкой.
Параметр DISP используется для описания состояния набора данных, расположения в конце шага задания при нормальном и ненормальном завершении. DISP не требуется в операторе DD, только когда набор данных создается и удаляется на одном шаге задания (например, временные наборы данных). Ниже приводится синтаксис:
DISP = (статус, нормальное расположение, ненормальное расположение)
Ниже приведены допустимые значения для статуса :
НОВИНКА : набор данных создается на шаге задания. ВЫХОД 1 в примере выше.
СТАРЫЙ : Набор данных уже создан и будет перезаписан на шаге задания. Шаг задания получает монопольный доступ к набору данных, и никакое другое задание не может получить доступ к этому набору данных до завершения шага задания.
SHR : Набор данных уже создан и будет прочитан на шаге задания. Набор данных может быть прочитан несколькими заданиями одновременно. Пример: INPUT1 и INPUT2.
MOD : Набор данных уже создан. Это расположение будет использоваться, когда необходимо добавить новые записи в существующий набор данных (существующие записи не будут перезаписаны).
Параметр нормального расположения может принимать одно из следующих значений
CATLG, UNCATLG, DELETE, PASS и KEEP
Параметр ненормального расположения может принимать одно из следующих значений
CATLG, UNCATLG, DELETE и KEEP
Вот описание параметров CATLG, UNCATLG, DELETE, PASS и KEEP:
CATLG : набор данных сохраняется вместе с записью в системном каталоге.
UNCATLG : набор данных сохраняется, но запись системного каталога удаляется.
СОХРАНИТЬ : Набор данных сохраняется без изменения каких-либо записей каталога. KEEP — единственное допустимое расположение для файлов VSAM. Это должно использоваться только для постоянных наборов данных.
УДАЛИТЬ : Набор данных удаляется из каталога пользователя и системы.
PASS : это действительно только для нормального расположения. Это используется, когда набор данных должен быть передан и обработан следующим шагом задания в JCL
Если какой-либо из подпараметров DISP не указан, значения по умолчанию следующие:
статус : NEW является значением по умолчанию.
нормальное расположение : если статус НОВЫЙ, по умолчанию нормальное расположение — УДАЛИТЬ, в противном случае это ХРАНИТ.
ненормальное расположение : такое же, как нормальное расположение.
Параметр Data Control Block (DCB) детализирует физические характеристики набора данных. Этот параметр является обязательным для наборов данных, которые создаются на шаге задания.
LRECL — длина каждой записи, хранящейся в наборе данных.
RECFM — это формат записи набора данных. RECFM может содержать значения FB, V или VB. FB — это организация с фиксированным блоком, в которой одна или несколько логических записей сгруппированы в одном блоке. V — организация переменных, в которой одна логическая запись переменной длины размещена в одном физическом блоке. VB — это организация с переменным блоком, в которой одна или несколько логических записей переменной длины размещены в одном физическом блоке.
BLKSIZE — это размер физического блока. Чем больше блок, тем больше записей для файла FB или VB.
DSORG — это тип организации набора данных. DSORG может содержать значения PS (физическая последовательность), PO (разделенная организация) и DA (непосредственная организация).
Когда необходимо реплицировать значения DCB одного набора данных в другой в пределах одного и того же шага задания или JCL, он указывается как DCB = *. Stepname.ddname, где stepname — это имя шага задания, а ddname — набор данных, из которого DCB копируется.
Ниже приведен пример, где RECFM = FB, LRECL = 80 формирует DCB набора данных OUTPUT1.
Параметр SPACE указывает пространство, необходимое для набора данных в DASD (диск хранения прямого доступа). Ниже приводится синтаксис:
SPACE = (spcunits, (pri, sec, dir), RLSE)
Вот описание всех используемых параметров:
spcunits : это может быть один из CYL (цилиндр), TRK (треки) или BLKSIZE (размер блока).
pri : Это основное пространство, необходимое для набора данных.
sec : это дополнительное пространство, необходимое, когда основного пространства недостаточно.
ir : Это требуемые блоки каталогов, если набор данных представляет собой PDS (Partitioned Dataset) с членами внутри него.
RLSE : используется для освобождения неиспользуемого пространства при завершении задания.
Параметры UNIT и VOL перечислены в системном каталоге для каталогизированных наборов данных и, следовательно, доступны только с помощью физического имени DSN. Но для некаталогизированных наборов данных оператор DD должен включать эти параметры. Для создания новых наборов данных можно указать параметры UNIT / VOL или Z / OS назначит подходящее устройство и объем.
Параметр UNIT указывает тип устройства, на котором хранится набор данных. Тип устройства может быть идентифицирован с использованием адреса аппаратного обеспечения или группы типов устройств. Ниже приводится синтаксис:
UNIT = DASD | SYSDA
Где DASD означает устройство хранения с прямым доступом, а SYSDA означает System Direct Access и относится к следующему доступному устройству хранения на диске.
Параметр VOL указывает номер тома на устройстве, указанном параметром UNIT. Ниже приводится синтаксис:
VOL = SER = (v1, v2)
Где v1, v2 — серийные номера томов. Вы также можете использовать следующий синтаксис:
VOL = REF = *. DDNAME
Где REF — обратная ссылка на серийный номер тома набора данных на любом из предыдущих этапов задания в JCL.
Обсуждаемые до сих пор параметры оператора DD соответствуют данным, хранящимся в наборе данных. Параметр SYSOUT направляет данные на устройство вывода в соответствии с указанным классом. Ниже приводится синтаксис
SYSOUT = класс
Где, если class — это A, то он направляет вывод на принтер, а если class — *, то он направляет вывод в то же место назначения, что и параметр MSGCLASS в операторе JOB.
пример
Ниже приведен пример, который использует операторы DD вместе с различными параметрами, описанными выше:
//TTYYSAMP JOB 'TUTO',CLASS=6,MSGCLASS=X,REGION=8K, // NOTIFY=&SYSUID //* //STEP010 EXEC PGM=ICETOOL,ADDRSPC=REAL //* //INPUT1 DD DSN=TUTO.SORT.INPUT1,DISP=SHR //INPUT2 DD DSN=TUTO.SORT.INPUT2,DISP=SHR,UNIT=SYSDA, // VOL=SER=(1243,1244) //OUTPUT1 DD DSN=MYFILES.SAMPLE.OUTPUT1,DISP=(,CATLG,DELETE), // RECFM=FB,LRECL=80,SPACE=(CYL,(10,20)) //OUTPUT2 DD SYSOUT=*
JCL — Базовая библиотека
Базовая библиотека — это секционированный набор данных (PDS), который содержит модули загрузки программы, выполняемой в JCL, или каталогизированную процедуру, которая вызывается в программе. Базовые библиотеки могут быть указаны для всего JCL в библиотеке JOBLIB или для конкретного шага задания в инструкции STEPLIB .
Заявление JOBLIB
Оператор JOBLIB используется для определения местоположения программы, которая должна быть выполнена в JCL. Оператор JOBLIB указывается после оператора JOB и перед оператором EXEC. Это может быть использовано только для потоковых процедур и программ.
Синтаксис
Ниже приведен основной синтаксис оператора JCL JOBLIB:
//JOBLIB DD DSN=dsnname,DISP=SHR
Оператор JOBLIB применим ко всем операторам EXEC в JCL. Программа, указанная в операторе EXEC, будет найдена в библиотеке JOBLIB, а затем в системной библиотеке.
Например, если инструкция EXEC выполняет программу COBOL, модуль загрузки программы COBOL должен быть помещен в библиотеку JOBLIB.
STEPLIB Заявление
Оператор STEPLIB используется для определения местоположения программы, которая должна быть выполнена на шаге задания. Оператор STEPLIB указывается после оператора EXEC и перед оператором DD шага задания.
Синтаксис
Ниже приведен основной синтаксис оператора JCL STEPLIB:
//STEPLIB DD DSN=dsnname,DISP=SHR
Программа, указанная в операторе EXEC, будет найдена в библиотеке STEPLIB, а затем в системной библиотеке. STEPLIB, закодированный в шаге задания, переопределяет оператор JOBLIB.
пример
В следующем примере показано использование операторов JOBLIB и STEPLIB:
//MYJCL JOB ,,CLASS=6,NOTIFY=&SYSUID //* // JOBLIB DD DSN=MYPROC.BASE.LIB1,DISP=SHR //* //STEP1 EXEC PGM=MYPROG1 //INPUT1 DD DSN=MYFILE.SAMPLE.INPUT1,DISP=SHR //OUTPUT1 DD DSN=MYFILES.SAMPLE.OUTPUT1,DISP=(,CATLG,DELETE), // RECFM=FB,LRECL=80 //* //STEP2 EXEC PGM=MYPROG2 // STEPLIB DD DSN=MYPROC.BASE.LIB2,DISP=SHR //INPUT2 DD DSN=MYFILE.SAMPLE.INPUT2,DISP=SHR //OUTPUT2 DD DSN=MYFILES.SAMPLE.OUTPUT2,DISP=(,CATLG,DELETE), // RECFM=FB,LRECL=80
Здесь загружается модуль загрузки программы MYPROG1 (в STEP1) в MYPROC.SAMPLE.LIB1. Если не найден, он ищется в системной библиотеке. В STEP2 STEPLIB переопределяет JOBLIB, и модуль загрузки программы MYPROG2 ищется в MYPROC.SAMPLE.LIB2, а затем в системной библиотеке.
ВКЛЮЧИТЬ заявление
Набор операторов JCL, закодированных в элементе PDS, может быть включен в JCL с помощью оператора INCLUDE . Когда JES интерпретирует JCL, набор операторов JCL внутри члена INCLUDE заменяет оператор INCLUDE.
Синтаксис
Ниже приведен основной синтаксис оператора JCL INCLUDE:
//name INCLUDE MEMBER=member-name
Основная цель оператора INCLUDE — возможность многократного использования. Например, общие файлы, которые будут использоваться во многих JCL, могут быть закодированы как операторы DD внутри члена INCLUDE и использованы в JCL.
Фиктивные операторы DD, спецификации карт данных, PROCs, JOB, операторы PROC не могут быть закодированы внутри члена INCLUDE. Оператор INLCUDE может быть закодирован внутри члена INCLUDE, и дальнейшее вложение может быть выполнено до 15 уровней.
Заявление JCLLIB
Оператор JCLLIB используется для идентификации частных библиотек, используемых в задании. Может использоваться как с instream, так и с каталогизированными процедурами.
Синтаксис
Ниже приведен основной синтаксис оператора JCL JCLLIB:
//name JCLLIB ORDER=(library1, library2....)
Библиотеки, указанные в операторе JCLLIB, будут найдены в указанном порядке, чтобы найти программы, процедуры и элемент INCLUDE, используемые в задании. В JCL может быть только один оператор JCLLIB; указывается после оператора JOB и до оператора EXEC и INCLUDE, но его нельзя кодировать в элементе INCLUDE.
пример
В следующем примере поиск программы MYPROG3 и INCLUDE MYINCL выполняется в порядке MYPROC.BASE.LIB1, MYPROC.BASE.LIB2, системная библиотека.
//MYJCL JOB ,,CLASS=6,NOTIFY=&SYSUID //* //MYLIB JCLLIB ORDER=(MYPROC.BASE.LIB1,MYPROC.BASE.LIB2) //* //STEP1 EXEC PGM= MYPROG3 //INC INCLUDE MEMBER=MYINCL //OUTPUT1 DD DSN=MYFILES.SAMPLE.OUTPUT1,DISP=(,CATLG,DELETE), // RECFM=FB,LRECL=80 //*
JCL — Процедуры
Процедуры JCL — это набор операторов внутри JCL, сгруппированных для выполнения определенной функции. Обычно фиксированная часть JCL кодируется в процедуре. Различная часть работы кодируется в JCL.
Вы можете использовать процедуру для параллельного выполнения программы с использованием нескольких входных файлов. JCL может быть создан для каждого входного файла, и одна процедура может быть вызвана одновременно, передавая имя входного файла в качестве символического параметра.
Синтаксис
Ниже приведен основной синтаксис определения процедуры JCL:
//* // Step-name EXEC procedure name
Содержимое процедуры содержится в JCL для процедуры instream. Содержимое хранится в другом элементе базовой библиотеки для каталогизированной процедуры. В этой главе будет объяснено два типа процедур, доступных в JCL, и, наконец, мы увидим, как мы можем вкладывать различные процедуры.
Процедура Instream
Когда процедура закодирована в одном и том же элементе JCL, она называется процедурой Instream. Он должен начинаться с оператора PROC и заканчиваться оператором PEND.
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID //* //INSTPROC PROC //*START OF PROCEDURE //PROC1 EXEC PGM=SORT //SORTIN DD DSN=&DSNAME,DISP=SHR //SORTOUT DD SYSOUT=*MYINCL //SYSOUT DD SYSOUT=* //SYSIN DD DSN=&DATAC LRECL=80 // PEND //*END OF PROCEDURE //* //STEP1 EXEC INSTPROC,DSNME=MYDATA.URMI.INPUT1, // DATAC=MYDATA.BASE.LIB1(DATA1) //* //STEP2 EXEC INSTPROC,DSNME=MYDATA.URMI.INPUT2 // DATAC=MYDATA.BASE.LIB1(DATA1) //*
В приведенном выше примере процедура INSTPROC вызывается в STEP1 и STEP2 с использованием разных входных файлов. Параметры DSNAME и DATAC могут кодироваться с различными значениями при вызове процедуры, и они называются символическими параметрами . Различные входные данные для JCL, такие как имена файлов, карты данных, значения PARM и т. Д., Передаются в качестве символических параметров процедурам.
При кодировании символических параметров не используйте KEYWORDS, PARAMETERS или SUB-PARAMETERS в качестве символических имен. Пример: не используйте TIME = & TIME, но да, вы можете использовать TIME = & TM, и это считается правильным способом кодирования символов.
Определяемые пользователем символические параметры называются символами JCL . Существуют определенные символы, называемые системными символами , которые используются для выполнения заданий входа в систему. Единственный системный символ, используемый в пакетных заданиях обычными пользователями, это & SYSUID, который используется в параметре NOTIFY в операторе JOB.
Каталогизированная процедура
Когда процедура отделяется от JCL и кодируется в другом хранилище данных, она называется каталогизированной процедурой . Заявление PROC не обязательно должно быть закодировано в каталогизированной процедуре. Ниже приведен пример JCL, где он вызывает процедуру CATLPROC:
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID //* //STEP EXEC CATLPROC ,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT // DATAC=MYDATA.BASE.LIB1(DATA1)
Здесь процедура CATLPROC каталогизирована в MYCOBOL.BASE.LIB1. PROG, DATAC и DSNAME передаются в качестве символических параметров в процедуру CATLPROC.
//CATLPROC PROC PROG=,BASELB=MYCOBOL.BASE.LIB1 //* //PROC1 EXEC PGM=&PROG //STEPLIB DD DSN=&BASELB,DISP=SHR //IN1 DD DSN=&DSNAME,DISP=SHR //OUT1 DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSIN DD DSN=&DATAC //*
В рамках процедуры кодируются символические параметры PROG и BASELB. Обратите внимание, что параметр PROG в процедуре переопределяется значением в JCL, и, следовательно, PGM принимает значение CATPRC1 во время выполнения.
Вложенные процедуры
Вызов процедуры изнутри процедуры называется вложенной процедурой . Процедуры могут быть вложены до 15 уровней. Вложенность может быть полностью потоковой или каталогизированной. Мы не можем закодировать процедуру instream в каталогизированной процедуре.
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID //* //SETNM SET DSNM1=INPUT1,DSNM2=OUTPUT1 //INSTPRC1 PROC //* START OF PROCEDURE 1 //STEP1 EXEC PGM=SORT,DISP=SHR //SORTIN DD DSN=&DSNM1,DISP=SHR //SORTOUT DD DSN=&DSNM2,DISP=(,PASS) //SYSOUT DD SYSOUT=* //SYSIN DD DSN=&DATAC //* //STEP2 EXEC PROC=INSTPRC2 ,DSNM2=MYDATA.URMI.OUTPUT2 // PEND //* END OF PROCEDURE 1 //* //INSTPRC2 PROC //* START OF PROCEDURE 2 //STEP1 EXEC PGM=SORT //SORTIN DD DSN=*.INSTPRC1.STEP1.SORTOUT //SORTOUT DD DSN=&DSNM2,DISP=OLD //SYSOUT DD SYSOUT=* //SYSIN DD DSN=&DATAC // PEND //* END OF PROCEDURE 2 //* //JSTEP1 EXEC INSTPRC1,DSNM1=MYDATA.URMI.INPUT1, // DATAC=MYDATA.BASE.LIB1(DATA1) //*
В приведенном выше примере JCL вызывает процедуру INSTPRC1 в JSTEP1, а процедура INSTPRC2 вызывается в процедуре INSTPRC1. Здесь выходные данные INSTPRC1 (SORTOUT) передаются как входные данные (SORTIN) в INSTPRC2.
Оператор SET используется для определения часто используемых символов на этапах или процедурах задания. Он инициализирует предыдущие значения в символических именах. Это должно быть определено перед первым использованием символических имен в JCL.
Давайте посмотрим на описание ниже, чтобы понять немного больше о вышеупомянутой программе:
-
Параметр SET инициализирует DSNM1 = INPUT1 и DSNM2 = OUTPUT1.
-
Когда вызывается INSTPRC1 в JSTEP1 JCL, DSNM1 = MYDATA.URMI.INPUT1 и DSNM2 = OUTPUT1., Т.е. значение, инициализированное в операторе SET, сбрасывается со значением, установленным в любом из шагов / процедур задания.
-
Когда вызывается INSTPRC2 в STEP2 для INSTPRC1, DSNM1 = MYDATA.URMI.INPUT1 и DSNM2 = MYDATA.URMI.OUTPUT2.
Параметр SET инициализирует DSNM1 = INPUT1 и DSNM2 = OUTPUT1.
Когда вызывается INSTPRC1 в JSTEP1 JCL, DSNM1 = MYDATA.URMI.INPUT1 и DSNM2 = OUTPUT1., Т.е. значение, инициализированное в операторе SET, сбрасывается со значением, установленным в любом из шагов / процедур задания.
Когда вызывается INSTPRC2 в STEP2 для INSTPRC1, DSNM1 = MYDATA.URMI.INPUT1 и DSNM2 = MYDATA.URMI.OUTPUT2.
JCL — условная обработка
Система ввода заданий использует два подхода для выполнения условной обработки в JCL. Когда задание завершается, код возврата устанавливается в зависимости от состояния выполнения. Код возврата может быть числом от 0 (успешное выполнение) до 4095 (ненулевое значение показывает состояние ошибки). Наиболее распространенные общепринятые значения:
-
0 = Нормально — все ОК
-
4 = Предупреждение — мелкие ошибки или проблемы.
-
8 = Ошибка — значительные ошибки или проблемы.
-
12 = Серьезная ошибка — серьезные ошибки или проблемы, результаты не следует доверять.
-
16 = Ошибка терминала — очень серьезные проблемы, не используйте результаты.
0 = Нормально — все ОК
4 = Предупреждение — мелкие ошибки или проблемы.
8 = Ошибка — значительные ошибки или проблемы.
12 = Серьезная ошибка — серьезные ошибки или проблемы, результаты не следует доверять.
16 = Ошибка терминала — очень серьезные проблемы, не используйте результаты.
Выполнением шага задания можно управлять на основе кода возврата предыдущего шага (-ов), используя параметр COND и конструкцию IF-THEN-ELSE , которая была объяснена в этом руководстве.
Параметр COND
Параметр COND может быть закодирован в операторе JOB или EXEC JCL. Это проверка кода возврата предыдущих этапов задания. Если тест оценивается как истинный, текущее выполнение шага задания игнорируется. Обход — это просто пропуск шага работы, а не ненормальное завершение. В одном тесте может быть не более восьми условий.
Синтаксис
Ниже приведен основной синтаксис параметра JCL COND:
COND=(rc,logical-operator) or COND=(rc,logical-operator,stepname) or COND=EVEN or COND=ONLY
Вот описание используемых параметров:
-
rc : это код возврата
-
логический оператор : это может быть GT (больше, чем), GE (больше или равно), EQ (равно), LT (меньше), LE (меньше или равно) или NE (не равно).
-
stepname : это шаг задания, код возврата которого используется в тесте.
rc : это код возврата
логический оператор : это может быть GT (больше, чем), GE (больше или равно), EQ (равно), LT (меньше), LE (меньше или равно) или NE (не равно).
stepname : это шаг задания, код возврата которого используется в тесте.
Последние два условия (a) COND = EVEN и (b) COND = ONLY, были объяснены ниже в этом руководстве.
COND может быть закодирован либо внутри инструкции JOB, либо в инструкции EXEC, и в обоих случаях он ведет себя по-разному, как объяснено ниже:
COND внутри оператора JOB
Когда COND кодируется в операторе JOB, условие проверяется для каждого шага задания. Когда условие выполняется на каком-либо конкретном шаге задания, оно игнорируется вместе с шагами задания, следующими за ним. Ниже приведен пример:
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID,COND=(5,LE) //* //STEP10 EXEC PGM=FIRSTP //* STEP10 executes without any test being performed. //STEP20 EXEC PGM=SECONDP //* STEP20 is bypassed, if RC of STEP10 is 5 or above. //* Say STEP10 ends with RC4 and hence test is false. //* So STEP20 executes and lets say it ends with RC16. //STEP30 EXEC PGM=SORT //* STEP30 is bypassed since 5 <= 16.
COND внутри оператора EXEC
Когда COND закодирован в операторе EXEC шага задания и признан истинным, только этот шаг задания игнорируется, и выполнение продолжается со следующего шага задания.
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID //* //STP01 EXEC PGM=SORT //* Assuming STP01 ends with RC0. //STP02 EXEC PGM=MYCOBB,COND=(0,EQ,STP01) //* In STP02, condition evaluates to TRUE and step bypassed. //STP03 EXEC PGM=IEBGENER,COND=((10,LT,STP01),(10,GT,STP02)) //* In STP03, first condition fails and hence STP03 executes. //* Since STP02 is bypassed, the condition (10,GT,STP02) in //* STP03 is not tested.
COND = РАВ
Когда кодируется COND = EVEN, текущий шаг задания выполняется, даже если любой из предыдущих шагов ненормально завершается. Если любое другое условие RC закодировано вместе с COND = EVEN, то шаг задания выполняется, если ни одно из условий RC не выполнено.
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID //* //STP01 EXEC PGM=SORT //* Assuming STP01 ends with RC0. //STP02 EXEC PGM=MYCOBB,COND=(0,EQ,STP01) //* In STP02, condition evaluates to TRUE and step bypassed. //STP03 EXEC PGM=IEBGENER,COND=((10,LT,STP01),EVEN) //* In STP03, condition (10,LT,STP01) evaluates to true, //* hence the step is bypassed.
COND = ТОЛЬКО
Когда кодируется COND = ONLY, текущий шаг задания выполняется, только когда любой из предыдущих шагов ненормально завершается. Если какое-либо другое условие RC закодировано вместе с COND = ONLY, то шаг задания выполняется, если ни одно из условий RC не выполнено, и любой из предыдущих шагов задания завершился неудачно.
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID //* //STP01 EXEC PGM=SORT //* Assuming STP01 ends with RC0. //STP02 EXEC PGM=MYCOBB,COND=(4,EQ,STP01) //* In STP02, condition evaluates to FALSE, step is executed //* and assume the step abends. //STP03 EXEC PGM=IEBGENER,COND=((0,EQ,STP01),ONLY) //* In STP03, though the STP02 abends, the condition //* (0,EQ,STP01) is met. Hence STP03 is bypassed.
IF-THEN-ELSE Construct
Другой подход к управлению обработкой заданий — использование конструкций IF-THEN-ELSE. Это дает большую гибкость и удобный способ условной обработки.
Синтаксис
Ниже приведен основной синтаксис конструкции JCL IF-THEN-ELSE:
//name IF condition THEN list of statements //* action to be taken when condition is true //name ELSE list of statements //* action to be taken when condition is false //name ENDIF
Ниже приведено описание используемых терминов в приведенной выше конструкции IF-THEN-ELSE:
-
name : это необязательно, и имя может содержать от 1 до 8 буквенно-цифровых символов, начинающихся с алфавита, #, $ или @.
-
Условие : условие будет иметь формат: КЛЮЧЕВОЕ СЛОВО ОПЕРАТОРА , где КЛЮЧЕВЫМИ СЛОВАМИ могут быть RC (код возврата), ABENDCC (код завершения системы или пользователя), ABEND, RUN (выполнение запуска шага). ОПЕРАТОР может быть логическим оператором (И (&), ИЛИ (|)) или реляционным оператором (<, <=,>,> =, <>).
name : это необязательно, и имя может содержать от 1 до 8 буквенно-цифровых символов, начинающихся с алфавита, #, $ или @.
Условие : условие будет иметь формат: КЛЮЧЕВОЕ СЛОВО ОПЕРАТОРА , где КЛЮЧЕВЫМИ СЛОВАМИ могут быть RC (код возврата), ABENDCC (код завершения системы или пользователя), ABEND, RUN (выполнение запуска шага). ОПЕРАТОР может быть логическим оператором (И (&), ИЛИ (|)) или реляционным оператором (<, <=,>,> =, <>).
пример
Ниже приведен простой пример, показывающий использование IF-THEN-ELSE:
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID //* //PRC1 PROC //PST1 EXEC PGM=SORT //PST2 EXEC PGM=IEBGENER // PEND //STP01 EXEC PGM=SORT //IF1 IF STP01.RC = 0 THEN //STP02 EXEC PGM=MYCOBB1,PARM=123 // ENDIF //IF2 IF STP01.RUN THEN //STP03a EXEC PGM=IEBGENER //STP03b EXEC PGM=SORT // ENDIF //IF3 IF STP03b.!ABEND THEN //STP04 EXEC PGM=MYCOBB1,PARM=456 // ELSE // ENDIF //IF4 IF (STP01.RC = 0 & STP02.RC <= 4) THEN //STP05 EXEC PROC=PRC1 // ENDIF //IF5 IF STP05.PRC1.PST1.ABEND THEN //STP06 EXEC PGM=MYABD // ELSE //STP07 EXEC PGM=SORT // ENDIF
Давайте попробуем заглянуть в вышеприведенную программу, чтобы понять ее немного подробнее:
-
Код возврата STP01 проверен в IF1. Если это 0, то выполняется STP02. В противном случае обработка переходит к следующему оператору IF (IF2).
-
В IF2, если STP01 начал выполнение, тогда выполняются STP03a и STP03b.
-
В IF3, если STP03b не ABEND, выполняется STP04. В ELSE нет заявлений. Это называется NULL ELSE оператором.
-
В IF4, если STP01.RC = 0 и STP02.RC <= 4 равны TRUE, выполняется STP05.
-
В IF5, если шаг процесса PST1 в PROC PRC1 в шаге задания STP05 ABEND, выполняется STP06. Остальное STP07 выполнено.
-
Если значение IF4 равно false, STP05 не выполняется. В этом случае IF5 не проверяются, и шаги STP06, STP07 не выполняются.
Код возврата STP01 проверен в IF1. Если это 0, то выполняется STP02. В противном случае обработка переходит к следующему оператору IF (IF2).
В IF2, если STP01 начал выполнение, тогда выполняются STP03a и STP03b.
В IF3, если STP03b не ABEND, выполняется STP04. В ELSE нет заявлений. Это называется NULL ELSE оператором.
В IF4, если STP01.RC = 0 и STP02.RC <= 4 равны TRUE, выполняется STP05.
В IF5, если шаг процесса PST1 в PROC PRC1 в шаге задания STP05 ABEND, выполняется STP06. Остальное STP07 выполнено.
Если значение IF4 равно false, STP05 не выполняется. В этом случае IF5 не проверяются, и шаги STP06, STP07 не выполняются.
IF-THEN-ELSE не будет выполняться в случае ненормального завершения задания, такого как пользователь, отменяющий задание, истечение времени выполнения задания или набор данных, обратная ссылка на который пропускается.
Установка контрольных точек
Вы можете установить набор данных контрольных точек в вашей программе JCL, используя SYSCKEOV, который является оператором DD.
CHKPT — это параметр, закодированный для многотомных наборов данных QSAM в операторе DD. Когда CHKPT кодируется как CHKPT = EOV, контрольная точка записывается в набор данных, указанный в операторе SYSCKEOV, в конце каждого тома входного / выходного многотомного набора данных.
//CHKSAMP JOB CLASS=6,NOTIFY=&SYSUID //* //STP01 EXEC PGM=MYCOBB //SYSCKEOV DD DSNAME=SAMPLE.CHK,DISP=MOD //IN1 DD DSN=SAMPLE.IN,DISP=SHR //OUT1 DD DSN=SAMPLE.OUT,DISP=(,CATLG,CATLG) // CHKPT=EOV,LRECL=80,RECFM=FB
В приведенном выше примере контрольная точка записывается в набор данных SAMPLE.CHK в конце каждого тома выходного набора данных SAMPLE.OUT.
Перезапустить обработку
Вы можете возобновить обработку эфира автоматическим способом, используя параметр RD, или вручную, используя параметр RESTART .
Параметр RD кодируется в операторе JOB или EXEC, он помогает в автоматическом перезапуске JOB / STEP и может содержать одно из четырех значений: R, RNC, NR или NC.
-
RD = R разрешает автоматический перезапуск и рассматривает контрольную точку, закодированную в параметре CHKPT оператора DD.
-
RD = RNC разрешает автоматический перезапуск, но переопределяет (игнорирует) параметр CHKPT.
-
RD = NR указывает, что задание / шаг не может быть автоматически перезапущен. Но когда он перезапускается вручную с использованием параметра RESTART, будет учитываться параметр CHKPT (если есть).
-
RD = NC запрещает автоматический перезапуск и обработку контрольных точек.
RD = R разрешает автоматический перезапуск и рассматривает контрольную точку, закодированную в параметре CHKPT оператора DD.
RD = RNC разрешает автоматический перезапуск, но переопределяет (игнорирует) параметр CHKPT.
RD = NR указывает, что задание / шаг не может быть автоматически перезапущен. Но когда он перезапускается вручную с использованием параметра RESTART, будет учитываться параметр CHKPT (если есть).
RD = NC запрещает автоматический перезапуск и обработку контрольных точек.
Если требуется выполнить автоматический перезапуск только для определенных кодов аварийного завершения , это можно указать в элементе SCHEDxx библиотеки IBM system parmlib.
Параметр RESTART кодируется в операторе JOB или EXEC и помогает при ручном перезапуске JOB / STEP после сбоя задания. RESTART может сопровождаться checkid, который является контрольной точкой, записанной в наборе данных, закодированном в операторе SYSCKEOV DD. При кодировании checkid оператор SYSCHK DD должен кодироваться для ссылки на набор данных контрольной точки после оператора JOBLIB (если есть), в противном случае после оператора JOB.
//CHKSAMP JOB CLASS=6,NOTIFY=&SYSUID,RESTART=(STP01,chk5) //* //SYSCHK DD DSN=SAMPLE.CHK,DISP=OLD //STP01 EXEC PGM=MYCOBB //*SYSCKEOV DD DSNAME=SAMPLE.CHK,DISP=MOD //IN1 DD DSN=SAMPLE.IN,DISP=SHR //OUT1 DD DSN=SAMPLE.OUT,DISP=(,CATLG,CATLG) // CHKPT=EOV,LRECL=80,RECFM=FB
В приведенном выше примере chk5 — это checkid, т. Е. STP01 перезапускается с контрольной точки5. Обратите внимание, что добавлен оператор SYSCHK, а оператор SYSCKEOV закомментирован в предыдущей программе, описанной в разделе «Установка контрольной точки».
JCL — Определение наборов данных
Имя набора данных указывает имя файла, и оно обозначается DSN в JCL. Параметр DSN относится к имени физического набора данных вновь созданного или существующего набора данных. Значение DSN может состоять из подимен, каждое длиной от 1 до 8 символов, разделенных точками, и общей длиной 44 символа (буквенно-цифровой). Ниже приводится синтаксис:
DSN=&name | *.stepname.ddname
Временные наборы данных нуждаются в хранении только на время выполнения задания и удаляются при завершении задания. Такие наборы данных представлены как DSN = & name или просто без указания DSN.
Если временный набор данных, созданный на шаге задания, будет использоваться на следующем шаге задания, то на него ссылаются как DSN = *. Stepname.ddname . Это называется обратной ссылкой.
Объединение наборов данных
Если существует несколько наборов данных одного и того же формата, они могут быть объединены и переданы в качестве входных данных в программу под одним именем DD.
//CONCATEX JOB CLASS=6,NOTIFY=&SYSUID //* //STEP10 EXEC PGM=SORT //SORTIN DD DSN=SAMPLE.INPUT1,DISP=SHR // DD DSN=SAMPLE.INPUT2,DISP=SHR // DD DSN=SAMPLE.INPUT3,DISP=SHR //SORTOUT DD DSN=SAMPLE.OUTPUT,DISP=(,CATLG,DELETE), // LRECL=50,RECFM=FB
В приведенном выше примере три набора данных объединяются и передаются в качестве входных данных программе SORT с именем SORTIN DD. Файлы объединяются, сортируются по указанным ключевым полям и затем записываются в один выходной файл SAMPLE.OUTPUT с именем SORTOUT DD.
Переопределение наборов данных
В стандартизированном JCL выполняемая программа и связанные с ней наборы данных помещаются в каталогизированную процедуру, которая вызывается в JCL. Обычно в целях тестирования или для исправления инцидента может потребоваться использование других наборов данных, отличных от указанных в каталогизированной процедуре. В этом случае набор данных в процедуре может быть переопределен в JCL.
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID //* //JSTEP1 EXEC CATLPROC ,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT // DATAC=MYDATA.BASE.LIB1(DATA1) //STEP1.IN1 DD DSN=MYDATA.OVER.INPUT,DISP=SHR //* //* The cataloged procedure is as below: //* //CATLPROC PROC PROG=,BASELB=MYCOBOL.BASE.LIB1 //* //STEP1 EXEC PGM=&PROG //STEPLIB DD DSN=&BASELB,DISP=SHR //IN1 DD DSN=MYDATA.URMI.INPUT,DISP=SHR //OUT1 DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSIN DD MYDATA.BASE.LIB1(DATA1),DISP=SHR //* //STEP2 EXEC PGM=SORT
В приведенном выше примере набор данных IN1 использует файл MYDATA.URMI.INPUT в PROC, который переопределяется в JCL. Следовательно, входной файл, используемый при выполнении, является MYDATA.OVER.INPUT. Обратите внимание, что набор данных называется STEP1.IN1. Если в JCL / PROC есть только один шаг, то на набор данных можно ссылаться только с именем DD. Аналогичным образом, если в JCL имеется более одного шага, то набор данных должен быть переопределен как JSTEP1.STEP1.IN1.
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID //* //STEP EXEC CATLPROC ,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT // DATAC=MYDATA.BASE.LIB1(DATA1) //STEP1.IN1 DD DSN=MYDATA.OVER.INPUT,DISP=SHR // DD DUMMY // DD DUMMY //*
В приведенном выше примере из трех наборов данных, объединенных в IN1, первый переопределяется в JCL, а остальное сохраняется в том виде, который присутствует в PROC.
Определение GDG в JCL
Группы данных генерации (GDG) — это группы наборов данных, связанных друг с другом общим именем. Общее имя называется базой GDG, а каждый набор данных, связанный с базой, называется версией GDG.
Например, MYDATA.URMI.SAMPLE.GDG — это базовое имя GDG. Наборы данных называются MYDATA.URMI.SAMPLE.GDG.G0001V00, MYDATA.URMI.SAMPLE.GDG.G0002V00 и так далее. Последняя версия GDG называется MYDATA.URMI.SAMPLE.GDG (0), предыдущие версии — (-1), (-2) и т. Д. Следующая версия, создаваемая в программе, называется JD в MYDATA.URMI.SAMPLE.GDG (+1).
Создать / изменить GDG в JCL
Версии GDG могут иметь одинаковые или разные параметры DCB. Исходная модель DCB может быть определена для использования всеми версиями, но она может быть переопределена при создании новых версий.
//GDGSTEP1 EXEC PGM=IDCAMS //SYSPRINT DD SYSOUT=* //SYSIN DD * DEFINE GDG(NAME(MYDATA.URMI.SAMPLE.GDG) - LIMIT(7) - NOEMPTY - SCRATCH) /* //GDGSTEP2 EXEC PGM=IEFBR14 //GDGMODLD DD DSN=MYDATA.URMI.SAMPLE.GDG, // DISP=(NEW,CATLG,DELETE), // UNIT=SYSDA, // SPACE=(CYL,10,20), // DCB=(LRECL=50,RECFM=FB) //
В приведенном выше примере утилита IDCAMS определяет базу GDG в GDGSTEP1 с параметрами ниже, передаваемыми в операторе SYSIN DD:
-
NAME указывает имя физического набора данных базы GDG.
-
LIMIT указывает максимальное количество версий, которое может содержать база GDG.
-
EMPTY отменяет калибровку всех поколений при достижении LIMIT.
-
NOEMPTY uncataloges самое последнее поколение.
-
SCRATCH физически удаляет поколение, когда оно не занесено в каталог.
-
NOSCRATCH не удаляет набор данных, т. Е. На него можно ссылаться, используя параметры UNIT и VOL.
NAME указывает имя физического набора данных базы GDG.
LIMIT указывает максимальное количество версий, которое может содержать база GDG.
EMPTY отменяет калибровку всех поколений при достижении LIMIT.
NOEMPTY uncataloges самое последнее поколение.
SCRATCH физически удаляет поколение, когда оно не занесено в каталог.
NOSCRATCH не удаляет набор данных, т. Е. На него можно ссылаться, используя параметры UNIT и VOL.
В GDGSTEP2 утилита IEFBR14 определяет параметры DD модели, которые будут использоваться всеми версиями.
IDCAMS можно использовать для изменения параметров определения GDG, таких как увеличение LIMIT, изменение EMPTY на NOEMPTY и т. Д., А связанные с ним версии с помощью команды SYSIN — ALTER MYDATA.URMI.SAMPLE.GDG LIMIT (15) EMPTY .
Удалить GDG в JCL
Используя утилиту IEFBR14, мы можем удалить одну версию GDG.
//GDGSTEP3 EXEC PGM=IEFBR14 //GDGDEL DD DSN=MYDATA.URMI.SAMPLE.GDG(0), // DISP=(OLD,DELETE,DELETE)
В приведенном выше примере последняя версия MYDATA.URMI.SAMPLE.GDG удалена. Обратите внимание, что параметр DISP при обычном завершении задания кодируется как DELETE. Следовательно, набор данных удаляется, когда задание завершает выполнение.
IDCAMS можно использовать для удаления GDG и связанных с ним версий с помощью команды SYSIN DELETE (MYDATA.URMI.SAMPLE.GDG) GDG FORCE / PURGE .
-
FORCE удаляет версии GDG и базу GDG. Если для какой-либо из версий GDG задана дата истечения срока действия, срок действия которой еще не истек, они не удаляются и, следовательно, база GDG сохраняется.
-
PURGE удаляет версии GDG и базу GDG независимо от даты истечения срока действия.
FORCE удаляет версии GDG и базу GDG. Если для какой-либо из версий GDG задана дата истечения срока действия, срок действия которой еще не истек, они не удаляются и, следовательно, база GDG сохраняется.
PURGE удаляет версии GDG и базу GDG независимо от даты истечения срока действия.
Использование GDG в JCL
В следующем примере последняя версия MYDATA.URMI.SAMPLE.GDG используется в качестве входных данных для программы, а новая версия MYDATA.URMI.SAMPLE.GDG создается в качестве выходных данных.
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID //* //STP01 EXEC PGM=MYCOBB //IN1 DD DSN=MYDATA.URMI.SAMPLE.GDG(0),DISP=SHR //OUT1 DD DSN=MYDATA.URMI.SAMPLE.GDG(+1),DISP=(,CALTG,DELETE) // LRECL=100,RECFM=FB
Здесь, если GDG был указан по фактическому имени, например, MYDATA.URMI.SAMPLE.GDG.G0001V00, то это приводит к изменению JCL каждый раз перед выполнением. Использование (0) и (+1) позволяет динамически заменить версию GDG для выполнения.
Методы ввода-вывода
Любая пакетная программа, выполняемая через JCL, требует ввода данных, который обрабатывается и создается выход. Существуют разные способы подачи ввода в программу и записи вывода, полученного из JCL. В пакетном режиме взаимодействие с пользователем не требуется, но устройства ввода и вывода и требуемая организация определены в JCL и отправлены.
Ввод данных в JCL
Существуют различные способы передачи данных в программу с использованием JCL, и эти методы были объяснены ниже:
INSTREAM DATA
Входные данные для программы могут быть указаны с помощью оператора SYSIN DD.
//CONCATEX JOB CLASS=6,NOTIFY=&SYSUID //* Example 1: //STEP10 EXEC PGM=MYPROG //IN1 DD DSN=SAMPLE.INPUT1,DISP=SHR //OUT1 DD DSN=SAMPLE.OUTPUT1,DISP=(,CATLG,DELETE), // LRECL=50,RECFM=FB //SYSIN DD * //CUST1 1000 //CUST2 1001 /* //* //* Example 2: //STEP20 EXEC PGM=MYPROG //OUT1 DD DSN=SAMPLE.OUTPUT2,DISP=(,CATLG,DELETE), // LRECL=50,RECFM=FB //SYSIN DD DSN=SAMPLE.SYSIN.DATA,DISP=SHR //*
В примере 1 вход в MYPROG передается через SYSIN. Данные предоставлены в JCL. Две записи данных передаются в программу. Обратите внимание, что / * отмечает конец данных SYSIN в instream.
«CUST1 1000» — это запись1, а «CUST2 1001» — это запись2. Условие конца данных выполняется, когда при чтении данных встречается символ / *.
В примере 2 данные SYSIN хранятся в наборе данных, где SAMPLE.SYSIN.DATA — это файл PS, который может содержать одну или несколько записей данных.
Ввод данных через файлы
Как упоминалось в большинстве примеров в предыдущих главах, ввод данных в программу может быть обеспечен через файлы PS, VSAM или GDG с соответствующими именем DSN и параметрами DISP вместе с операторами DD.
В примере 1 SAMPLE.INPUT1 — это входной файл, через который данные передаются в MYPROG. В программе это называется IN1.
Вывод данных в JCL
Вывод в JCL может быть каталогизирован в набор данных или передан в SYSOUT. Как упоминалось в главе « Операторы DD», SYSOUT = * перенаправляет вывод в тот же класс, который указан в параметре MSGCLASS инструкции JOB.
Сохранение журналов заданий
При указании MSGCLASS = Y журнал заданий сохраняется в JMR (Управление и поиск журналов заданий). Весь журнал JOB можно перенаправить в SPOOL и сохранить в наборе данных, указав команду XDC для имени задания в SPOOL. Когда команда XDC задается в SPOOL, открывается экран создания набора данных. Затем можно сохранить журнал заданий, указав соответствующее определение PS или PDS.
Журналы заданий также можно сохранить в наборе данных, упомянув уже созданный набор данных для SYSOUT и SYSPRINT. Но весь журнал заданий не может быть получен таким способом (т. Е. JESMSG не будет каталогизирован), как это делается в JMR или XDC.
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID //* //STEP1 EXEC PGM=MYPROG //IN1 DD DSN=MYDATA.URMI.INPUT,DISP=SHR //OUT1 DD SYSOUT=* //SYSOUT DD DSN=MYDATA.URMI.SYSOUT,DISP=SHR //SYSPRINT DD DSN=MYDATA.URMI.SYSPRINT,DISP=SHR //SYSIN DD MYDATA.BASE.LIB1(DATA1),DISP=SHR //* //STEP2 EXEC PGM=SORT
В приведенном выше примере SYSOUT каталогизируется в MYDATA.URMI.SYSOUT и SYSPRINT в MYDATA.URMI.SYSPRINT.
Запуск программ на COBOL с использованием JCL
Компиляция программ 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.
Этот JCL создает модуль загрузки программы в качестве вывода, который используется в качестве входных данных для выполнения JCL.
Запуск программ 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
Ввод данных в пакетную программу COBOL может осуществляться через файлы, параметр PARAM и оператор SYSIN DD. В приведенном выше примере:
-
Записи данных передаются в MYPROG через файл MYDATA.URMI.INPUT. Этот файл будет ссылаться в программе с использованием имени DD INPUT1. Файл можно открывать, читать и закрывать в программе.
-
Данные параметра PARM ACCT5000 принимаются в разделе LINKAGE программы MYPROG в переменной, определенной в этом разделе.
-
Данные в операторе SYSIN принимаются через оператор ACCEPT в разделе PROCEDURE программы. Каждый оператор ACCEPT считывает одну целую запись (т.е. CUST1 1000) в рабочую переменную хранения, определенную в программе.
Записи данных передаются в MYPROG через файл MYDATA.URMI.INPUT. Этот файл будет ссылаться в программе с использованием имени DD INPUT1. Файл можно открывать, читать и закрывать в программе.
Данные параметра PARM ACCT5000 принимаются в разделе LINKAGE программы MYPROG в переменной, определенной в этом разделе.
Данные в операторе SYSIN принимаются через оператор ACCEPT в разделе PROCEDURE программы. Каждый оператор ACCEPT считывает одну целую запись (т.е. CUST1 1000) в рабочую переменную хранения, определенную в программе.
Выполнение программы COBOL-DB2
Для запуска программы DB2 на COBOL в JCL и программе используется специализированная утилита IBM; Регион DB2 и необходимые параметры передаются в качестве входных данных утилите.
Следующие шаги выполняются при запуске программы COBOL-DB2:
-
Когда программа на языке COBOL-DB2 компилируется, DBRM (модуль запроса базы данных) создается вместе с модулем загрузки. DBRM содержит операторы SQL программ на языке COBOL, синтаксис которых проверен на корректность.
-
DBRM привязан к региону DB2 (среде), в которой будет работать COBOL. Это можно сделать с помощью утилиты IKJEFT01 в JCL.
-
После шага связывания программа COBOL-DB2 запускается с использованием IKJEFT01 (снова) с библиотекой загрузки и библиотекой DBRM в качестве входных данных для JCL.
Когда программа на языке 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.
JCL — Утилиты
IBM Dataset Utilities
Служебные программы — это заранее написанные программы, широко используемые системными программистами и разработчиками приложений на мэйнфреймах для выполнения повседневных требований, организации и обслуживания данных. Некоторые из них перечислены ниже с их функциональностью:
Название утилиты | функциональность |
---|---|
IEHMOVE | Перемещает или копирует последовательные наборы данных. |
IEHPROGM | Удаление и переименование наборов данных; каталоги или некаталогические наборы данных, кроме VSAM. < |
IEHCOMPR | Сравнивает данные в последовательных наборах данных. |
IEBCOPY | Копирование, объединение, сжатие, резервное копирование или восстановление PDS. |
IEFBR14 |
Нет операции утилиты. Используется для возврата управления пользователю и завершения. Обычно используется для создания пустого набора данных или удаления существующего набора данных. Например, если набор данных передается в качестве входных данных в программу IEFBR14 с DISP = (OLD, DELETE, DELETE), набор данных удаляется при завершении задания. |
IEBEDIT | Используется для копирования выбранных частей JCL. Например, если JCL имеет 5 шагов и нам требуется выполнить только шаги 1 и 3, то JCL IEBEDIT может быть закодирован с набором данных, который содержит фактический JCL, который должен быть выполнен. В SYSIN IEBEDIT мы можем указать STEP1 и STEP3 в качестве параметров. Когда этот JCL выполняется, он выполняет STEP1 и STEP3 фактического JCL. |
IDCAMS | Создание, удаление, переименование, каталог, некаталогические наборы данных (кроме PDS). Обычно используется для управления наборами данных VSAM. |
Нет операции утилиты. Используется для возврата управления пользователю и завершения. Обычно используется для создания пустого набора данных или удаления существующего набора данных.
Например, если набор данных передается в качестве входных данных в программу IEFBR14 с DISP = (OLD, DELETE, DELETE), набор данных удаляется при завершении задания.
Эти служебные программы должны использоваться с соответствующими инструкциями DD в JCL для достижения указанной функциональности.
Обзор DFSORT
DFSORT — мощная утилита IBM, используемая для копирования, сортировки или объединения наборов данных. Операторы SORTIN и SORTINnn DD используются для указания входных наборов данных. Операторы SORTOUT и OUTFIL используются для указания выходных данных.
Оператор SYSIN DD используется для указания условий сортировки и слияния. DFSORT обычно используется для достижения следующих функций:
-
Сортировать входной файл (ы) в порядке расположения указанных полей (полей) в файле.
-
INCLUDE или OMIT записи из входного файла (ов) на основе указанного условия.
-
SORT MERGE входной файл (ы) в порядке расположения указанных полей в файле.
-
СОРТИРОВАТЬ СОЕДИНЕНИЕ два или более входных файлов на основе указанного КЛАВИШИ JOIN (поля в каждом входном файле).
-
Когда требуется выполнить дополнительную обработку входных файлов, из программы SORT может быть вызвана программа USER EXIT. Например, если к выходному файлу необходимо добавить заголовок / трейлер, то для выполнения этой функции из программы SORT можно вызвать написанную пользователем программу COBOL, написанную пользователем. С помощью контрольной карты данные могут быть переданы в программу COBOL.
-
С другой стороны, SORT может вызываться внутренне из программы на языке COBOL, чтобы расположить входной файл в определенном порядке перед обработкой. Обычно это не рекомендуется с точки зрения производительности для больших файлов.
Сортировать входной файл (ы) в порядке расположения указанных полей (полей) в файле.
INCLUDE или OMIT записи из входного файла (ов) на основе указанного условия.
SORT MERGE входной файл (ы) в порядке расположения указанных полей в файле.
СОРТИРОВАТЬ СОЕДИНЕНИЕ два или более входных файлов на основе указанного КЛАВИШИ JOIN (поля в каждом входном файле).
Когда требуется выполнить дополнительную обработку входных файлов, из программы SORT может быть вызвана программа USER EXIT. Например, если к выходному файлу необходимо добавить заголовок / трейлер, то для выполнения этой функции из программы SORT можно вызвать написанную пользователем программу COBOL, написанную пользователем. С помощью контрольной карты данные могут быть переданы в программу COBOL.
С другой стороны, SORT может вызываться внутренне из программы на языке COBOL, чтобы расположить входной файл в определенном порядке перед обработкой. Обычно это не рекомендуется с точки зрения производительности для больших файлов.
ICETOOL Обзор
ICETOOL — это многоцелевая утилита DFSORT, используемая для выполнения различных операций с наборами данных. Входные и выходные наборы данных могут быть определены с использованием пользовательских имен DD. Файловые операции указываются в операторе TOOLIN DD. Дополнительные условия могут быть указаны в определяемых пользователем инструкциях DD ‘CTL’.
Немного из утилит ICETOOL приведены ниже:
-
ICETOOL может выполнять все функции DFSORT в одном или нескольких условиях.
-
SPLICE — это мощная операция ICETOOL, похожая на SORT JOIN, но с дополнительными функциями. Он может сравнивать два или более файлов в указанных полях и создавать один или несколько выходных файлов, таких как файл с соответствующими записями, файл с несовпадающими записями и т. Д.
-
Данные в одном файле в определенной позиции могут быть перенесены в другую позицию в том же или другом файле.
-
Файл может быть разбит на n файлов в зависимости от заданного условия. Например, файл, содержащий имена сотрудников, может быть разбит на 26 файлов, каждый из которых содержит имена, начинающиеся с A, B, C и т. Д.
-
Различные комбинации манипулирования файлами возможны при использовании ICETOOL с небольшим исследованием инструмента.
ICETOOL может выполнять все функции DFSORT в одном или нескольких условиях.
SPLICE — это мощная операция ICETOOL, похожая на SORT JOIN, но с дополнительными функциями. Он может сравнивать два или более файлов в указанных полях и создавать один или несколько выходных файлов, таких как файл с соответствующими записями, файл с несовпадающими записями и т. Д.
Данные в одном файле в определенной позиции могут быть перенесены в другую позицию в том же или другом файле.
Файл может быть разбит на n файлов в зависимости от заданного условия. Например, файл, содержащий имена сотрудников, может быть разбит на 26 файлов, каждый из которых содержит имена, начинающиеся с A, B, C и т. Д.
Различные комбинации манипулирования файлами возможны при использовании ICETOOL с небольшим исследованием инструмента.
Обзор SYNCSORT
SYNCSORT используется для копирования, объединения или сортировки наборов данных с высокой производительностью. Это обеспечивает наилучшее использование системных ресурсов и эффективную работу в 31-разрядных и 64-разрядных адресных пространствах.
Он может использоваться в тех же строках DFSORT и может достигать тех же функций. Он может быть вызван JCL или из программы, написанной на языке COBOL, PL / 1 или языке ассемблера. Он также поддерживает программы пользователя Exit, вызываемые из программы SYNCSORT.
Часто используемые приемы сортировки с использованием этих утилит описаны в следующей главе. Сложные требования, которые требуют огромного программирования на языке COBOL / ASSEMBLER, могут быть достигнуты с помощью вышеуказанных утилит в простых шагах.
JCL — основные приемы сортировки
Ежедневные требования к приложениям в корпоративном мире, которые могут быть достигнуты с помощью служебных программ, показаны ниже:
1. Файл имеет 100 записей. Первые 10 записей должны быть записаны в выходной файл.
//JSTEP020 EXEC PGM=ICETOOL //TOOLMSG DD SYSOUT=* //DFSMSG DD SYSOUT=* //IN1 DD DSN=MYDATA.URMI.STOPAFT,DISP=SHR //OUT1 DD SYSOUT=* //TOOLIN DD * COPY FROM(IN1) TO(OUT1) USING(CTL1) /* //CTL1CNTL DD * OPTION STOPAFT=10 /*
Опция STOPAFT прекратит чтение входного файла после 10-й записи и завершит программу. Следовательно, 10 записей записываются на выход.
2. Входной файл содержит одну или несколько записей для одного и того же номера сотрудника. Написать уникальные записи для вывода.
//STEP010 EXEC PGM=SORT //SYSOUT DD SYSOUT=* //SORTIN DD DSN=MYDATA.URMI.DUPIN,DISP=SHR //SORTOUT DD SYSOUT=* //SYSIN DD * SORT FIELDS=(1,15,ZD,A) SUM FIELDS=NONE /*
SUM FIELDS = NONE удаляет дубликаты полей, указанных в поле SORT FIELDS. В приведенном выше примере номер сотрудника находится в поле позиции 1,15. Выходной файл будет содержать уникальные номера сотрудников, отсортированные по возрастанию.
3. Перезаписать содержимое входной записи.
//JSTEP010 EXEC PGM=SORT //SORTIN DD DSN= MYDATA.URMI.SAMPLE.MAIN,DISP=SHR //SORTOUT DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSIN DD * OPTION COPY INREC OVERLAY=(47:1,6) /*
Во входном файле содержимое в позиции 1,6 перезаписывается в позицию 47,6 и затем копируется в выходной файл. Операция INREC OVERLAY используется для перезаписи данных во входном файле перед их копированием в выходной файл.
4. Добавление порядкового номера в выходной файл.
//JSTEP010 EXEC PGM=SORT //SORTIN DD * data1 data2 data3 /* //SORTOUT DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSIN DD * OPTION COPY BUILD=(1:1,5,10:SEQNUM,4,ZD,START=1000,INCR=2) /*
Выход будет:
data1 1000 data2 1002 data3 1004
Четырехзначный порядковый номер добавляется в вывод в позиции 10, начиная с 1000 и увеличивается на 2 для каждой записи.
5. Добавление заголовка / трейлера к выходному файлу.
//JSTEP010 EXEC PGM=SORT //SORTIN DD * data1 data2 data3 /* //SORTOUT DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSIN DD * SORT FIELDS=COPY OUTFIL REMOVECC, HEADER1=(1:C'HDR',10:X'020110131C'), TRAILER1=(1:C'TRL',TOT=(10,9,PD,TO=PD,LENGTH=9)) /*
Выход будет:
HDR 20110131 data1 data2 data3 TRL 000000003
TOT рассчитывает количество записей во входном файле. HDR и TRL добавляются в качестве идентификаторов в заголовок / трейлер, который определяется пользователем и может быть настроен в соответствии с потребностями пользователей.
6. Условная обработка
//JSTEP010 EXEC PGM=SORT //SORTIN DD * data1select data2 data3select /* //SORTOUT DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSIN DD * INREC IFTHEN=(WHEN=(6,1,CH,NE,C' '),BUILD=(1:1,15), IFTHEN=(WHEN=(6,1,CH,EQ,C' '),BUILD=(1:1,5,7:C'EMPTY ') OPTION COPY /*
Выход будет:
data1select
data2 EMPTY
data3select
На основании 6-ой позиции файла строение выходного файла варьируется. Если 6-я позиция — ПРОСТРАНСТВА, тогда текст «ПУСТО» добавляется к входной записи. В противном случае входная запись записывается на выход как есть.
7. Резервное копирование файла
//JSTEP001 EXEC PGM=IEBGENER //SYSPRINT DD SYSOUT=* //SYSIN DD * //SYSOUT DD SYSOUT=* //SORTOUT DD DUMMY //SYSUT1 DD DSN=MYDATA.URMI.ORIG,DISP=SHR //SYSUT2 DD DSN=MYDATA.URMI.BACKUP,DISP=(NEW,CATLG,DELETE), // DCB=*.SYSUT1,SPACE=(CYL,(50,1),RLSE)
IEBGENER копирует файл в SYSUT1 в файл в SYSUT2. Обратите внимание, что файл в SYSUT2 принимает тот же DCB, что и файл SYSUT1 в приведенном выше примере.
8. Сравнение файлов
//STEP010 EXEC PGM=SORT //MAIN DD * 1000 1001 1003 1005 //LOOKUP DD * 1000 1002 1003 //MATCH DD DSN=MYDATA.URMI.SAMPLE.MATCH,DISP=OLD //NOMATCH1 DD DSN=MYDATA.URMI.SAMPLE.NOMATCH1,DISP=OLD //NOMATCH2 DD DSN=MYDATA.URMI.SAMPLE.NOMATCH2,DISP=OLD //SYSOUT DD SYSOUT=* //SYSIN DD * JOINKEYS F1=MAIN,FIELDS=(1,4,A) JOINKEYS F2=LOOKUP,FIELDS=(1,4,A) JOIN UNPAIRED,F1,F2 REFORMAT FIELDS=(?,F1:1,4,F2:1,4) OPTION COPY OUTFIL FNAMES=MATCH,INCLUDE=(1,1,CH,EQ,C'B'),BUILD=(1:2,4) OUTFIL FNAMES=NOMATCH1,INCLUDE=(1,1,CH,EQ,C'1'),BUILD=(1:2,4) OUTFIL FNAMES=NOMATCH2,INCLUDE=(1,1,CH,EQ,C'2'),BUILD=(1:2,4) /*
-
JOINKEYS указывает поле, в котором сравниваются два файла.
-
РЕФОРМАТИЧЕСКИЕ ПОЛЯ =? помещает ‘B’ (сопоставленные записи), ‘1’ (присутствует в файле1, но не в файле2) или ‘2’ (присутствует в файле2, но не в файле1) в 1-ю позицию выходного BUILD.
-
JOIN UNPAIRED выполняет полное внешнее соединение двух файлов.
JOINKEYS указывает поле, в котором сравниваются два файла.
РЕФОРМАТИЧЕСКИЕ ПОЛЯ =? помещает ‘B’ (сопоставленные записи), ‘1’ (присутствует в файле1, но не в файле2) или ‘2’ (присутствует в файле2, но не в файле1) в 1-ю позицию выходного BUILD.
JOIN UNPAIRED выполняет полное внешнее соединение двух файлов.
Выход будет:
MATCH File 1000 1003 NOMATCH1 File 1001 1005 NOMATCH2 File 1002
Та же функциональность может быть достигнута и с помощью ICETOOL.