В п. 5.1.1 мы определили задание (job) как внешнюю единицу работы z/OS.
Это означает, что пользователь может запросить у системы выполнение
какой-либо работы (конечно, связанной с запуском определенных
приложений) с помощью специальным образом записанного и переданного
Все множество заданий в z/OS может быть представлено в виде трех групп:
SUBMIT или через
сетевые интерфейсы.START и MOUNT
и получившие название запускаемые процедуры (started task);LOGON и предназначенные для поддержки диалога
с пользователем.Задания, поступающие в систему от различных источников, образуют поток заданий, обрабатываемый специальным системным компонентом JES.
При выполнении STC и TSU заданий z/OS создает отдельные адресные пространства для каждой запускаемой процедуры и каждого пользовательского сеанса TSO. Для пакетных заданий новые адресные пространства не создаются, поскольку их выполнение производится в системных адресных пространствах программ-инициаторов, входящих в состав JES.
Каждое задание характеризуется набором атрибутов, среди которых необходимо выделить:
Имя задания - имя, присваиваемое заданию пользователем (для пакетных заданий) или формируемое автоматически (для STC/TSU-заданий). Идентификатор задания - уникальный код (номер) задания, устанавливаемый системой при вводе задания. Именно по идентификатору система отличает одно задание от другого.
Класс задания устанавливает принадлежность задания к определенной
группе в зависимости от формы запуска,
Приоритет задания (число в диапазоне 0-15) служит для определения очередности выполнения заданий. Обычно приоритет устанавливается системой автоматически на основе текущих атрибутов задания и может динамически изменяться в зависимости от времени ожидания в очереди. Наивысшему приоритету соответствует значение 15.
С каждым заданием система ассоциирует два специальных набора данных: SYSIN и SYSOUT. Входной набор данных SYSIN отражает исходные данные, используемые приложениями задания. Эти данные могут быть представлены непосредственно в тексте задания (в этом случае говорят, что исходные данные размещаются во входном потоке ) или содержаться в указанных наборах данных и/или устройствах. Выходной набор данных SYSOUT служит для размещения системных сообщений, а также сообщений и результатов работы, выполняемых в рамках задания программ. Система предоставляет возможность просмотреть и распечатать SYSOUT, который иногда называют отчетом или листингом задания.
Задания, поступающие в систему от различных источников, принимаются и
обрабатываются специальным компонентом z/OS, который называется подсистемой управления заданиями JES
(рис 5.19) Назначение подсистемы управления заданиямиНа рис. 5.20 представлена схема, иллюстрирующая основные этапы обработки заданий после того, как они направлены в подсистему JES2 .
(рис 5.20) Этапы обработки заданийНа этапе ввода (entry START, , команды TSO/E и SUBMIT. Существует возможность формировать и направлять задания на
обработку из ранее запущенных программ и заданий. Поддерживается
возможность удаленного
Спул используется для временного хранения данных, связанных с выполнением каждого поступившего в подсистему JES2 задания, и содержит:
На этапе ввода осуществляется регистрация задания, заключающаяся в присваивании заданию уникального идентификатора (JobID) и занесении учетной и статусной информации в специальный реестр JES2, получивший название очередь заданий (JOBQUEUE). Помимо идентификатора, JOBQUEUE содержит также значения класса, приоритета и текущего состояния задания. Фактически все множество очередей, представленных на рисунке, хранится в одной общей таблице JOBQUEUE. В этом случае выборка заданий производится по значению кода текущего состояния, показывающего, на каком этапе обработки задание находится в данный момент.
Все зарегистрированные задания поступают затем в очередь на следующий этап обработки.
На этапе преобразования (JCLLIB.
Если ошибки не обнаружены,
На этапе выполнения (
Отметим, что в z/OS поддерживается два типа инициаторов: инициаторы JES и инициаторы WLM. Инициаторы JES2 обычно запускаются автоматически при инициализации системы в соответствии с настройками JES2 и назначаются на обслуживание определенных классов заданий. Инициаторы WLM запускаются динамически в зависимости от текущей нагрузки системы и в соответствии с установленной политикой управления нагрузкой в целевом режиме.
Важно подчеркнуть, что для большинства заданий не создаются новые адресные пространства z/OS, поскольку их выполнение происходит в адресных пространствах инициаторов. Исключение составляют задания классов STC и TSU, которые не обрабатываются инициаторами. Для этих классов JES2 самостоятельно создает отдельные адресные пространства для каждого пользовательского сеанса TSO и каждой запускаемой процедуры, а также обрабатывает поступающие сообщения.
На этапе вывода (output SYSOUT оператора DD или оператора OUTPUT либо
назначается подсистемой JES2 по умолчанию. Классы служат для
группирования заданий с целью использования общих ограничений по выводу
отчетов и для целей управления, но никак не связаны с используемыми для
вывода устройствами. Подготовленные отчеты направляются в очередь на
стадию печати или задерживаются на этапе вывода, если для задания
установлен статус
На этапе печати (hardcopy
На этапе завершения (
Следует напомнить, что в z/OS существует специальный опциональный компонент SDSF, предназначенный для просмотра параметров текущего состояния всех запущенных в системе заданий и отчетов о выполнении, а также предоставляющий возможность изменять некоторые параметры и управлять ходом выполнения заданий динамически.
Итак, прежде чем передать пакетное задание системе, пользователь должен
подготовить его текст на языке RECFM=FB и LRECL=80. Текст
задания вводится, как правило, прописными буквами.
Задание состоит из последовательности управляющих предложений
//ИМЯ ОПЕРАТОР ОПЕРАНДЫ КОММЕНТАРИЙ
В первых двух позициях всегда (или почти всегда) указываются две косые
черты (знак слэш / ), которые являются главным отличительным признаком
предложений
Поле имя начинается с третьей позиции и служит для идентификации
представленного в предложении оператора. Фактически это метка, на
которую можно ссылаться из различных предложений задания или других
заданий. Имя может содержать не более восьми символов, включающих
латинские буквы, цифры и специальные знаки ( $ # @ ). Имя должно
начинаться с буквы или специального знака, русские буквы и пробелы
использовать нельзя. В некоторых специальных случаях применяют
составные имена, использующие в качестве разделителя точку. Пробел в
третьей позиции является признаком отсутствия имени.
Примеры правильных имен: STOUT1, SYSPRINT, IVANOV, IVAN#S
Примеры неправильных имен: 3DIAGNOZ (начинается с цифры), DIAGNOSTIKA
(содержит более восьми символов), ТОМ+И (содержит недопустимый символ И ).
Вслед за полем имени следуют другие поля, отделяемые друг от друга одним или несколькими пробелами.
| Оператор | Назначение оператора |
|---|---|
JOB |
Начало задания и режим выполнения задания |
EXEC |
Начало шага задания, указание выполняемой программы или процедуры |
DD |
Описание набора данных и используемых устройств |
COMMAND |
Ввод системной (консольной) команды |
|
Начало процедуры и описание параметров процедуры |
|
Конец процедуры |
JCLLIB |
Список библиотек для поиска процедур, указанных в задании |
OUTPUT |
Параметры формирования отчета о выполнении задания (SYSOUT) |
INCLUDE |
Имя раздела библиотеки, текст которого необходимо включить в указанное место задания |
CNTL/ENDCNTL |
Начало и конец блока управляющих параметров, передаваемых программе во входном потоке |
IF/THEN/ELSE/ENDIF |
Условное выполнение шагов задания (ветвление) |
SET |
Инициализация или изменение значений символических параметров |
/* |
Оператор ограничения данных, представленных во входном потоке |
// |
Пустой оператор (конец задания) |
//* |
Оператор комментария |
Поле оператор определяет тип управляющего оператора JOB, EXEC, DD ) будет
рассмотрено в данной главе.
Поле операнды предложения
Позиционные параметры часто имеют произвольный формат записи, но всегда указываются в строгой последовательности и всегда перед ключевыми параметрами. Если позиционный параметр опускается, то запятая, которая должна следовать за параметром, остается (исключение составляет случай, когда опускается последний параметр в списке позиционных параметров). Примеры записи позиционных параметров:
333,TEST,,0.8E-15 NEW,,DELETE
Ключевые параметры задаются с использованием предопределенных ключевых
слов в виде: ключевое_слово=значение. Например, CLASS=B, REGION=100M, . Последовательность записи ключевых параметров -
произвольная.
Отдельные параметры могут включать подпараметры, которые также задают в виде списка, заключенного в апострофы или круглые скобки. Как и параметры, подпараметры могут быть позиционными и ключевыми. Скобки или апострофы опускаются, если в списке указывается один подпараметр. Например:
DISP=(NEW,,DELETE) - позиционные подпараметры параметра DISP
DCB=(RECFM=FB,LRECL=80) - ключевые подпараметры параметра DCB
В поле комментарий предложения //*. Этот текст не обрабатывается при
выполнении задания.
Поля предложений //* ) разрешается продолжить на следующей. При
этом если необходимо перенести на следующую строку некоторые параметры
из списка, то следует соблюдать такие правила:
//.
Продолжить ввод списка параметров, начиная не ранее 4-й, но не позднее
16-й позиции строки.Вот как выглядит запись многострочного предложения
//OUT DD UNIT=SYSDA,VOL=SER=UB1, // DISP=NEW,SPACE=(1000(5,4)), // DSN=TEMP1
Исключением из этого правила является ситуация, когда перенос требует "разорвать" параметр, заключенный в апострофы. В этом случае следует вводить текст предложения до 71-й позиции включительно, а продолжение располагать точно с 16-й позиции следующей строки.
Структуру задания в z/OS схематично можно представить в виде
последовательности операторов (рис. 5.21). Первым всегда указывается
оператор задания JOB, который отмечает начало задания. Непосредственно
за оператором JOB могут следовать другие операторы ( DD, JCLLIB, OUTPUT ), с помощью которых описывают общие ресурсы задания в целом
(наборы данных, библиотеки процедур, параметры вывода результатов).
(рис 5.21) Структура заданияПоследующие операторы задания группируются по шагам или пунктам. Шаг
(пункт) задания (job step) - это последовательность операторов EXEC и включающая некоторое количество иных
операторов (в основном DD ). Оператор EXEC (его называют иногда
оператором шага задания) устанавливает, какую программу (загрузочный
модуль) или процедуру DD
в шаге задания описывают наборы данных и/или устройства, используемые
при выполнении указанной в операторе EXEC программы (процедуры). Шаги
задания выполняются строго последовательно. Однако есть возможность
пропуска (невыполнения) некоторых шагов в зависимости от результатов
работы предыдущих шагов с помощью операторов IF/THEN/ELSE или параметра операторов JOB и EXEC. Общее количество шагов задания не может
превышать 255, включая шаги всех вызываемых в задании процедур.
Далее приводится обзор основных операторов
| используется для указания альтернативных значений, из
которых следует выбрать одно.Нужно отметить, что язык
Оператор задания JOB всегда располагается в начале задания и служит для
определения основных пользовательских атрибутов задания, таких как
класс, приоритет, время выполнения и др. Последовательность символов,
указанная в поле имени предложения JOB, рассматривается как имя задания
и должна присутствовать в обязательном порядке. Кроме того, в операторе JOB может быть определена учетная информация, параметры безопасности и
производительности и некоторые другие.
Формат оператора JOB:
//имя JOB параметры
Позиционные параметры:
[(учетная информация)][,идентификатор программиста]
Ключевые параметры:
[,MSGLEVEL = (предложения,сообщения)]
[,CLASS = класс задания]
[,MSGCLASS = класс сообщений]
[,REGION = nK | nM]
[,ТIМЕ = (минуты, секунды)]
[,COND=((код_завершения,условие)[,(код_завершения,условие)])
Из общего количества ключевых параметров приведены только пять наиболее употребительных.
Учетная информация (до 142 символов) содержит сведения, используемые учетными программами ОС, с помощью которых подсчитываются используемое заданием машинное время и другие ресурсы. Если учетная информация задается списком значений, то этот список должен быть заключен в апострофы или круглые скобки.
Идентификатор программиста (до 20 символов) служит для идентификации пользователя, подготовившего задание. В качестве идентификатора можно указать фамилию и имя (инициалы) автора задания, номер отдела, в котором он работает, шифр темы, название организации и т.п. Если в идентификаторе используются русские буквы или пробелы, то его следует заключать в апострофы.
Варианты записи учетной информации и идентификатора программиста могут выглядеть так:
//PR1 JOB 5,'ИВАНОВ И.Л.' //PR2 JOB (5,А1),'ПЕТРОВ В.А.' //PR3 JOB 'T801,378',BOB //PR4 JOB ,'сидоров' //PR5 JOB 840,PETROV //PR6 JOB ,'KOBZON I.D.'
Параметр MSGLEVEL (уровень полноты сообщений) определяет, какую
информацию необходимо выдать в отчет о выполнении задания, и имеет
следующий формат:
MSGLEVEL=(a,b)
Подпараметр a может принимать три значения: 0, 1 и 2. Если программист
указал цифру 0, то в отчет выводится только оператор JOB. Значение 2
указывает, что требуется вывод всех операторов задания и операторов
JECL, а цифра 1 определяет, что нужно выводить не только все операторы
задания, но и операторы вызываемых процедур после замены в них
символических параметров фактическими значениями.
Подпараметр b может принимать два значения: 0 и 1. Значение 1
предписывает всегда выводить в отчет связанные с выполнением задания
сообщения, инициируемые оператором, интерпретатором MSGLEVEL опущен, то по умолчанию принимаются значения, установленные в
настройках JES. Примеры:
//GOD JOB ,,MSGLEVEL=(1,1) //ST JOB I,STUPIN,MSGLEVEL=2 //ST JOB ,JOHN,MSGLEVEL=(,1)
Во втором примере подпараметр b, а в третьем - подпараметр a будут
установлены по умолчанию.
Параметр CLASS (класс) относит задание к определенному классу
выполнения заданий и задается символами A-Z, 0-9. Если класс не указан,
то принимается значение, установленное в настройках JES в зависимости
от источника задания.
Пример:
//U01A JOB 21,TOMA,CLASS=В
Параметр MSGCLASS (класс сообщений) определяет выходной класс для
системных сообщений, формируемых в процессе выполнения задания. Класс
задается символами A-Z, 0-9. Параметр MSGCLASS дает возможность
выводить все системные сообщения и выходные наборы данных, формируемые
в шагах задания, в один и тот же класс или в разные классы. Такое
разделение иногда может оказаться полезным.
Пример. Предусмотреть вывод всех управляющих операторов задания и сообщений отдельно от выходных наборов данных:
//U JOB (5.1),'ПЕТР',MSGLEVEL=(1,1),CLASS=B,MSGCLASS=С //STl EXEC PGM=PRINT //OUT DD SYSOUT=A
Здесь для выполнения задания предусмотрен класс В, для вывода
результатов шага задания (параметр SYSOUT оператора DD ) - класс А, а
для вывода системных сообщений - класс С.
Параметр REGION (область) задает максимальный размер области
виртуальной памяти в пользовательском регионе, которую необходимо
выделить для выполнения каждого шага задания. Параметр REGION задается
в виде:
REGION=nК | nМ
где n - целочисленное значение, определяющее число килобайт (K) или
мегабайт (M) виртуальной памяти. Например, если указать REGION = 900К,
то шагам задания будет отводиться по 900 килобайт. Максимальное
значение параметра в килобайтах - 2 096 128, в мегабайтах - 2047.
Значение 0К или 0М означает, что задание требует в свое распоряжение
всю REGION в операторе JOB опущен, то используется значение, указанное в
операторах EXEC. Если и в этих операторах он не задан, то принимается
стандартное значение, заданное в настройках JES. Отметим, что с помощью
параметра ADDRSPC, указываемого дополнительно, можно потребовать
выделить для задания с помощью параметра REGION область реальной памяти
( ADDRSPC=REAL ).
Параметр TIME (время) устанавливает максимальную продолжительность
выполнения задания и имеет формат:
ТIМЕ=(мин,сек)|мин|1440|NOLIMIT
Время указывается в минутах и секундах либо только в минутах. Если
секунды не указаны, можно не использовать скобки. Например, запись TIME = 30
означает, что заданию требуется выделить 30 минут процессорного
времени. Число минут может быть не более 1440 (т.е. 24 часа), а секунд
- не более 60. Если по истечении времени, указанного в TIME, задание не
завершило работы, то система либо принудительно завершает задание, либо
использует средства специальной обработки "просроченных" заданий. По
умолчанию, когда параметр TIME не задан, ограничение на выполнение
задания определяется настройками JES. Если в параметре TIME указать
число 1440 или слово NOLIMIT, то время выполнения задания считается
неограниченным.
Варианты описания времени выполнения задания:
//PRIMER1 JOB ,,TIME=10 //PRIMER2 JOB ,,TIME =(10,30) //PRIMER3 JOB ,,TIME =(,30)
Задание PRIMER1 выполняется не более 10 мин, задание PRIMER2 - не более 10 мин и 30 с, а задание PRIMER3 - 30 с.
Параметр (от condition - условие) задает условия, при которых
следует прекратить выполнение задания, если полученный на каком-либо
шаге результат не устраивает пользователя. Для управления выполнением
шагов задания используют коды завершения.
0 - при обработке программы ошибок не обнаружено (успешное выполнение);
4 - обнаружены несущественные ошибки, выдается предупреждающее сообщение, но выполнение программы было продолжено;
8 - обнаружены ошибки, которые могут привести к невозможности выполнения задания (выдается сообщение об ошибках);
12 - обнаружены серьезные ошибки, дальнейшая обработка программы невозможна (выдается сообщение о серьезной ошибке);
16 - обнаружены ошибки, которые делают невозможным выполнение программы (выполнение программы прекращается).
Используется следующий формат записи параметра :
COND=((код_завершения,условие)[,(код_завершения,условие)_])
Допустимое значение подпараметра код_завершения указывается в виде
целого числа в диапазоне от 0 до 4095. Подпараметр условие задает
условие проверки кода завершения мнемоническим отношением вида: GT -
больше, чем, GE - больше или равно, EQ - равно, LT - меньше, чем, LE -
меньше или равно, NE - не равно.
Если заданное отношение к EXEC, не соблюдается, то выполнение
задания прекращается. Внешние скобки можно опустить, если задано только
одно условие. Условие, задаваемое параметром , проверяется перед
выполнением каждого шага задания следующим образом: если код возврата,
полученный на одном из предыдущих шагов, соответствует условию, то
выполнение задания прекращается. Например, запись
предписывает прекратить выполнение задания, если окажется, что код
завершения одного из шагов не равен нулю. В записи указано,
что если 4 меньше полученного кода завершения, то шаги задания не
выполняются. Условие предписывает, что если 50
больше или равно
Если параметр опущен, то проверка кода возврата не производится.
Оператор выполнения EXEC (его также называют оператором шага задания)
служит для указания программы или процедуры EXEC, но их
может быть и несколько.
Формат оператора EXEC:
//[имя_шага_задания] EXEC позиционный параметр
[,ключевые параметры]
Позиционный параметр:
PGM = имя_программы | *.имя_шага.имя_DD
[PROC=]имя_процедуры
Ключевые параметры:
[,PARM = (значение, значение,...)]
[,REGION = nК | nM]
[,ТIМЕ = (мин,сек)]
[,COND=((код_завершения,условие[,имя_шага]),...,[EVEN|ONLY])]
...
Напомним: как и ранее, квадратные скобки означают, что параметр
необязателен. Таким образом, единственным обязательным параметром
оператора EXEC является позиционный параметр, задающий выполняемую
программу (через ключевое слово PGM ) или процедуру (через ключевое
слово или без него), остальные параметры необязательны.
Необязательно и имя шага задания, однако при его отсутствии могут
возникнуть трудности анализа сообщений системы (неясно, к какому шагу
задания они относятся), а также невозможно будет сделать ссылку на
данный шаг задания.
Параметр PGM определяет программу, которая должна быть выполнена в
данном шаге задания. Например:
//EXEPRIM1 EXEC PGM=MYPROG
Вызываемая программа задается по имени раздела библиотечного набора
данных, содержащего соответствующий загрузочный модуль. z/OS
устанавливает определенный порядок поиска загрузочных модулей. По
умолчанию поиск ведется в системных библиотеках загрузочных модулей,
список которых определен в разделе LNKLST реестра SYS1.PARMLIB. Первой
в этом списке обычно стоит библиотека SYS1.LINKLIB. В системных
библиотеках находятся наиболее часто используемые программы общего
назначения. Однако можно настроить задание на выборку загрузочных
модулей из личных библиотек - библиотечных наборов данных, в которых
хранятся программы пользователей. Личные библиотеки должны быть явно
описаны в задании с помощью операторов DD с зарезервированными для этой
цели именами JOBLIB или STEPLIB. Рассмотрим пример:
//JOBA1 JOB (A21,DEP3,007),,CLASS=C //JOBLIB DD DSN=USERLIB1,DISP=SHR //STEP1 EXEC PGM=PRG1 //STEP2 EXEC PGM=PGM2 //STEPLIB DD DSN=USERLIB2,DISP=SHR
В задании определены две личные библиотеки: библиотека задания USERLIB1, описанная с помощью оператора DD с именем JOBLIB, и
библиотека шага задания USERLIB2, описанная с помощью оператора DD с
именем STEPLIB. В этом случае поиск программы PRG1 будет производиться
в следующем порядке: USERLIB1, библиотеки списка LNKLST, а поиск
программы PRG2 - сначала USERLIB2 (так как именно в этом шаге описана
данная библиотека), затем USERLIB1 и, наконец, библиотеки LNKLST.
Если позиционный параметр описан как PGM=*.имя_шага.имя_DD, то
программа вызывается из библиотеки загрузочных модулей, описанной в
одном из предыдущих шагов задания. Здесь имя_DD - это имя оператора DD,
в котором описывается библиотека загрузочных модулей, имя_шага
указывает шаг задания, в котором находится упомянутый оператор DD. В
приведенном ниже примере в шаге ST2 будет выполнена программа,
загрузочный модуль которой хранится в разделе CALC библиотеки MYLIB,
как указывает ссылка *.ST1.DSPROG:
//ST1 EXEC PGM=MYPROG //DSPROG DD DSNAME=MYLIB(CALC),DISP=SHR //ST2 EXEC PGM=*.ST1.DSPROG
Второй формат позиционного параметра оператора EXEC с использованием
ключевого слова или без него служит для выполнения процедуры в
шаге задания. Процедура представляет собой последовательность
операторов
Рассмотрим EXEC при вызове программ
(загрузочных модулей). При вызове процедур формат параметров несколько
меняется, о чем будет сказано дополнительно.
Параметр PARM служит для передачи программе, выполняемой в шаге
задания, определенной управляющей информации или исходных данных. Эта
информация передается в виде текстовой строки длиной не более 100
символов, которая обычно включает ряд значений (подпараметров),
разделенных запятыми. Если через PARM передается список значений, то
весь список должен заключаться в апострофы или круглые скобки. Приведем
примеры различных вариантов определения параметра PARM:
//STEP1 EXEC PGM=PR1,PARM=12 //STEP2 EXEC PGM=PR1,PARM=LOAD
//STEP3 EXEC PGM=PR1,PARM=(LIST,NODECK) //STEP4 EXEC PGM=LOADER,PARM ='MAP,SIZE=150K' //PR1 EXEC PROC=РЕЗ,PARM='2000,YES'
Подпараметры, содержащие специальные знаки (например, русский текст,
знак + и т. п.), следует заключать в апострофы или круглые скобки. Если
апостроф встречается в подпараметре, то он повторяется дважды, например PARM = 'О''К!'. Информация, заключенная в апострофы, должна умещаться
на одной строке, а заключенная в скобки может быть перенесена на другую
строку.
Параметры REGION и TIME аналогичны параметрам оператора JOB с той лишь
разницей, что в EXEC они определяют размер области виртуальной памяти и
время выполнения для шага задания. Параметр TIME оператора JOB имеет
преимущество перед параметром TIME оператора EXEC: если время,
указанное параметром TIME оператора EXEC, превосходит время,
установленное параметром TIME оператора JOB, то значение параметра TIME
оператора EXEC игнорируется. Параметр REGION в операторе EXEC также
игнорируется, если задан параметр REGION в операторе JOB. Примеры:
//SI EXEC PGM=A,REGION=40K //INT1 EXEC PGM=PR1,TIME=5 //INT2 EXEC PGM=PR1,TIME=(,45)
Параметр определяет условия для обхода шага задания. Он указывает,
что возможность выполнения шага задания зависит от полученных значений
несколько отличается от аналогичного параметра оператора JOB:
COND = ((код_завершения,условие[,имя_шага])... [,EVEN|,ONLY])
Здесь наряду с подпараметрами код_завершения и условие, можно указывать
имя одного из предыдущих шагов задания, по коду завершения которого
будет вестись проверка ( имя_шага ). Если имя_шага не указано, условие
будет проверяться для всех предыдущих шагов. Подпараметры EVEN и ONLY
следует использовать, когда выполнение текущего шага требуется
поставить в зависимость от наличия в задании аварийно завершенных шагов
(для таких шагов EVEN
требует выполнять текущий шаг, даже если один из предыдущих шагов
завершился аварийно, ONLY - только если один из предыдущих шагов
завершился аварийно.
Параметр может содержать до восьми условий, включая EVEN и ONLY.
Шаг задания не будет выполнен, если соблюдается хотя бы одно из
заданных условий. Рассмотрим ряд примеров:
//ST3 EXEC PGM=PROG3,COND=(8,GT,ST1)
//ST6 EXEC PGM=AP,COND=((8,LE,ST1),(8,LE,ST2))
//ST9 EXEC PGM=AP,COND=((16,GE),(90,LE,ST2),ONLY)
//ST7 EXEC PGM=AP,COND=((9,LT,ST5),EVEN)
Оператор описания данных DD (DD, относящиеся к определенному шагу задания, следуют
за оператором EXEC этого шага задания. В одном шаге задания может быть
описано не более 3273 операторов DD. Оператор DD может располагаться
также за оператором JOB, если требуется описать наборы данных, общие
для всего задания (например, библиотеки загрузочных модулей и др.).
Оператор DD может содержать один позиционный и около 60 ключевых
параметров. Познакомимся с некоторыми наиболее важными из них, исключив
из рассмотрения параметры, используемые для описания
Формат оператора DD:
//имя DD [позиционный параметр][,ключевые параметры]
Позиционный параметр:
* | DATA | DUMMY
Ключевые параметры:
[,DSN[AME] = имя_набора_данных]
[,DCB = (список подпараметров)]
[,UNIT = устройство]
[,VOL[UME] =(список подпараметров)]
[,SPACE = (список подпараметров)]
[,DISP = (список подпараметров)]
[,SYSOUT = (список подпараметров)]
[,LABEL = (список подпараметров)]
...
Важнейшим атрибутом оператора DD является имя, связывающее описываемый
набор данных с кодом вызываемой программы. Как отмечалось в п.5.1.3, в
программе для каждого используемого набора данных с помощью макровызова DCB устанавливается так называемое dd-имя (ddname). Если в шаге задания
указать оператор DD с таким же именем, то появляется возможность
определить или изменить ряд параметров указанного набора данных через
оператор DD задания, то есть в момент запуска программы. Таким образом,
при выполнении любой программы пользователь должен в первую очередь
выяснить, какие dd-имена следует применять для описания данных и
устройств, необходимых для ее работы. Это можно сделать с помощью
соответствующей документации и руководств. Например, для
программы-компилятора языка ассемблера установлены следующие dd-имена:
SYSIN - для описания исходного модуля;
SYSPRINT - для вывода сообщений компилятора;
SYSLIN - для описания объектного модуля;
SYSUT1 - промежуточный набор данных.
Некоторые имена операторов DD зарезервированы системой для специальных
целей. К ним относятся, например, следующие имена:
JOBLIB - для описания личной библиотеки загрузочных модулей, доступной
заданию;
STEPLIB - для описания личной библиотеки загрузочных модулей, доступной
для шага задания;
SYSABEND - для выходного набора данных, в который может быть записан
SYSUDUMP - для выходного набора данных, в который может быть записан
SYSCHK - для выходного набора данных контрольной точки;
SYSIN - для входного набора данных ввода заданий;
SYSPRINT - для набора данных, выводимого на
При использовании процедур могут применяться составные имена операторов DD, о чем речь пойдет немного ниже.
Только в одном случае у оператора DD может отсутствовать имя: при
описании сцепленных наборов данных, рассматриваемых системой как единый
набор данных:
//SCHETA DD ... // DD ... // DD ...
Система требует, чтобы у таких наборов данных были согласованы основные характеристики логических записей, такие как формат, длина и размер блока.
В DD посредством ссылки на значение
этого же параметра другого оператора DD. В общем виде ссылку можно
представить в следующих форматах:
*.имя_DD
или
*.имя_шага_задания.имя_DD
Первый формат используется при ссылке внутри шага задания, а второй формат применяется при ссылке на один из предшествующих шагов задания. Например:
//PR JOB SECT //ST1 EXEC PGM=SUN1 //UT1 DD DSNAME=LIB1,DCB=(RECFM=FB,LRECL=80,BLKSIZE=400) //UT2 DD DSNAME=LIB2,DCB=*.UT1 //ST2 EXEC PGM=SUN2 //GO DD DSNAME=LIB3,DCB=*.ST1.UT1
Теперь рассмотрим позиционный параметр оператора DD, который может
принимать одно из трех взаимоисключающих значений:
* | DATA | DUMMY
Первое значение (*) служит для описания данных, размещаемых во входном
потоке, то есть непосредственно в тексте задания вслед за оператором DD. Данные могут занимать одну или несколько строк задания и
завершаться ограничительным оператором /*. В некоторых случаях
ограничительный оператор может быть опущен. Признаком конца набора
данных является в этом случае первый встретившийся управляющий оператор
// в первых двух позициях строки.
Пример:
//SYSIN DD * 1 ИВАНОВ 12345 7.9 2 ПЕТРОВ 67890 3.8 3 СИДОРОВ 73452 9.0 /*
Если же входные данные включают управляющие операторы //, то необходимо вместо *
использовать параметр DATA. В приведенном ниже примере в качестве
входных данных определены две строки, содержащие предложения JOB и EXEC:
//MYJCL DD DATA //USER1A JOB ,BOB,MSGLEVEL=1 //ST1 EXEC IEFBR14 /*
Если во вводимых во входном потоке данных должны содержаться строки,
начинающиеся с символов /*, то в этом случае можно определить другой
ограничитель с помощью параметра . В частности, при компиляции C/C++
приложений можно использовать этот прием следующим образом:
//PR JOB SECT //ST1 EXEC PGM=CCNDRVR //COMPILE DD *,DLM=<> # include <stdio.h> /*комментарий*/ main(); ... <>
Здесь двухсимвольное значение <> в первых двух позициях строки служит
для ограничения входного набора данных подобно /*.
Следует обратить внимание, что по умолчанию JES принимает для вводимого
таким образом набора данных значения LRECL=BLKSIZE=80.
Значение позиционного параметра применяется, чтобы объявить
некоторый набор данных как фиктивный. В этом случае система не
производит никаких действий над набором данных. Например, предложение
//SYSPRINT DD DUMMY
обеспечивает подавление вывода сообщений, направляемых программой в
набор данных с dd-именем SYSPRINT.
Рассмотрим DD.
Параметр DSNAME (допускается сокращенная запись ) определяет имя
набора данных (простое или составное), например:
//BIBL DD DSNAME=LIB1 //SYSIN DD DSN=D.USER1.DATA
Для указания раздела библиотеки в скобках записывают имя раздела:
//LOAD DD DSN=USERLIB(PROG1) //XXX DD DSN=MY.JCL(JOBTEST)
Перед именем временного набора данных записывают два знака амперсанда :
//SYSLIN DD DSN=LOADSET(GO) //SYSUT1 DD DSN=SYSUT1
Временные наборы данных автоматически уничтожаются системой после
завершения шага задания. Отсутствие в операторе DD параметра DSNAME
также означает, что набор данных временный. В этом случае имя набора
данных будет сгенерировано автоматически, например, так:
SYSxxxxx.Txxxxxx.RA000.jobname.Rxxxxxx
где x - определенным образом сформированные цифры и символы.
В качестве значения параметра DSNAME можно указывать ссылки на другие
операторы DD в формате *.имя_DD или *.имя_шага.имя_DD.
//STFG EXEC PGM=PROG1 //SYSUT1 DD DSN=DATA.IN ... //SYSLIN DD DSN=*.STFG.SYSUT1
Параметр DISP (диспозиция) определяет исходное состояние набора данных,
а также действия, которые необходимо произвести с набором данных после
завершения шага задания или всего задания: сохранить, уничтожить,
каталогизировать и др. Формат записи параметра DISP включает три
позиционных подпараметра:
DISP=([статус][,дисп_НЗ][,дисп_АЗ])
где статус - исходное (текущее) состояние набора данных, дисп_НЗ -
действие при нормальном завершении шага задания, дисп_АЗ - действие,
которое надлежит выполнить при аварийном завершении шага задания.
Подпараметр статус может принимать следующие значения:
NEW - в указанном шаге задания создается новый набор данных;
OLD - набор данных существует (создан ранее);
SHR - набор данных существует и может быть использован одновременно
другим заданием, т.е. разделяется различными заданиями в режиме чтения;
MOD - набор данных существует и будет модифицироваться в указанном шаге
задания (используется только для последовательных наборов данных).
Подпараметры диспозиции дисп_НЗ и дисп_АЗ могут принимать следующие
значения:
DELETE - набор данных следует уничтожить;
KEEP - набор данных следует сохранить;
CATLG - набор данных следует сохранить и каталогизировать;
UNCATLG - набор данных нужно сохранить, но при этом исключить из
системного каталога.
PASS - набор данных следует передать для использования в последующем
шаге того же задания.
Последнее значение ( PASS ) может быть использовано только для
подпараметра дисп_НЗ.
Примеры задания диспозиции:
DISP=(NEW,KEEP,DELETE) - набор данных создается и будет сохранен при
нормальном завершении и удален при аварийном завершении шага задания;DISP=(SHR,KEEP,UNCATLG) - набор данных существует и будет сохранен
при нормальном завершении и исключен из каталога при аварийном
завершении шага задания.Допускается не указывать некоторые или даже все подпараметры, учитывая следующие правила формирования их значений по умолчанию:
статус ), то принимается значение NEW ;дисп_НЗ ), то принимается значение DELETE для нового и KEEP для существующего набора данных;дисп_АЗ ), то принимается значение,
заданное для второго подпараметра ( дисп_НЗ );DISP, то принимаются значения (NEW,DELETE,DELETE), то есть набор данных создается и уничтожается во
время выполнения шага задания (временный).Примеры:
DISP=(NEW,KEEP) и DISP=(,KEEP) соответствует DISP=(NEW,KEEP,KEEP)
DISP=NEW и DISP=(NEW,,DELETE) соответствует
DISP=(NEW,DELETE,DELETE)
DISP=OLD соответствует DISP=(OLD,KEEP,KEEP)
DISP=(OLD,,DELETE) соответствует DISP=(OLD,KEEP,DELETE)
DISP=(SHR,,KEEP) соответствует DISP=(SHR,KEEP,KEEP)
Параметр UNIT назначает набору данных устройство ввода-вывода и
определяется в большинстве случаев одним из трех значений (см. п.
5.1.3):
UNIT=адрес | типовое_имя | групповое_имя
Подпараметр адрес задает трех- или четырехразрядный физический адрес
устройства (в шестнадцатеричном представлении). Подпараметр типовое_имя
задает устройство по установленному производителем оборудования номеру
модели, однозначно указывающему на тип устройства. Подпараметр групповое_имя определяет устройство через логическое имя устройства или
группы устройств, задаваемое системным программистом на этапе
конфигурирования оборудования с помощью компонента HCD в таблице UNIT различными способами:
//AD DD UNIT=220 - адрес устройства //TD DD UNIT=3390 - типовое имя //GD DD UNIT=SYSDA - групповое имя //GD DD UNIT=VIO - набор данных в виртуальной памяти
Параметр VOLUME (сокращенно VOL ) указывает том или тома, на которых
размещается набор данных. Рассмотрим наиболее употребительные варианты
использования данного параметра.
В первом варианте том определяется посредством задания серийного имени тома в виде:
VOL=SER=имя[,имя]...
Например:
//DSETl DD DSN=YS,UNIT=SYSDA,VOL=SER=PTOM01
Здесь описан набор данных YS, находящийся на устройстве, принадлежащем
к группе SYSDA с серийным номером тома PTOM01. Для многотомных наборов
данных следует указывать список имен.
Во втором варианте том задается через ссылку, определяемую одним из трех способов:
VOL=REF=имя_набора_данных | *.имя_DD |.имя шага.имя_DD
В первом способе будет выбран том, на котором размещен ранее описанный в задании каталогизированный набор данных. Второй и третий способы используют стандартный формат ссылок. Рассмотрим пример:
//STEP1 EXEC PGM=.... //DD1 DD DSN=OLD.DATASET,DISP=SHR //DD2 DD DSN=DSET1,DISP=(,CATLG,DELETE),VOL=REF=*.DD1 //STEP2 EXEC PGM=... //DD3 DD DSN=DSET2,DISP=(,CATLG),VOL=REF=*.STEP1.DD1
Здесь создаваемые наборы данных DSET1 и DSET2 будут размещены на том же
томе, что и существующий набор данных с именем OLD..
Параметр DCB устанавливает характеристики логической организации набора
данных, фиксируемые в блоке управления данными (Data DD. Параметр DCB обычно имеет формат:
DCB=(список подпараметров)
Все подпараметры DCB являются ключевыми. Перечислим основные из них:
DSORG - тип организации набора данных;RECFM - формат записей;LRECL - длина логической записи;BLKSIZE - BUFNO - число буферов ввода-вывода, выделяемых набору данных;BUFL - размер каждого буфера в байтах.Подпараметр RECFM может принимать следующие значения: F - записи
фиксированной длины; V - записи переменной длины; U - записи
неопределенной длины. Выбор В. Например, указание RECFM=FB означает, что
сблокированные записи имеют фиксированную длину.
Примеры:
DCB=(RECFM=FB,LRECL=128,BLKSIZE=512)
DCB=(BLKSIZE=80,RECFM=F)
Вместо ключевых подпараметров DCB можно записать ссылку на другой
оператор DD, причем некоторые подпараметры можно переопределить заново:
//ST1 DD DSN=VAX,DCB=(RECFM=VB,LRECL=64,BLKSIZE=640) //PRINT DD DCB=(*.ST1,BLKSIZE=128)
Здесь подпараметры набора данных для параметра DCB копируются из
оператора DD с именем ST1, кроме размера блока, который задается
непосредственно.
Параметр SPACE задает требуемый объем памяти для размещения
создаваемого набора данных на жестком диске, то есть набора данных с
диспозицией NEW. Обычно этот параметр записывают в виде:
SPACE=(размер[,(количество[,приращение][,оглавление])][,RLSE])
Подпараметр количество указывает, сколько размер задает размер или тип
одного блока и может принимать одно из следующих значений:
TRK - блок соответствует физической дорожке диска;
- блок соответствует цилиндру диска;
число - определяет значение размера блока в байтах.
Так, параметр SPACE=( определяет область дисковой памяти
размером 10 цилиндров, а параметр SPACE=(800,30) объявляет, что
требуется память объемом в 30 блоков по 800 байт каждый. Если указанный
объем не может быть выделен (диск переполнен), система завершает шаг
задания аварийно.
В том случае когда первоначального объема памяти недостаточно для
размещения данных, система может выделить дополнительные блоки памяти,
количество которых определяется подпараметром приращение. Установлено,
что система может выделять дополнительные блоки не более 15 раз. Так,
параметр SPACE=( запрашивает первоначально 40 цилиндров, а
если этого объема памяти будет недостаточно, то система будет выделять
по пять цилиндров до 15 раз, т. е. при необходимости всего будет
выделено 40+5*15=115 цилиндров. Если приращение не указано, то
дополнительные блоки не выделяются.
Параметр оглавление задается только для наборов данных с библиотечной
организацией. Он определяет необходимое количество блоков, отводимых
под оглавление библиотечного набора данных. Один блок оглавления
содержит 256 байт. Так, например, параметр SPACE=(TRK,(100,10,5))
запрашивает память в 100 дорожек и по 10 дополнительных дорожек (до 15
раз), а также пять блоков по 256 байт оглавления библиотечного набора
данных. Отсутствие подпараметра оглавление обычно косвенно указывает на
набор данных с последовательной организацией.
Очевидно, что не всегда удается точно предсказать требуемый для набора
данных объем внешней памяти. Подпараметр RLSE служит для освобождения
памяти, выделенной, но не использованной под размещение данных.
Освобождение свободной памяти производится при закрытии набора данных.
Так, параметр SPACE=(TRK,(40,,8),RLSE) указывает, что запрашивается 40
дорожек без приращения. Для оглавления выделяется восемь блоков.
Незанятая память после закрытия набора данных освобождается.
Параметр LABEL чаще всего используется для описания набора данных на
магнитной ленте. В нем могут быть указаны порядковый номер набора
данных на МЛ, тип метки, срок хранения набора данных, пароль. Наиболее
употребительный формат параметра:
LABEL=([номер][,формат][PASSWORD][,IN|,OUT])
Подпараметр номер задает последовательный номер набора данных на
ленточном томе. Значения 0 или 1 указывают на первый по порядку набор
данных. Для каталогизированных наборов данных, а также наборов данных,
передаваемых из предыдущего шага задания (DISP=,PASS), номер можно не
указывать.
Подпараметр формат указывает используемый стандарт форматирования
ленточного тома (тип меток наборов данных). Возможны следующие значения
формата:
- стандартный формат IBM (используется по умолчанию, можно не
указывать);
SUL - указывает, где набор данных имеет стандартные метки и метки
пользователя;
AL - используется формат ISO/ANSI;
NSL - набор данных имеет нестандартные метки;
NL - набор данных не имеет меток;
- необходимо обойти обработку метки набора данных.
Подпараметр, задаваемый ключевым словом PASSWORD, требует при изменении
набора данных, чтобы пользователь ввел правильный пароль, используя
консоль или терминал TSO.
Ключевые слова IN и OUT указывают, что набор данных обрабатывается для
ввода или вывода соответственно.
В приводимом ниже примере открывается для чтения 5-й набор данных,
имеющий нестандартные метки, на ленточном томе TAPE01:
//DD1 DD DSNAME=NAB1,UNIT=TAPE01, // VOL=SER=MT1,LABEL=(5,NSL,,IN)
Параметр SYSOUT идентифицирует набор данных как системный выходной
набор данных. Наиболее употребительная форма для записи параметра:
SYSOUT=(выходной_класс[,имя_прог])
Чаще всего подпараметр выходной_класс определяет имя выходного класса
для описываемого набора данных в виде символа А-Z или 0-9. Атрибуты
выходных классов определяются при настройке JES. Если в качестве
значения выходного класса указана звездочка (*), это означает, что
следует использовать то же значение, что у параметра MSGCLASS,
определенное в операторе ,) в позиции данного
подпараметра задает так называемый "пустой" класс, означающий, что
основные атрибуты вывода будут определены в операторе задания OUTPUT,
ссылка на который должна быть указана далее с помощью параметра OUTPUT.
Подпараметр имя_прог позволяет указать
Кроме указанных подпараметров, параметр SYSOUT может использовать
подпараметры, управляющие форматированием выходного набора данных при
выводе на печать (выбор шрифта, межстрочный интервал, размеры полей,
количество копий и т.п.)
Примеры использования параметра SYSOUT:
B://SYSPRINT DD SYSOUT=B
MSGCLASS://YSl JOB ,,MSGCLASS=A //ST1 EXEC PGM=ZARPLATA //DD1 DD SYSOUT=*
OUTPUT://OUT1 OUTPUT BURST=Y,CHARS=(GT12),COPIES=3 ... //DS DD SYSOUT=(,),OUTPUT=*.OUT1
INTRDR://SYSUT2 DD SYSOUT=(X,INTRDR)
Итак, мы рассмотрели небольшую часть из общего числа параметров
оператора DD, однако наиболее важную с точки зрения практического
использования. Рассмотрим ряд примеров описания наборов данных при
решении некоторых типовых задач .
DSN и DISP, поскольку остальную
необходимую информацию о размещении набора данных система получит из
каталога, например://CATDS1 DD DSN=AS30.MY.DSET,DISP=OLD //CATDS2 DD DSN=LIB.DATA(CHAR),DISP=SHR
UNIT и VOLUME,
например://NOCATDS DD DSNAME=AS30.MY.DSET,DISP=OLD, // VOL=SER=D01457,UNIT=3390
DCB и SPACE. В приводимом ниже примере
создается библиотечный набор данных со 120-байтными записями
фиксированной длины на выделенном пространстве внешней памяти размером
10 цилиндров с приращением в три цилиндра. На оглавление отводится два
блока по 256 байт, при завершении шага задания неиспользуемая память
будет освобождена, а набор данных сохранен.//NEWDS DD DSNAME=D.AS32.DATA,DISP=(NEW,KEEP), // VOL=SER=BIBLIO,UNIT=3380, // DCB=(RECFM=F,LRECL=120), // SPACE=(CYL,(10,3,2),RLSE)
В
Процедура представляет собой последовательность предложений
(операторов)
При обращении к процедуре входящие в ее состав операторы EXEC. При этом могут
быть изменены значения параметров операторов процедуры, целые
операторы, а также добавлены новые операторы.
В JCLLIB (о нем речь пойдет ниже). Процедуры во входном
потоке описываются непосредственно в задании после оператора JOB.
Процедура начинается оператором процедуры и заканчивается
оператором конца процедуры . Имя оператора процедуры является
именем процедуры при размещении ее во входном потоке. В операторе
могут быть описаны параметры процедуры. Процедуры могут содержать
различные операторы EXEC, DD, OUTPUT, IF/THEN/ELSE, INCLUDE, CNTL, ENDCNTL, SET, а также вызовы других процедур. Процедуры
не должны содержать операторы DD * и DD DATA, оператор //JOBLIB DD,
операторы JES и описания других процедур (операторы и ).
Каждый оператор EXEC вместе с принадлежащими ему операторами DD
называется шагом (пунктом) процедуры. Имя оператора EXEC является
именем шага процедуры. В общем виде процедура имеет следующую
структуру:
//имя PROC параметры // EXEC // DD ... // EXEC // DD ... // PEND
В имя, и могут быть указаны в процедуре
в качестве параметра, подпараметра или значения в любом операторе.
Фактические значения для символических параметров устанавливаются в
вызывающем процедуру операторе EXEC, в виде списка, каждый элемент
которого выглядит так:
имя=фактическое_значение
Рассмотрим пример некоторой абстрактной процедуры, на котором будут показаны особенности построения и использования процедур:
//MYPROC PROC UNT=SYSDA,PRN=A,TOM=DISK8,P=P2,NAME=DS.OPT //ST1 EXEC PGM=SUV,REGION=50K //LIB DD DSN=SYSLIB,DISP=OLD //SYSIN DD DSN=NAME,DISP=(NEW,KEEP), // VOL=SER=TOM,UNIT=UNT, // SPACE=(TRK,(10,1,10)) //SYSOUT DD SYSOUT=PRN //ST2 EXEC PGM=CALC,PARM=(P1,P,P3) //TABL DD DSN=TABL.DATA,DISP=SHR // VOL=SER=WORK1,UNIT=DISK // PEND
Данная процедура с именем MYPROC содержит два шага ( ST1 и ST2 ). В теле
процедуры выделено пять формальных параметров. В операторе
представлен список фактических стандартных значений формальных
параметров, которые будут использоваться по умолчанию в случае, если
пользователь не определит собственные фактические значения. Например,
если процедура будет вызвана в задании следующим образом:
//PRIM1 EXEC MYPROC
то это как раз такой случай: все значения формальных параметров будут
выбраны из оператора .
Если же пользователь захочет изменить все или некоторые стандартные
значения, их необходимо указать непосредственно в операторе EXEC:
//PRIM2 EXEC MYPROC,NAME=BIBL,UNT=3390
В данном случае устанавливаются новые значения для формальных
параметров NAME и UNT, а остальные параметры примут стандартные
значения, записанные в операторе . При изменении значений
параметров пользователь обязан следить, чтобы модифицированная таким
образом процедура была корректной как синтаксически, так и
семантически. Очевидно, что значения символических параметров,
назначенных пользователем в операторе EXEC, действуют только в текущем
шаге задания. На другие шаги задания их действие не распространяется, и
там могут быть установлены другие значения.
Наряду с использованием символических параметров, существует
возможность модифицировать целиком или частично операторы процедуры EXEC и DD. Например, модификация параметров операторов EXEC может
производиться следующим образом:
//PRIM3 EXEC MYPROC,REGION.ST1=100K,COND.ST2=(8,LE,ST1)
Здесь пользователь требует изменить значение параметра REGION,
используемого в шаге процедуры ST1, и добавить параметр к
оператору шага ST2. Синтаксис записи
Модификация параметров операторов DD осуществляется несколько иначе.
Например, при необходимости изменить имя и диспозицию набора данных,
описанного в операторе DD с именем LIB шага ST1, и отказаться от
определения параметров в VOL и UNIT операторе DD с именем TABL шага ST2, при вызове процедуры следует записать:
//PRIM4 EXEC MYPROC,NAME=XXXXX.YY,P=P5 //ST1.LIB DD DSN=USERLIB,DISP=SHR //ST2.TABL DD DSN=TABL1.DATA,VOL=,UNIT=
Обратите внимание, что имена модифицирующих DD операторов задания
записываются как составные: сначала указывается имя шага процедуры,
затем, после разделительной точки, имя модифицируемого оператора DD
процедуры.
Точно таким же образом может производиться добавление в процедуру новых
операторов DD:
//PRIM5 EXEC MYPROC,PRN=* //ST2.SYSPRINT DD SYSOUT=A
Здесь к шагу ST2 процедуры будет добавлен оператор DD с именем SYSPRINT. Таким способом можно обойти ограничение на использование в
DD * и DD DATA.
Значительную роль в работе пользователей z/OS играют имеющиеся в
системе каталогизированные процедуры. Как уже отмечалось, обычно
существует несколько стандартных библиотек процедур (самая известная
среди них - SYS1.PROCLIB ), определяемых системным программистом в
настройках подсистемы JES2. Библиотеки содержат множество готовых
процедур, предназначенных для решения типовых задач пользователей и
администраторов, включая процедуры поддержки разработки приложений
(компиляция, редактирование связей и выполнение программ), процедуры
запуска и настройки системных компонентов, процедуры управления данными
и т.п.
Для вызова таких процедур в задании необходимо указать имя
каталогизированной процедуры и при необходимости ! Отметим также, что
каталогизированные процедуры могут вызываться по команде оператора START, при этом порождаются запускаемые процедуры (STC-задания), о
которых упоминалось ранее. Примеры применения некоторых
каталогизированных процедур при разработке приложений будут рассмотрены
в п. 5.1.8.
Помимо системных библиотек процедур, доступных пользователям по
умолчанию, существует возможность создания и использования личных
библиотек процедур. В этом случае потребуется сообщить системе имена
таких библиотек с помощью оператора JCLLIB. Данный оператор имеет
единственный параметр ORDER, с помощью которого можно задать список
личных библиотек, используемых в задании:
ORDER=(библиотека1[,библиотека2]...)
В приведенном ниже примере определен список из двух библиотек
( USER1.PROCLIB,USER1.WORKLIB ), которые система будет использовать для
поиска процедуры SMETA в первую очередь. Если поиск завершится
неудачей, будут просматриваться системные библиотеки:
//USER1 J0B ... //USERLIB JCLLIB ORDER=(USER1.PROCLIB,USER1.WORKLIB) // EXEC PROC=SMETA
Как отмечалось ранее, все сообщения и результаты работы программ, выполняемых в рамках задания, группируются JES2 в наборе данных SYSOUT. На основе этих данных формируется отчет о выполненном задании. У пользователя есть несколько способов получить и вывести отчет, используя средства TSO/E, ISPF/PDF или SDSF. На рис. 5.22 представлен общий вид отчета (листинга) о выполнении задания.
(рис 5.22) Пример отчета о выполненном заданииСтандартный листинг состоит из нескольких информационных блоков:
MSGLEVEL и сообщения о синтаксических ошибках.Основным признаком правильности выполнения задания является значение кода завершения (Condition code), отображаемое в блоке 4 листинга в виде:
СOND CODE = XXXX
Если ABEND ). Каждому значению кода завершения соответствует определенная
причина, а в отчете содержатся поясняющие
В п. 5.1.1 мы определили задание (job) как внешнюю единицу работы z/OS.
Это означает, что пользователь может запросить у системы выполнение
какой-либо работы (конечно, связанной с запуском определенных
приложений) с помощью специальным образом записанного и переданного
Все множество заданий в z/OS может быть представлено в виде трех групп:
SUBMIT или через
сетевые интерфейсы.START и MOUNT
и получившие название запускаемые процедуры (started task);LOGON и предназначенные для поддержки диалога
с пользователем.Задания, поступающие в систему от различных источников, образуют поток заданий, обрабатываемый специальным системным компонентом JES.
При выполнении STC и TSU заданий z/OS создает отдельные адресные пространства для каждой запускаемой процедуры и каждого пользовательского сеанса TSO. Для пакетных заданий новые адресные пространства не создаются, поскольку их выполнение производится в системных адресных пространствах программ-инициаторов, входящих в состав JES.
Каждое задание характеризуется набором атрибутов, среди которых необходимо выделить:
Имя задания - имя, присваиваемое заданию пользователем (для пакетных заданий) или формируемое автоматически (для STC/TSU-заданий). Идентификатор задания - уникальный код (номер) задания, устанавливаемый системой при вводе задания. Именно по идентификатору система отличает одно задание от другого.
Класс задания устанавливает принадлежность задания к определенной
группе в зависимости от формы запуска,
Приоритет задания (число в диапазоне 0-15) служит для определения очередности выполнения заданий. Обычно приоритет устанавливается системой автоматически на основе текущих атрибутов задания и может динамически изменяться в зависимости от времени ожидания в очереди. Наивысшему приоритету соответствует значение 15.
С каждым заданием система ассоциирует два специальных набора данных: SYSIN и SYSOUT. Входной набор данных SYSIN отражает исходные данные, используемые приложениями задания. Эти данные могут быть представлены непосредственно в тексте задания (в этом случае говорят, что исходные данные размещаются во входном потоке ) или содержаться в указанных наборах данных и/или устройствах. Выходной набор данных SYSOUT служит для размещения системных сообщений, а также сообщений и результатов работы, выполняемых в рамках задания программ. Система предоставляет возможность просмотреть и распечатать SYSOUT, который иногда называют отчетом или листингом задания.
Задания, поступающие в систему от различных источников, принимаются и
обрабатываются специальным компонентом z/OS, который называется подсистемой управления заданиями JES
(рис 5.19) Назначение подсистемы управления заданиямиНа рис. 5.20 представлена схема, иллюстрирующая основные этапы обработки заданий после того, как они направлены в подсистему JES2 .
(рис 5.20) Этапы обработки заданийНа этапе ввода (entry START, , команды TSO/E и SUBMIT. Существует возможность формировать и направлять задания на
обработку из ранее запущенных программ и заданий. Поддерживается
возможность удаленного
Спул используется для временного хранения данных, связанных с выполнением каждого поступившего в подсистему JES2 задания, и содержит:
На этапе ввода осуществляется регистрация задания, заключающаяся в присваивании заданию уникального идентификатора (JobID) и занесении учетной и статусной информации в специальный реестр JES2, получивший название очередь заданий (JOBQUEUE). Помимо идентификатора, JOBQUEUE содержит также значения класса, приоритета и текущего состояния задания. Фактически все множество очередей, представленных на рисунке, хранится в одной общей таблице JOBQUEUE. В этом случае выборка заданий производится по значению кода текущего состояния, показывающего, на каком этапе обработки задание находится в данный момент.
Все зарегистрированные задания поступают затем в очередь на следующий этап обработки.
На этапе преобразования (JCLLIB.
Если ошибки не обнаружены,
На этапе выполнения (
Отметим, что в z/OS поддерживается два типа инициаторов: инициаторы JES и инициаторы WLM. Инициаторы JES2 обычно запускаются автоматически при инициализации системы в соответствии с настройками JES2 и назначаются на обслуживание определенных классов заданий. Инициаторы WLM запускаются динамически в зависимости от текущей нагрузки системы и в соответствии с установленной политикой управления нагрузкой в целевом режиме.
Важно подчеркнуть, что для большинства заданий не создаются новые адресные пространства z/OS, поскольку их выполнение происходит в адресных пространствах инициаторов. Исключение составляют задания классов STC и TSU, которые не обрабатываются инициаторами. Для этих классов JES2 самостоятельно создает отдельные адресные пространства для каждого пользовательского сеанса TSO и каждой запускаемой процедуры, а также обрабатывает поступающие сообщения.
На этапе вывода (output SYSOUT оператора DD или оператора OUTPUT либо
назначается подсистемой JES2 по умолчанию. Классы служат для
группирования заданий с целью использования общих ограничений по выводу
отчетов и для целей управления, но никак не связаны с используемыми для
вывода устройствами. Подготовленные отчеты направляются в очередь на
стадию печати или задерживаются на этапе вывода, если для задания
установлен статус
На этапе печати (hardcopy
На этапе завершения (
Следует напомнить, что в z/OS существует специальный опциональный компонент SDSF, предназначенный для просмотра параметров текущего состояния всех запущенных в системе заданий и отчетов о выполнении, а также предоставляющий возможность изменять некоторые параметры и управлять ходом выполнения заданий динамически.
Итак, прежде чем передать пакетное задание системе, пользователь должен
подготовить его текст на языке RECFM=FB и LRECL=80. Текст
задания вводится, как правило, прописными буквами.
Задание состоит из последовательности управляющих предложений
//ИМЯ ОПЕРАТОР ОПЕРАНДЫ КОММЕНТАРИЙ
В первых двух позициях всегда (или почти всегда) указываются две косые
черты (знак слэш / ), которые являются главным отличительным признаком
предложений
Поле имя начинается с третьей позиции и служит для идентификации
представленного в предложении оператора. Фактически это метка, на
которую можно ссылаться из различных предложений задания или других
заданий. Имя может содержать не более восьми символов, включающих
латинские буквы, цифры и специальные знаки ( $ # @ ). Имя должно
начинаться с буквы или специального знака, русские буквы и пробелы
использовать нельзя. В некоторых специальных случаях применяют
составные имена, использующие в качестве разделителя точку. Пробел в
третьей позиции является признаком отсутствия имени.
Примеры правильных имен: STOUT1, SYSPRINT, IVANOV, IVAN#S
Примеры неправильных имен: 3DIAGNOZ (начинается с цифры), DIAGNOSTIKA
(содержит более восьми символов), ТОМ+И (содержит недопустимый символ И ).
Вслед за полем имени следуют другие поля, отделяемые друг от друга одним или несколькими пробелами.
| Оператор | Назначение оператора |
|---|---|
JOB |
Начало задания и режим выполнения задания |
EXEC |
Начало шага задания, указание выполняемой программы или процедуры |
DD |
Описание набора данных и используемых устройств |
COMMAND |
Ввод системной (консольной) команды |
|
Начало процедуры и описание параметров процедуры |
|
Конец процедуры |
JCLLIB |
Список библиотек для поиска процедур, указанных в задании |
OUTPUT |
Параметры формирования отчета о выполнении задания (SYSOUT) |
INCLUDE |
Имя раздела библиотеки, текст которого необходимо включить в указанное место задания |
CNTL/ENDCNTL |
Начало и конец блока управляющих параметров, передаваемых программе во входном потоке |
IF/THEN/ELSE/ENDIF |
Условное выполнение шагов задания (ветвление) |
SET |
Инициализация или изменение значений символических параметров |
/* |
Оператор ограничения данных, представленных во входном потоке |
// |
Пустой оператор (конец задания) |
//* |
Оператор комментария |
Поле оператор определяет тип управляющего оператора JOB, EXEC, DD ) будет
рассмотрено в данной главе.
Поле операнды предложения
Позиционные параметры часто имеют произвольный формат записи, но всегда указываются в строгой последовательности и всегда перед ключевыми параметрами. Если позиционный параметр опускается, то запятая, которая должна следовать за параметром, остается (исключение составляет случай, когда опускается последний параметр в списке позиционных параметров). Примеры записи позиционных параметров:
333,TEST,,0.8E-15 NEW,,DELETE
Ключевые параметры задаются с использованием предопределенных ключевых
слов в виде: ключевое_слово=значение. Например, CLASS=B, REGION=100M, . Последовательность записи ключевых параметров -
произвольная.
Отдельные параметры могут включать подпараметры, которые также задают в виде списка, заключенного в апострофы или круглые скобки. Как и параметры, подпараметры могут быть позиционными и ключевыми. Скобки или апострофы опускаются, если в списке указывается один подпараметр. Например:
DISP=(NEW,,DELETE) - позиционные подпараметры параметра DISP
DCB=(RECFM=FB,LRECL=80) - ключевые подпараметры параметра DCB
В поле комментарий предложения //*. Этот текст не обрабатывается при
выполнении задания.
Поля предложений //* ) разрешается продолжить на следующей. При
этом если необходимо перенести на следующую строку некоторые параметры
из списка, то следует соблюдать такие правила:
//.
Продолжить ввод списка параметров, начиная не ранее 4-й, но не позднее
16-й позиции строки.Вот как выглядит запись многострочного предложения
//OUT DD UNIT=SYSDA,VOL=SER=UB1, // DISP=NEW,SPACE=(1000(5,4)), // DSN=TEMP1
Исключением из этого правила является ситуация, когда перенос требует "разорвать" параметр, заключенный в апострофы. В этом случае следует вводить текст предложения до 71-й позиции включительно, а продолжение располагать точно с 16-й позиции следующей строки.
Структуру задания в z/OS схематично можно представить в виде
последовательности операторов (рис. 5.21). Первым всегда указывается
оператор задания JOB, который отмечает начало задания. Непосредственно
за оператором JOB могут следовать другие операторы ( DD, JCLLIB, OUTPUT ), с помощью которых описывают общие ресурсы задания в целом
(наборы данных, библиотеки процедур, параметры вывода результатов).
(рис 5.21) Структура заданияПоследующие операторы задания группируются по шагам или пунктам. Шаг
(пункт) задания (job step) - это последовательность операторов EXEC и включающая некоторое количество иных
операторов (в основном DD ). Оператор EXEC (его называют иногда
оператором шага задания) устанавливает, какую программу (загрузочный
модуль) или процедуру DD
в шаге задания описывают наборы данных и/или устройства, используемые
при выполнении указанной в операторе EXEC программы (процедуры). Шаги
задания выполняются строго последовательно. Однако есть возможность
пропуска (невыполнения) некоторых шагов в зависимости от результатов
работы предыдущих шагов с помощью операторов IF/THEN/ELSE или параметра операторов JOB и EXEC. Общее количество шагов задания не может
превышать 255, включая шаги всех вызываемых в задании процедур.
Далее приводится обзор основных операторов
| используется для указания альтернативных значений, из
которых следует выбрать одно.Нужно отметить, что язык
Оператор задания JOB всегда располагается в начале задания и служит для
определения основных пользовательских атрибутов задания, таких как
класс, приоритет, время выполнения и др. Последовательность символов,
указанная в поле имени предложения JOB, рассматривается как имя задания
и должна присутствовать в обязательном порядке. Кроме того, в операторе JOB может быть определена учетная информация, параметры безопасности и
производительности и некоторые другие.
Формат оператора JOB:
//имя JOB параметры
Позиционные параметры:
[(учетная информация)][,идентификатор программиста]
Ключевые параметры:
[,MSGLEVEL = (предложения,сообщения)]
[,CLASS = класс задания]
[,MSGCLASS = класс сообщений]
[,REGION = nK | nM]
[,ТIМЕ = (минуты, секунды)]
[,COND=((код_завершения,условие)[,(код_завершения,условие)])
Из общего количества ключевых параметров приведены только пять наиболее употребительных.
Учетная информация (до 142 символов) содержит сведения, используемые учетными программами ОС, с помощью которых подсчитываются используемое заданием машинное время и другие ресурсы. Если учетная информация задается списком значений, то этот список должен быть заключен в апострофы или круглые скобки.
Идентификатор программиста (до 20 символов) служит для идентификации пользователя, подготовившего задание. В качестве идентификатора можно указать фамилию и имя (инициалы) автора задания, номер отдела, в котором он работает, шифр темы, название организации и т.п. Если в идентификаторе используются русские буквы или пробелы, то его следует заключать в апострофы.
Варианты записи учетной информации и идентификатора программиста могут выглядеть так:
//PR1 JOB 5,'ИВАНОВ И.Л.' //PR2 JOB (5,А1),'ПЕТРОВ В.А.' //PR3 JOB 'T801,378',BOB //PR4 JOB ,'сидоров' //PR5 JOB 840,PETROV //PR6 JOB ,'KOBZON I.D.'
Параметр MSGLEVEL (уровень полноты сообщений) определяет, какую
информацию необходимо выдать в отчет о выполнении задания, и имеет
следующий формат:
MSGLEVEL=(a,b)
Подпараметр a может принимать три значения: 0, 1 и 2. Если программист
указал цифру 0, то в отчет выводится только оператор JOB. Значение 2
указывает, что требуется вывод всех операторов задания и операторов
JECL, а цифра 1 определяет, что нужно выводить не только все операторы
задания, но и операторы вызываемых процедур после замены в них
символических параметров фактическими значениями.
Подпараметр b может принимать два значения: 0 и 1. Значение 1
предписывает всегда выводить в отчет связанные с выполнением задания
сообщения, инициируемые оператором, интерпретатором MSGLEVEL опущен, то по умолчанию принимаются значения, установленные в
настройках JES. Примеры:
//GOD JOB ,,MSGLEVEL=(1,1) //ST JOB I,STUPIN,MSGLEVEL=2 //ST JOB ,JOHN,MSGLEVEL=(,1)
Во втором примере подпараметр b, а в третьем - подпараметр a будут
установлены по умолчанию.
Параметр CLASS (класс) относит задание к определенному классу
выполнения заданий и задается символами A-Z, 0-9. Если класс не указан,
то принимается значение, установленное в настройках JES в зависимости
от источника задания.
Пример:
//U01A JOB 21,TOMA,CLASS=В
Параметр MSGCLASS (класс сообщений) определяет выходной класс для
системных сообщений, формируемых в процессе выполнения задания. Класс
задается символами A-Z, 0-9. Параметр MSGCLASS дает возможность
выводить все системные сообщения и выходные наборы данных, формируемые
в шагах задания, в один и тот же класс или в разные классы. Такое
разделение иногда может оказаться полезным.
Пример. Предусмотреть вывод всех управляющих операторов задания и сообщений отдельно от выходных наборов данных:
//U JOB (5.1),'ПЕТР',MSGLEVEL=(1,1),CLASS=B,MSGCLASS=С //STl EXEC PGM=PRINT //OUT DD SYSOUT=A
Здесь для выполнения задания предусмотрен класс В, для вывода
результатов шага задания (параметр SYSOUT оператора DD ) - класс А, а
для вывода системных сообщений - класс С.
Параметр REGION (область) задает максимальный размер области
виртуальной памяти в пользовательском регионе, которую необходимо
выделить для выполнения каждого шага задания. Параметр REGION задается
в виде:
REGION=nК | nМ
где n - целочисленное значение, определяющее число килобайт (K) или
мегабайт (M) виртуальной памяти. Например, если указать REGION = 900К,
то шагам задания будет отводиться по 900 килобайт. Максимальное
значение параметра в килобайтах - 2 096 128, в мегабайтах - 2047.
Значение 0К или 0М означает, что задание требует в свое распоряжение
всю REGION в операторе JOB опущен, то используется значение, указанное в
операторах EXEC. Если и в этих операторах он не задан, то принимается
стандартное значение, заданное в настройках JES. Отметим, что с помощью
параметра ADDRSPC, указываемого дополнительно, можно потребовать
выделить для задания с помощью параметра REGION область реальной памяти
( ADDRSPC=REAL ).
Параметр TIME (время) устанавливает максимальную продолжительность
выполнения задания и имеет формат:
ТIМЕ=(мин,сек)|мин|1440|NOLIMIT
Время указывается в минутах и секундах либо только в минутах. Если
секунды не указаны, можно не использовать скобки. Например, запись TIME = 30
означает, что заданию требуется выделить 30 минут процессорного
времени. Число минут может быть не более 1440 (т.е. 24 часа), а секунд
- не более 60. Если по истечении времени, указанного в TIME, задание не
завершило работы, то система либо принудительно завершает задание, либо
использует средства специальной обработки "просроченных" заданий. По
умолчанию, когда параметр TIME не задан, ограничение на выполнение
задания определяется настройками JES. Если в параметре TIME указать
число 1440 или слово NOLIMIT, то время выполнения задания считается
неограниченным.
Варианты описания времени выполнения задания:
//PRIMER1 JOB ,,TIME=10 //PRIMER2 JOB ,,TIME =(10,30) //PRIMER3 JOB ,,TIME =(,30)
Задание PRIMER1 выполняется не более 10 мин, задание PRIMER2 - не более 10 мин и 30 с, а задание PRIMER3 - 30 с.
Параметр (от condition - условие) задает условия, при которых
следует прекратить выполнение задания, если полученный на каком-либо
шаге результат не устраивает пользователя. Для управления выполнением
шагов задания используют коды завершения.
0 - при обработке программы ошибок не обнаружено (успешное выполнение);
4 - обнаружены несущественные ошибки, выдается предупреждающее сообщение, но выполнение программы было продолжено;
8 - обнаружены ошибки, которые могут привести к невозможности выполнения задания (выдается сообщение об ошибках);
12 - обнаружены серьезные ошибки, дальнейшая обработка программы невозможна (выдается сообщение о серьезной ошибке);
16 - обнаружены ошибки, которые делают невозможным выполнение программы (выполнение программы прекращается).
Используется следующий формат записи параметра :
COND=((код_завершения,условие)[,(код_завершения,условие)_])
Допустимое значение подпараметра код_завершения указывается в виде
целого числа в диапазоне от 0 до 4095. Подпараметр условие задает
условие проверки кода завершения мнемоническим отношением вида: GT -
больше, чем, GE - больше или равно, EQ - равно, LT - меньше, чем, LE -
меньше или равно, NE - не равно.
Если заданное отношение к EXEC, не соблюдается, то выполнение
задания прекращается. Внешние скобки можно опустить, если задано только
одно условие. Условие, задаваемое параметром , проверяется перед
выполнением каждого шага задания следующим образом: если код возврата,
полученный на одном из предыдущих шагов, соответствует условию, то
выполнение задания прекращается. Например, запись
предписывает прекратить выполнение задания, если окажется, что код
завершения одного из шагов не равен нулю. В записи указано,
что если 4 меньше полученного кода завершения, то шаги задания не
выполняются. Условие предписывает, что если 50
больше или равно
Если параметр опущен, то проверка кода возврата не производится.
Оператор выполнения EXEC (его также называют оператором шага задания)
служит для указания программы или процедуры EXEC, но их
может быть и несколько.
Формат оператора EXEC:
//[имя_шага_задания] EXEC позиционный параметр
[,ключевые параметры]
Позиционный параметр:
PGM = имя_программы | *.имя_шага.имя_DD
[PROC=]имя_процедуры
Ключевые параметры:
[,PARM = (значение, значение,...)]
[,REGION = nК | nM]
[,ТIМЕ = (мин,сек)]
[,COND=((код_завершения,условие[,имя_шага]),...,[EVEN|ONLY])]
...
Напомним: как и ранее, квадратные скобки означают, что параметр
необязателен. Таким образом, единственным обязательным параметром
оператора EXEC является позиционный параметр, задающий выполняемую
программу (через ключевое слово PGM ) или процедуру (через ключевое
слово или без него), остальные параметры необязательны.
Необязательно и имя шага задания, однако при его отсутствии могут
возникнуть трудности анализа сообщений системы (неясно, к какому шагу
задания они относятся), а также невозможно будет сделать ссылку на
данный шаг задания.
Параметр PGM определяет программу, которая должна быть выполнена в
данном шаге задания. Например:
//EXEPRIM1 EXEC PGM=MYPROG
Вызываемая программа задается по имени раздела библиотечного набора
данных, содержащего соответствующий загрузочный модуль. z/OS
устанавливает определенный порядок поиска загрузочных модулей. По
умолчанию поиск ведется в системных библиотеках загрузочных модулей,
список которых определен в разделе LNKLST реестра SYS1.PARMLIB. Первой
в этом списке обычно стоит библиотека SYS1.LINKLIB. В системных
библиотеках находятся наиболее часто используемые программы общего
назначения. Однако можно настроить задание на выборку загрузочных
модулей из личных библиотек - библиотечных наборов данных, в которых
хранятся программы пользователей. Личные библиотеки должны быть явно
описаны в задании с помощью операторов DD с зарезервированными для этой
цели именами JOBLIB или STEPLIB. Рассмотрим пример:
//JOBA1 JOB (A21,DEP3,007),,CLASS=C //JOBLIB DD DSN=USERLIB1,DISP=SHR //STEP1 EXEC PGM=PRG1 //STEP2 EXEC PGM=PGM2 //STEPLIB DD DSN=USERLIB2,DISP=SHR
В задании определены две личные библиотеки: библиотека задания USERLIB1, описанная с помощью оператора DD с именем JOBLIB, и
библиотека шага задания USERLIB2, описанная с помощью оператора DD с
именем STEPLIB. В этом случае поиск программы PRG1 будет производиться
в следующем порядке: USERLIB1, библиотеки списка LNKLST, а поиск
программы PRG2 - сначала USERLIB2 (так как именно в этом шаге описана
данная библиотека), затем USERLIB1 и, наконец, библиотеки LNKLST.
Если позиционный параметр описан как PGM=*.имя_шага.имя_DD, то
программа вызывается из библиотеки загрузочных модулей, описанной в
одном из предыдущих шагов задания. Здесь имя_DD - это имя оператора DD,
в котором описывается библиотека загрузочных модулей, имя_шага
указывает шаг задания, в котором находится упомянутый оператор DD. В
приведенном ниже примере в шаге ST2 будет выполнена программа,
загрузочный модуль которой хранится в разделе CALC библиотеки MYLIB,
как указывает ссылка *.ST1.DSPROG:
//ST1 EXEC PGM=MYPROG //DSPROG DD DSNAME=MYLIB(CALC),DISP=SHR //ST2 EXEC PGM=*.ST1.DSPROG
Второй формат позиционного параметра оператора EXEC с использованием
ключевого слова или без него служит для выполнения процедуры в
шаге задания. Процедура представляет собой последовательность
операторов
Рассмотрим EXEC при вызове программ
(загрузочных модулей). При вызове процедур формат параметров несколько
меняется, о чем будет сказано дополнительно.
Параметр PARM служит для передачи программе, выполняемой в шаге
задания, определенной управляющей информации или исходных данных. Эта
информация передается в виде текстовой строки длиной не более 100
символов, которая обычно включает ряд значений (подпараметров),
разделенных запятыми. Если через PARM передается список значений, то
весь список должен заключаться в апострофы или круглые скобки. Приведем
примеры различных вариантов определения параметра PARM:
//STEP1 EXEC PGM=PR1,PARM=12 //STEP2 EXEC PGM=PR1,PARM=LOAD
//STEP3 EXEC PGM=PR1,PARM=(LIST,NODECK) //STEP4 EXEC PGM=LOADER,PARM ='MAP,SIZE=150K' //PR1 EXEC PROC=РЕЗ,PARM='2000,YES'
Подпараметры, содержащие специальные знаки (например, русский текст,
знак + и т. п.), следует заключать в апострофы или круглые скобки. Если
апостроф встречается в подпараметре, то он повторяется дважды, например PARM = 'О''К!'. Информация, заключенная в апострофы, должна умещаться
на одной строке, а заключенная в скобки может быть перенесена на другую
строку.
Параметры REGION и TIME аналогичны параметрам оператора JOB с той лишь
разницей, что в EXEC они определяют размер области виртуальной памяти и
время выполнения для шага задания. Параметр TIME оператора JOB имеет
преимущество перед параметром TIME оператора EXEC: если время,
указанное параметром TIME оператора EXEC, превосходит время,
установленное параметром TIME оператора JOB, то значение параметра TIME
оператора EXEC игнорируется. Параметр REGION в операторе EXEC также
игнорируется, если задан параметр REGION в операторе JOB. Примеры:
//SI EXEC PGM=A,REGION=40K //INT1 EXEC PGM=PR1,TIME=5 //INT2 EXEC PGM=PR1,TIME=(,45)
Параметр определяет условия для обхода шага задания. Он указывает,
что возможность выполнения шага задания зависит от полученных значений
несколько отличается от аналогичного параметра оператора JOB:
COND = ((код_завершения,условие[,имя_шага])... [,EVEN|,ONLY])
Здесь наряду с подпараметрами код_завершения и условие, можно указывать
имя одного из предыдущих шагов задания, по коду завершения которого
будет вестись проверка ( имя_шага ). Если имя_шага не указано, условие
будет проверяться для всех предыдущих шагов. Подпараметры EVEN и ONLY
следует использовать, когда выполнение текущего шага требуется
поставить в зависимость от наличия в задании аварийно завершенных шагов
(для таких шагов EVEN
требует выполнять текущий шаг, даже если один из предыдущих шагов
завершился аварийно, ONLY - только если один из предыдущих шагов
завершился аварийно.
Параметр может содержать до восьми условий, включая EVEN и ONLY.
Шаг задания не будет выполнен, если соблюдается хотя бы одно из
заданных условий. Рассмотрим ряд примеров:
//ST3 EXEC PGM=PROG3,COND=(8,GT,ST1)
//ST6 EXEC PGM=AP,COND=((8,LE,ST1),(8,LE,ST2))
//ST9 EXEC PGM=AP,COND=((16,GE),(90,LE,ST2),ONLY)
//ST7 EXEC PGM=AP,COND=((9,LT,ST5),EVEN)
Оператор описания данных DD (DD, относящиеся к определенному шагу задания, следуют
за оператором EXEC этого шага задания. В одном шаге задания может быть
описано не более 3273 операторов DD. Оператор DD может располагаться
также за оператором JOB, если требуется описать наборы данных, общие
для всего задания (например, библиотеки загрузочных модулей и др.).
Оператор DD может содержать один позиционный и около 60 ключевых
параметров. Познакомимся с некоторыми наиболее важными из них, исключив
из рассмотрения параметры, используемые для описания
Формат оператора DD:
//имя DD [позиционный параметр][,ключевые параметры]
Позиционный параметр:
* | DATA | DUMMY
Ключевые параметры:
[,DSN[AME] = имя_набора_данных]
[,DCB = (список подпараметров)]
[,UNIT = устройство]
[,VOL[UME] =(список подпараметров)]
[,SPACE = (список подпараметров)]
[,DISP = (список подпараметров)]
[,SYSOUT = (список подпараметров)]
[,LABEL = (список подпараметров)]
...
Важнейшим атрибутом оператора DD является имя, связывающее описываемый
набор данных с кодом вызываемой программы. Как отмечалось в п.5.1.3, в
программе для каждого используемого набора данных с помощью макровызова DCB устанавливается так называемое dd-имя (ddname). Если в шаге задания
указать оператор DD с таким же именем, то появляется возможность
определить или изменить ряд параметров указанного набора данных через
оператор DD задания, то есть в момент запуска программы. Таким образом,
при выполнении любой программы пользователь должен в первую очередь
выяснить, какие dd-имена следует применять для описания данных и
устройств, необходимых для ее работы. Это можно сделать с помощью
соответствующей документации и руководств. Например, для
программы-компилятора языка ассемблера установлены следующие dd-имена:
SYSIN - для описания исходного модуля;
SYSPRINT - для вывода сообщений компилятора;
SYSLIN - для описания объектного модуля;
SYSUT1 - промежуточный набор данных.
Некоторые имена операторов DD зарезервированы системой для специальных
целей. К ним относятся, например, следующие имена:
JOBLIB - для описания личной библиотеки загрузочных модулей, доступной
заданию;
STEPLIB - для описания личной библиотеки загрузочных модулей, доступной
для шага задания;
SYSABEND - для выходного набора данных, в который может быть записан
SYSUDUMP - для выходного набора данных, в который может быть записан
SYSCHK - для выходного набора данных контрольной точки;
SYSIN - для входного набора данных ввода заданий;
SYSPRINT - для набора данных, выводимого на
При использовании процедур могут применяться составные имена операторов DD, о чем речь пойдет немного ниже.
Только в одном случае у оператора DD может отсутствовать имя: при
описании сцепленных наборов данных, рассматриваемых системой как единый
набор данных:
//SCHETA DD ... // DD ... // DD ...
Система требует, чтобы у таких наборов данных были согласованы основные характеристики логических записей, такие как формат, длина и размер блока.
В DD посредством ссылки на значение
этого же параметра другого оператора DD. В общем виде ссылку можно
представить в следующих форматах:
*.имя_DD
или
*.имя_шага_задания.имя_DD
Первый формат используется при ссылке внутри шага задания, а второй формат применяется при ссылке на один из предшествующих шагов задания. Например:
//PR JOB SECT //ST1 EXEC PGM=SUN1 //UT1 DD DSNAME=LIB1,DCB=(RECFM=FB,LRECL=80,BLKSIZE=400) //UT2 DD DSNAME=LIB2,DCB=*.UT1 //ST2 EXEC PGM=SUN2 //GO DD DSNAME=LIB3,DCB=*.ST1.UT1
Теперь рассмотрим позиционный параметр оператора DD, который может
принимать одно из трех взаимоисключающих значений:
* | DATA | DUMMY
Первое значение (*) служит для описания данных, размещаемых во входном
потоке, то есть непосредственно в тексте задания вслед за оператором DD. Данные могут занимать одну или несколько строк задания и
завершаться ограничительным оператором /*. В некоторых случаях
ограничительный оператор может быть опущен. Признаком конца набора
данных является в этом случае первый встретившийся управляющий оператор
// в первых двух позициях строки.
Пример:
//SYSIN DD * 1 ИВАНОВ 12345 7.9 2 ПЕТРОВ 67890 3.8 3 СИДОРОВ 73452 9.0 /*
Если же входные данные включают управляющие операторы //, то необходимо вместо *
использовать параметр DATA. В приведенном ниже примере в качестве
входных данных определены две строки, содержащие предложения JOB и EXEC:
//MYJCL DD DATA //USER1A JOB ,BOB,MSGLEVEL=1 //ST1 EXEC IEFBR14 /*
Если во вводимых во входном потоке данных должны содержаться строки,
начинающиеся с символов /*, то в этом случае можно определить другой
ограничитель с помощью параметра . В частности, при компиляции C/C++
приложений можно использовать этот прием следующим образом:
//PR JOB SECT //ST1 EXEC PGM=CCNDRVR //COMPILE DD *,DLM=<> # include <stdio.h> /*комментарий*/ main(); ... <>
Здесь двухсимвольное значение <> в первых двух позициях строки служит
для ограничения входного набора данных подобно /*.
Следует обратить внимание, что по умолчанию JES принимает для вводимого
таким образом набора данных значения LRECL=BLKSIZE=80.
Значение позиционного параметра применяется, чтобы объявить
некоторый набор данных как фиктивный. В этом случае система не
производит никаких действий над набором данных. Например, предложение
//SYSPRINT DD DUMMY
обеспечивает подавление вывода сообщений, направляемых программой в
набор данных с dd-именем SYSPRINT.
Рассмотрим DD.
Параметр DSNAME (допускается сокращенная запись ) определяет имя
набора данных (простое или составное), например:
//BIBL DD DSNAME=LIB1 //SYSIN DD DSN=D.USER1.DATA
Для указания раздела библиотеки в скобках записывают имя раздела:
//LOAD DD DSN=USERLIB(PROG1) //XXX DD DSN=MY.JCL(JOBTEST)
Перед именем временного набора данных записывают два знака амперсанда :
//SYSLIN DD DSN=LOADSET(GO) //SYSUT1 DD DSN=SYSUT1
Временные наборы данных автоматически уничтожаются системой после
завершения шага задания. Отсутствие в операторе DD параметра DSNAME
также означает, что набор данных временный. В этом случае имя набора
данных будет сгенерировано автоматически, например, так:
SYSxxxxx.Txxxxxx.RA000.jobname.Rxxxxxx
где x - определенным образом сформированные цифры и символы.
В качестве значения параметра DSNAME можно указывать ссылки на другие
операторы DD в формате *.имя_DD или *.имя_шага.имя_DD.
//STFG EXEC PGM=PROG1 //SYSUT1 DD DSN=DATA.IN ... //SYSLIN DD DSN=*.STFG.SYSUT1
Параметр DISP (диспозиция) определяет исходное состояние набора данных,
а также действия, которые необходимо произвести с набором данных после
завершения шага задания или всего задания: сохранить, уничтожить,
каталогизировать и др. Формат записи параметра DISP включает три
позиционных подпараметра:
DISP=([статус][,дисп_НЗ][,дисп_АЗ])
где статус - исходное (текущее) состояние набора данных, дисп_НЗ -
действие при нормальном завершении шага задания, дисп_АЗ - действие,
которое надлежит выполнить при аварийном завершении шага задания.
Подпараметр статус может принимать следующие значения:
NEW - в указанном шаге задания создается новый набор данных;
OLD - набор данных существует (создан ранее);
SHR - набор данных существует и может быть использован одновременно
другим заданием, т.е. разделяется различными заданиями в режиме чтения;
MOD - набор данных существует и будет модифицироваться в указанном шаге
задания (используется только для последовательных наборов данных).
Подпараметры диспозиции дисп_НЗ и дисп_АЗ могут принимать следующие
значения:
DELETE - набор данных следует уничтожить;
KEEP - набор данных следует сохранить;
CATLG - набор данных следует сохранить и каталогизировать;
UNCATLG - набор данных нужно сохранить, но при этом исключить из
системного каталога.
PASS - набор данных следует передать для использования в последующем
шаге того же задания.
Последнее значение ( PASS ) может быть использовано только для
подпараметра дисп_НЗ.
Примеры задания диспозиции:
DISP=(NEW,KEEP,DELETE) - набор данных создается и будет сохранен при
нормальном завершении и удален при аварийном завершении шага задания;DISP=(SHR,KEEP,UNCATLG) - набор данных существует и будет сохранен
при нормальном завершении и исключен из каталога при аварийном
завершении шага задания.Допускается не указывать некоторые или даже все подпараметры, учитывая следующие правила формирования их значений по умолчанию:
статус ), то принимается значение NEW ;дисп_НЗ ), то принимается значение DELETE для нового и KEEP для существующего набора данных;дисп_АЗ ), то принимается значение,
заданное для второго подпараметра ( дисп_НЗ );DISP, то принимаются значения (NEW,DELETE,DELETE), то есть набор данных создается и уничтожается во
время выполнения шага задания (временный).Примеры:
DISP=(NEW,KEEP) и DISP=(,KEEP) соответствует DISP=(NEW,KEEP,KEEP)
DISP=NEW и DISP=(NEW,,DELETE) соответствует
DISP=(NEW,DELETE,DELETE)
DISP=OLD соответствует DISP=(OLD,KEEP,KEEP)
DISP=(OLD,,DELETE) соответствует DISP=(OLD,KEEP,DELETE)
DISP=(SHR,,KEEP) соответствует DISP=(SHR,KEEP,KEEP)
Параметр UNIT назначает набору данных устройство ввода-вывода и
определяется в большинстве случаев одним из трех значений (см. п.
5.1.3):
UNIT=адрес | типовое_имя | групповое_имя
Подпараметр адрес задает трех- или четырехразрядный физический адрес
устройства (в шестнадцатеричном представлении). Подпараметр типовое_имя
задает устройство по установленному производителем оборудования номеру
модели, однозначно указывающему на тип устройства. Подпараметр групповое_имя определяет устройство через логическое имя устройства или
группы устройств, задаваемое системным программистом на этапе
конфигурирования оборудования с помощью компонента HCD в таблице UNIT различными способами:
//AD DD UNIT=220 - адрес устройства //TD DD UNIT=3390 - типовое имя //GD DD UNIT=SYSDA - групповое имя //GD DD UNIT=VIO - набор данных в виртуальной памяти
Параметр VOLUME (сокращенно VOL ) указывает том или тома, на которых
размещается набор данных. Рассмотрим наиболее употребительные варианты
использования данного параметра.
В первом варианте том определяется посредством задания серийного имени тома в виде:
VOL=SER=имя[,имя]...
Например:
//DSETl DD DSN=YS,UNIT=SYSDA,VOL=SER=PTOM01
Здесь описан набор данных YS, находящийся на устройстве, принадлежащем
к группе SYSDA с серийным номером тома PTOM01. Для многотомных наборов
данных следует указывать список имен.
Во втором варианте том задается через ссылку, определяемую одним из трех способов:
VOL=REF=имя_набора_данных | *.имя_DD |.имя шага.имя_DD
В первом способе будет выбран том, на котором размещен ранее описанный в задании каталогизированный набор данных. Второй и третий способы используют стандартный формат ссылок. Рассмотрим пример:
//STEP1 EXEC PGM=.... //DD1 DD DSN=OLD.DATASET,DISP=SHR //DD2 DD DSN=DSET1,DISP=(,CATLG,DELETE),VOL=REF=*.DD1 //STEP2 EXEC PGM=... //DD3 DD DSN=DSET2,DISP=(,CATLG),VOL=REF=*.STEP1.DD1
Здесь создаваемые наборы данных DSET1 и DSET2 будут размещены на том же
томе, что и существующий набор данных с именем OLD..
Параметр DCB устанавливает характеристики логической организации набора
данных, фиксируемые в блоке управления данными (Data DD. Параметр DCB обычно имеет формат:
DCB=(список подпараметров)
Все подпараметры DCB являются ключевыми. Перечислим основные из них:
DSORG - тип организации набора данных;RECFM - формат записей;LRECL - длина логической записи;BLKSIZE - BUFNO - число буферов ввода-вывода, выделяемых набору данных;BUFL - размер каждого буфера в байтах.Подпараметр RECFM может принимать следующие значения: F - записи
фиксированной длины; V - записи переменной длины; U - записи
неопределенной длины. Выбор В. Например, указание RECFM=FB означает, что
сблокированные записи имеют фиксированную длину.
Примеры:
DCB=(RECFM=FB,LRECL=128,BLKSIZE=512)
DCB=(BLKSIZE=80,RECFM=F)
Вместо ключевых подпараметров DCB можно записать ссылку на другой
оператор DD, причем некоторые подпараметры можно переопределить заново:
//ST1 DD DSN=VAX,DCB=(RECFM=VB,LRECL=64,BLKSIZE=640) //PRINT DD DCB=(*.ST1,BLKSIZE=128)
Здесь подпараметры набора данных для параметра DCB копируются из
оператора DD с именем ST1, кроме размера блока, который задается
непосредственно.
Параметр SPACE задает требуемый объем памяти для размещения
создаваемого набора данных на жестком диске, то есть набора данных с
диспозицией NEW. Обычно этот параметр записывают в виде:
SPACE=(размер[,(количество[,приращение][,оглавление])][,RLSE])
Подпараметр количество указывает, сколько размер задает размер или тип
одного блока и может принимать одно из следующих значений:
TRK - блок соответствует физической дорожке диска;
- блок соответствует цилиндру диска;
число - определяет значение размера блока в байтах.
Так, параметр SPACE=( определяет область дисковой памяти
размером 10 цилиндров, а параметр SPACE=(800,30) объявляет, что
требуется память объемом в 30 блоков по 800 байт каждый. Если указанный
объем не может быть выделен (диск переполнен), система завершает шаг
задания аварийно.
В том случае когда первоначального объема памяти недостаточно для
размещения данных, система может выделить дополнительные блоки памяти,
количество которых определяется подпараметром приращение. Установлено,
что система может выделять дополнительные блоки не более 15 раз. Так,
параметр SPACE=( запрашивает первоначально 40 цилиндров, а
если этого объема памяти будет недостаточно, то система будет выделять
по пять цилиндров до 15 раз, т. е. при необходимости всего будет
выделено 40+5*15=115 цилиндров. Если приращение не указано, то
дополнительные блоки не выделяются.
Параметр оглавление задается только для наборов данных с библиотечной
организацией. Он определяет необходимое количество блоков, отводимых
под оглавление библиотечного набора данных. Один блок оглавления
содержит 256 байт. Так, например, параметр SPACE=(TRK,(100,10,5))
запрашивает память в 100 дорожек и по 10 дополнительных дорожек (до 15
раз), а также пять блоков по 256 байт оглавления библиотечного набора
данных. Отсутствие подпараметра оглавление обычно косвенно указывает на
набор данных с последовательной организацией.
Очевидно, что не всегда удается точно предсказать требуемый для набора
данных объем внешней памяти. Подпараметр RLSE служит для освобождения
памяти, выделенной, но не использованной под размещение данных.
Освобождение свободной памяти производится при закрытии набора данных.
Так, параметр SPACE=(TRK,(40,,8),RLSE) указывает, что запрашивается 40
дорожек без приращения. Для оглавления выделяется восемь блоков.
Незанятая память после закрытия набора данных освобождается.
Параметр LABEL чаще всего используется для описания набора данных на
магнитной ленте. В нем могут быть указаны порядковый номер набора
данных на МЛ, тип метки, срок хранения набора данных, пароль. Наиболее
употребительный формат параметра:
LABEL=([номер][,формат][PASSWORD][,IN|,OUT])
Подпараметр номер задает последовательный номер набора данных на
ленточном томе. Значения 0 или 1 указывают на первый по порядку набор
данных. Для каталогизированных наборов данных, а также наборов данных,
передаваемых из предыдущего шага задания (DISP=,PASS), номер можно не
указывать.
Подпараметр формат указывает используемый стандарт форматирования
ленточного тома (тип меток наборов данных). Возможны следующие значения
формата:
- стандартный формат IBM (используется по умолчанию, можно не
указывать);
SUL - указывает, где набор данных имеет стандартные метки и метки
пользователя;
AL - используется формат ISO/ANSI;
NSL - набор данных имеет нестандартные метки;
NL - набор данных не имеет меток;
- необходимо обойти обработку метки набора данных.
Подпараметр, задаваемый ключевым словом PASSWORD, требует при изменении
набора данных, чтобы пользователь ввел правильный пароль, используя
консоль или терминал TSO.
Ключевые слова IN и OUT указывают, что набор данных обрабатывается для
ввода или вывода соответственно.
В приводимом ниже примере открывается для чтения 5-й набор данных,
имеющий нестандартные метки, на ленточном томе TAPE01:
//DD1 DD DSNAME=NAB1,UNIT=TAPE01, // VOL=SER=MT1,LABEL=(5,NSL,,IN)
Параметр SYSOUT идентифицирует набор данных как системный выходной
набор данных. Наиболее употребительная форма для записи параметра:
SYSOUT=(выходной_класс[,имя_прог])
Чаще всего подпараметр выходной_класс определяет имя выходного класса
для описываемого набора данных в виде символа А-Z или 0-9. Атрибуты
выходных классов определяются при настройке JES. Если в качестве
значения выходного класса указана звездочка (*), это означает, что
следует использовать то же значение, что у параметра MSGCLASS,
определенное в операторе ,) в позиции данного
подпараметра задает так называемый "пустой" класс, означающий, что
основные атрибуты вывода будут определены в операторе задания OUTPUT,
ссылка на который должна быть указана далее с помощью параметра OUTPUT.
Подпараметр имя_прог позволяет указать
Кроме указанных подпараметров, параметр SYSOUT может использовать
подпараметры, управляющие форматированием выходного набора данных при
выводе на печать (выбор шрифта, межстрочный интервал, размеры полей,
количество копий и т.п.)
Примеры использования параметра SYSOUT:
B://SYSPRINT DD SYSOUT=B
MSGCLASS://YSl JOB ,,MSGCLASS=A //ST1 EXEC PGM=ZARPLATA //DD1 DD SYSOUT=*
OUTPUT://OUT1 OUTPUT BURST=Y,CHARS=(GT12),COPIES=3 ... //DS DD SYSOUT=(,),OUTPUT=*.OUT1
INTRDR://SYSUT2 DD SYSOUT=(X,INTRDR)
Итак, мы рассмотрели небольшую часть из общего числа параметров
оператора DD, однако наиболее важную с точки зрения практического
использования. Рассмотрим ряд примеров описания наборов данных при
решении некоторых типовых задач .
DSN и DISP, поскольку остальную
необходимую информацию о размещении набора данных система получит из
каталога, например://CATDS1 DD DSN=AS30.MY.DSET,DISP=OLD //CATDS2 DD DSN=LIB.DATA(CHAR),DISP=SHR
UNIT и VOLUME,
например://NOCATDS DD DSNAME=AS30.MY.DSET,DISP=OLD, // VOL=SER=D01457,UNIT=3390
DCB и SPACE. В приводимом ниже примере
создается библиотечный набор данных со 120-байтными записями
фиксированной длины на выделенном пространстве внешней памяти размером
10 цилиндров с приращением в три цилиндра. На оглавление отводится два
блока по 256 байт, при завершении шага задания неиспользуемая память
будет освобождена, а набор данных сохранен.//NEWDS DD DSNAME=D.AS32.DATA,DISP=(NEW,KEEP), // VOL=SER=BIBLIO,UNIT=3380, // DCB=(RECFM=F,LRECL=120), // SPACE=(CYL,(10,3,2),RLSE)
В
Процедура представляет собой последовательность предложений
(операторов)
При обращении к процедуре входящие в ее состав операторы EXEC. При этом могут
быть изменены значения параметров операторов процедуры, целые
операторы, а также добавлены новые операторы.
В JCLLIB (о нем речь пойдет ниже). Процедуры во входном
потоке описываются непосредственно в задании после оператора JOB.
Процедура начинается оператором процедуры и заканчивается
оператором конца процедуры . Имя оператора процедуры является
именем процедуры при размещении ее во входном потоке. В операторе
могут быть описаны параметры процедуры. Процедуры могут содержать
различные операторы EXEC, DD, OUTPUT, IF/THEN/ELSE, INCLUDE, CNTL, ENDCNTL, SET, а также вызовы других процедур. Процедуры
не должны содержать операторы DD * и DD DATA, оператор //JOBLIB DD,
операторы JES и описания других процедур (операторы и ).
Каждый оператор EXEC вместе с принадлежащими ему операторами DD
называется шагом (пунктом) процедуры. Имя оператора EXEC является
именем шага процедуры. В общем виде процедура имеет следующую
структуру:
//имя PROC параметры // EXEC // DD ... // EXEC // DD ... // PEND
В имя, и могут быть указаны в процедуре
в качестве параметра, подпараметра или значения в любом операторе.
Фактические значения для символических параметров устанавливаются в
вызывающем процедуру операторе EXEC, в виде списка, каждый элемент
которого выглядит так:
имя=фактическое_значение
Рассмотрим пример некоторой абстрактной процедуры, на котором будут показаны особенности построения и использования процедур:
//MYPROC PROC UNT=SYSDA,PRN=A,TOM=DISK8,P=P2,NAME=DS.OPT //ST1 EXEC PGM=SUV,REGION=50K //LIB DD DSN=SYSLIB,DISP=OLD //SYSIN DD DSN=NAME,DISP=(NEW,KEEP), // VOL=SER=TOM,UNIT=UNT, // SPACE=(TRK,(10,1,10)) //SYSOUT DD SYSOUT=PRN //ST2 EXEC PGM=CALC,PARM=(P1,P,P3) //TABL DD DSN=TABL.DATA,DISP=SHR // VOL=SER=WORK1,UNIT=DISK // PEND
Данная процедура с именем MYPROC содержит два шага ( ST1 и ST2 ). В теле
процедуры выделено пять формальных параметров. В операторе
представлен список фактических стандартных значений формальных
параметров, которые будут использоваться по умолчанию в случае, если
пользователь не определит собственные фактические значения. Например,
если процедура будет вызвана в задании следующим образом:
//PRIM1 EXEC MYPROC
то это как раз такой случай: все значения формальных параметров будут
выбраны из оператора .
Если же пользователь захочет изменить все или некоторые стандартные
значения, их необходимо указать непосредственно в операторе EXEC:
//PRIM2 EXEC MYPROC,NAME=BIBL,UNT=3390
В данном случае устанавливаются новые значения для формальных
параметров NAME и UNT, а остальные параметры примут стандартные
значения, записанные в операторе . При изменении значений
параметров пользователь обязан следить, чтобы модифицированная таким
образом процедура была корректной как синтаксически, так и
семантически. Очевидно, что значения символических параметров,
назначенных пользователем в операторе EXEC, действуют только в текущем
шаге задания. На другие шаги задания их действие не распространяется, и
там могут быть установлены другие значения.
Наряду с использованием символических параметров, существует
возможность модифицировать целиком или частично операторы процедуры EXEC и DD. Например, модификация параметров операторов EXEC может
производиться следующим образом:
//PRIM3 EXEC MYPROC,REGION.ST1=100K,COND.ST2=(8,LE,ST1)
Здесь пользователь требует изменить значение параметра REGION,
используемого в шаге процедуры ST1, и добавить параметр к
оператору шага ST2. Синтаксис записи
Модификация параметров операторов DD осуществляется несколько иначе.
Например, при необходимости изменить имя и диспозицию набора данных,
описанного в операторе DD с именем LIB шага ST1, и отказаться от
определения параметров в VOL и UNIT операторе DD с именем TABL шага ST2, при вызове процедуры следует записать:
//PRIM4 EXEC MYPROC,NAME=XXXXX.YY,P=P5 //ST1.LIB DD DSN=USERLIB,DISP=SHR //ST2.TABL DD DSN=TABL1.DATA,VOL=,UNIT=
Обратите внимание, что имена модифицирующих DD операторов задания
записываются как составные: сначала указывается имя шага процедуры,
затем, после разделительной точки, имя модифицируемого оператора DD
процедуры.
Точно таким же образом может производиться добавление в процедуру новых
операторов DD:
//PRIM5 EXEC MYPROC,PRN=* //ST2.SYSPRINT DD SYSOUT=A
Здесь к шагу ST2 процедуры будет добавлен оператор DD с именем SYSPRINT. Таким способом можно обойти ограничение на использование в
DD * и DD DATA.
Значительную роль в работе пользователей z/OS играют имеющиеся в
системе каталогизированные процедуры. Как уже отмечалось, обычно
существует несколько стандартных библиотек процедур (самая известная
среди них - SYS1.PROCLIB ), определяемых системным программистом в
настройках подсистемы JES2. Библиотеки содержат множество готовых
процедур, предназначенных для решения типовых задач пользователей и
администраторов, включая процедуры поддержки разработки приложений
(компиляция, редактирование связей и выполнение программ), процедуры
запуска и настройки системных компонентов, процедуры управления данными
и т.п.
Для вызова таких процедур в задании необходимо указать имя
каталогизированной процедуры и при необходимости ! Отметим также, что
каталогизированные процедуры могут вызываться по команде оператора START, при этом порождаются запускаемые процедуры (STC-задания), о
которых упоминалось ранее. Примеры применения некоторых
каталогизированных процедур при разработке приложений будут рассмотрены
в п. 5.1.8.
Помимо системных библиотек процедур, доступных пользователям по
умолчанию, существует возможность создания и использования личных
библиотек процедур. В этом случае потребуется сообщить системе имена
таких библиотек с помощью оператора JCLLIB. Данный оператор имеет
единственный параметр ORDER, с помощью которого можно задать список
личных библиотек, используемых в задании:
ORDER=(библиотека1[,библиотека2]...)
В приведенном ниже примере определен список из двух библиотек
( USER1.PROCLIB,USER1.WORKLIB ), которые система будет использовать для
поиска процедуры SMETA в первую очередь. Если поиск завершится
неудачей, будут просматриваться системные библиотеки:
//USER1 J0B ... //USERLIB JCLLIB ORDER=(USER1.PROCLIB,USER1.WORKLIB) // EXEC PROC=SMETA
Как отмечалось ранее, все сообщения и результаты работы программ, выполняемых в рамках задания, группируются JES2 в наборе данных SYSOUT. На основе этих данных формируется отчет о выполненном задании. У пользователя есть несколько способов получить и вывести отчет, используя средства TSO/E, ISPF/PDF или SDSF. На рис. 5.22 представлен общий вид отчета (листинга) о выполнении задания.
(рис 5.22) Пример отчета о выполненном заданииСтандартный листинг состоит из нескольких информационных блоков:
MSGLEVEL и сообщения о синтаксических ошибках.Основным признаком правильности выполнения задания является значение кода завершения (Condition code), отображаемое в блоке 4 листинга в виде:
СOND CODE = XXXX
Если ABEND ). Каждому значению кода завершения соответствует определенная
причина, а в отчете содержатся поясняющие
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.