Московский государственный университет путей сообщения
Опубликован: 13.04.2006 | Доступ: свободный | Студентов: 868 / 87 | Оценка: 4.41 / 3.73 | Длительность: 24:53:00
Лекция 5:

Управление заданиями и язык JCL

Процедуры JCL

В языке управления заданиями, как и в других языках программирования, могут быть определены процедуры. Мы уже не раз упоминали этот важнейший элемент JCL при рассмотрении различных функций z/OS.

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

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

В JCL поддерживается два вида процедур: каталогизированные процедуры и процедуры во входном потоке. Каталогизированные процедуры размещаются в специальных наборах данных - библиотеках процедур. JES2 располагает настраиваемым списком используемых стандартных библиотек. Пользователь также имеет возможность указать собственный набор библиотек процедур с помощью оператора JCLLIB (о нем речь пойдет ниже). Процедуры во входном потоке описываются непосредственно в задании после оператора JOB.

Процедура начинается оператором процедуры PROC и заканчивается оператором конца процедуры PEND. Имя оператора процедуры является именем процедуры при размещении ее во входном потоке. В операторе PROC могут быть описаны параметры процедуры. Процедуры могут содержать различные операторы JCL, включая EXEC, DD, OUTPUT, IF/THEN/ELSE, INCLUDE, CNTL, ENDCNTL, SET, а также вызовы других процедур. Процедуры не должны содержать операторы DD * и DD DATA, оператор //JOBLIB DD, операторы JES и описания других процедур (операторы PROC и PEND ).

Каждый оператор 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 ). В теле процедуры выделено пять формальных параметров. В операторе PROC представлен список фактических стандартных значений формальных параметров, которые будут использоваться по умолчанию в случае, если пользователь не определит собственные фактические значения. Например, если процедура будет вызвана в задании следующим образом:

//PRIM1 EXEC    MYPROC

то это как раз такой случай: все значения формальных параметров будут выбраны из оператора PROC.

Если же пользователь захочет изменить все или некоторые стандартные значения, их необходимо указать непосредственно в операторе EXEC:

//PRIM2 EXEC MYPROC,NAME=BIBL,UNT=3390

В данном случае устанавливаются новые значения для формальных параметров NAME и UNT, а остальные параметры примут стандартные значения, записанные в операторе PROC. При изменении значений параметров пользователь обязан следить, чтобы модифицированная таким образом процедура была корректной как синтаксически, так и семантически. Очевидно, что значения символических параметров, назначенных пользователем в операторе EXEC, действуют только в текущем шаге задания. На другие шаги задания их действие не распространяется, и там могут быть установлены другие значения.

Наряду с использованием символических параметров, существует возможность модифицировать целиком или частично операторы процедуры EXEC и DD. Например, модификация параметров операторов EXEC может производиться следующим образом:

//PRIM3 EXEC MYPROC,REGION.ST1=100K,COND.ST2=(8,LE,ST1)

Здесь пользователь требует изменить значение параметра REGION, используемого в шаге процедуры ST1, и добавить параметр COND к оператору шага 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. Библиотеки содержат множество готовых процедур, предназначенных для решения типовых задач пользователей и администраторов, включая процедуры поддержки разработки приложений (компиляция, редактирование связей и выполнение программ), процедуры запуска и настройки системных компонентов, процедуры управления данными и т.п.

Для вызова таких процедур в задании необходимо указать имя каталогизированной процедуры и при необходимости фактические параметры, а также модифицирующие операторы. Важно подчеркнуть, что в качестве имени каталогизированной процедуры используется имя раздела библиотеки процедур, а не имя оператора PROC! Отметим также, что каталогизированные процедуры могут вызываться по команде оператора 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. Пример отчета о выполненном задании

Стандартный листинг состоит из нескольких информационных блоков:

  1. Общая информация, определяемая при инсталляции системы.
  2. Статистическая информация, формируемая подсистемой управления заданиями JES.
  3. Текст задания на языке JCL, если заданы соответствующие значения параметра MSGLEVEL и сообщения о синтаксических ошибках.
  4. Системные сообщения о ходе и результатах выполнения задания.

Основным признаком правильности выполнения задания является значение кода завершения (Condition code), отображаемое в блоке 4 листинга в виде:

СOND CODE = XXXX

Если код завершения равен 0000, то задание выполнено успешно. Ненулевое значение кода означает, что задание завершилось аварийно (состояние ABEND ). Каждому значению кода завершения соответствует определенная причина, а в отчете содержатся поясняющие диагностические сообщения.