Как создать член в существующих pds, используя jcl - PullRequest
1 голос
/ 15 марта 2012

Я использовал ниже jcl:

//STEP1    EXEC PGM=IEBGENER                            
//SYSUT1   DD   DUMMY,RECFM=FB,LRECL=80                  
//SYSUT2   DD   DSN=RK.MYDIR.FILES(NEW1),DISP=(SHR)      
//SYSPRINT DD   SYSOUT=*                                
//SYSIN    DD   DUMMY

Я смог его создать.Но я не могу понять код здесь.Есть ли возможность создания с использованием IEFBR14.Если нет, то это единственный способ.Пожалуйста, объясните мне код.Спасибо

Ответы [ 6 ]

8 голосов
/ 16 марта 2012

Это невозможно сделать с IEFBR14

IEBCOPY более уместен: http://publib.boulder.ibm.com/infocenter/zos/basics/index.jsp?topic=/com.ibm.zos.zdatamgmt/zsysprogc_utilities_IEBCOPY.htm

Это справочник, который помогает объяснить IEBGENER: http://publib.boulder.ibm.com/infocenter/zos/basics/index.jsp?topic=/com.ibm.zos.zdatamgmt/zsysprogc_utilities_IEBGENER.htm

4 голосов
/ 12 июля 2012

Если вам интересна причина, поймите, что IEFBR14 фактически не открывает ни один из операторов DD, которые вы кодируете в своем JCL. Скорее, это просто сокращенный способ управления процедурами выделения (и освобождения) системы. Действительно, если бы вы взглянули на список ассемблера iEFBR14, то обнаружили бы, что это всего лишь две инструкции: установите код возврата R15 на ноль и завершите работу.

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

Но есть ловушка, когда дело доходит до доступа к наборам данных PDS в JCL, как вы пытаетесь это сделать.

Когда вы задаете синтаксис DSN (MEMBER) в JCL, процедуры выделения не особенно заботятся о части MEMBER - оказывается, это не функция инициатора, а вместо этого реализуется в OPEN / CLOSE. В вашем примере, распределение подтверждает, что набор данных существует (так как вы закодировали DISP = SHR), и когда программа ОТКРЫВАЕТ оператор DD, процедуры OPEN автоматически выдают BPAM FIND / POINT / STOW, чтобы получить вас к указанному вами члену PDS. Вот как создается ваш член PDS, и поэтому вам нужно использовать программу, которая фактически открывает файл (IEBGENR, IEBUPDTE, IEBCOPY, IDCAMS и т. Д. Все будет работать).

Один небольшой несвязанный комментарий заключается в том, что вы можете быть осторожны при обновлении наборов данных (особенно PDS) с помощью DISP = SHR. Если вам удастся ошибиться во времени, теоретически две из этих задач могут работать одновременно, и это может привести к повреждению вашего набора данных. Если вы не уверены, что являетесь единственной задачей, осуществляющей доступ к PDS, в этом случае безопаснее использовать DISP = OLD.

1 голос
/ 12 января 2018

Внимание! - при использовании IEBGENER с SYSUT2 DD DSN = PDS (MEMBER): не забудьте указать имя MEMBER - если вы это сделаете, IEBGENER будет перезаписывать ваш PDS с самого начала тем, что он найдет в SYSUT1, начиная с разрушения вашего Каталог PDS!

1 голос
/ 09 октября 2013

Если вы копируете содержимое DSN в нового участника, используйте IEBGENER.

Для динамической установки атрибутов нового DSN используйте параметр LIKE.

Например (используя пример Майка выше)

//STEP1    EXEC PGM=IEBGENER                            
//SYSUT1   DD   DISP=SHR,DSN=your.input.dataset                  
//SYSUT2   DD   DISP=(,CATLG,DELETE),DSN=your.output.dataset,
//              LIKE=your.input.dataset      
//SYSPRINT DD   SYSOUT=*                                
//SYSIN    DD   DUMMY   <-- no CONTROL statements

Атрибут LIKE позволяет вам легко создавать новый набор данных, используя атрибуты указанного вами набора данных, я также изменил расположение, чтобы отразить, какой новый DSN должен быть установлен.

1 голос
/ 14 июня 2012

Если вы хотите создать несколько участников одновременно, я предлагаю IEBUPDTE.

От IBM:

Этот базовый пример использует IEBUPDTE для добавления двух процедур JCL к набору данных с именем MY.PROCLIB:

//ADDPROC1 JOB 1,SMCHUGH,MSGCLASS=X
//         EXEC PGM=IEBUPDTE
//SYSPRINT DD SYSOUT=*
//SYSUT1   DD DISP=OLD,DSN=MY.PROCLIB
//SYSUT2   DD DISP=OLD,DSN=MY.PROCLIB
//SYSIN    DD DATA
./ ADD LIST=ALL,NAME=MYJOB1
//STEP1 EXEC=SUZNX1
//PRINT DD SYSOUT=A
// (more JCL for MYJOB1)
//SYSUDUMP DD SYSOUT=* (last JCL for MYJOB1)
./ REPL LIST=ALL,NAME=LASTJOB
//LIST EXEC PGM=SUZNLIST
// (more JCL for this procedure)
//* LAST JCL STATEMENT FOR LASTJOB
./ ENDUP
/*

Это создает одного нового члена, MYJOB1, но вы можете видеть, что он также может заменять участников (LASTJOB).

http://publib.boulder.ibm.com/infocenter/zos/basics/topic/com.ibm.zos.zdatamgmt/zsysprogc_utilities_IEBUPDTE.htm

0 голосов
/ 22 апреля 2012

Утилита IEBGENER используется для копирования одного файла.

Имя SYSUT1 DD используется для ввода INPUT или файла для копирования.

Имя SYSUT2 DD - это файл OUTPUT.

SYSIN DD предоставляет операторы CONTROL (если есть).

//STEP1    EXEC PGM=IEBGENER                            
//SYSUT1   DD   DISP=SHR,DSN=your.input.dataset                  
//SYSUT2   DD   DISP=SHR,DSN=your.output.dataset      
//SYSPRINT DD   SYSOUT=*                                
//SYSIN    DD   DUMMY   <-- no CONTROL statements

Обратите внимание, что файл / набор данных может бытьпоследовательный набор данных или член многораздельного набора данных.

//SYSUT1   DD   DISP=SHR,DSN=your.input.dataset(member)                  
//SYSUT2   DD   DISP=SHR,DSN=your.output.dataset(member) 
...