Операционные системы и программное обеспечение на платформе zSeries

Процедуры 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


Содержание раздела