JCL: definición de conjuntos de datos
Un nombre de conjunto de datos especifica el nombre de un archivo y se indica mediante DSN en JCL. El parámetro DSN se refiere al nombre del conjunto de datos físico de un conjunto de datos existente o recién creado. El valor de DSN puede estar formado por subnombres de 1 a 8 caracteres cada uno, separados por puntos y con una longitud total de 44 caracteres (alfanuméricos). A continuación se muestra la sintaxis:
DSN=&name | *.stepname.ddname
Temporary datasetsnecesitan almacenamiento solo durante la duración del trabajo y se eliminan al finalizar el trabajo. Dichos conjuntos de datos se representan comoDSN=&name o simplemente sin un DSN especificado.
Si un conjunto de datos temporal creado por un paso de trabajo se va a utilizar en el siguiente paso de trabajo, se hace referencia a él como DSN=*.stepname.ddname. Se llamaBackward Referencing.
Concatenación de conjuntos de datos
Si hay más de un conjunto de datos del mismo formato, se pueden concatenar y pasar como entrada al programa en un solo nombre DD.
//CONCATEX JOB CLASS=6,NOTIFY=&SYSUID
//*
//STEP10 EXEC PGM=SORT
//SORTIN DD DSN=SAMPLE.INPUT1,DISP=SHR
// DD DSN=SAMPLE.INPUT2,DISP=SHR
// DD DSN=SAMPLE.INPUT3,DISP=SHR
//SORTOUT DD DSN=SAMPLE.OUTPUT,DISP=(,CATLG,DELETE),
// LRECL=50,RECFM=FB
En el ejemplo anterior, se concatenan tres conjuntos de datos y se pasan como entrada al programa SORT en el nombre SORTIN DD. Los archivos se combinan, se ordenan en los campos clave especificados y luego se escriben en un solo archivo de salida SAMPLE.OUTPUT en el nombre de SORTOUT DD.
Anular conjuntos de datos
En un JCL estandarizado, el programa que se ejecutará y sus conjuntos de datos relacionados se colocan dentro de un procedimiento catalogado, que se llama en el JCL. Por lo general, con fines de prueba o para solucionar un incidente, puede ser necesario utilizar conjuntos de datos diferentes a los especificados en el procedimiento catalogado. En ese caso, el conjunto de datos del procedimiento puede anularse en el JCL.
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//JSTEP1 EXEC CATLPROC,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT
// DATAC=MYDATA.BASE.LIB1(DATA1)
//STEP1.IN1 DD DSN=MYDATA.OVER.INPUT,DISP=SHR
//*
//* The cataloged procedure is as below:
//*
//CATLPROC PROC PROG=,BASELB=MYCOBOL.BASE.LIB1
//*
//STEP1 EXEC PGM=&PROG
//STEPLIB DD DSN=&BASELB,DISP=SHR
//IN1 DD DSN=MYDATA.URMI.INPUT,DISP=SHR
//OUT1 DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD MYDATA.BASE.LIB1(DATA1),DISP=SHR
//*
//STEP2 EXEC PGM=SORT
En el ejemplo anterior, el conjunto de datos IN1 usa el archivo MYDATA.URMI.INPUT en el PROC, que se reemplaza en el JCL. Por lo tanto, el archivo de entrada utilizado en la ejecución es MYDATA.OVER.INPUT. Tenga en cuenta que el conjunto de datos se denomina STEP1.IN1. Si solo hay un paso en el JCL / PROC, entonces se puede hacer referencia al conjunto de datos solo con el nombre DD. Del mismo modo, si hay más de un paso en el JCL, el conjunto de datos se anulará como JSTEP1.STEP1.IN1.
//SAMPINST JOB 1,CLASS=6,MSGCLASS=Y,NOTIFY=&SYSUID
//*
//STEP EXEC CATLPROC,PROG=CATPRC1,DSNME=MYDATA.URMI.INPUT
// DATAC=MYDATA.BASE.LIB1(DATA1)
//STEP1.IN1 DD DSN=MYDATA.OVER.INPUT,DISP=SHR
// DD DUMMY
// DD DUMMY
//*
En el ejemplo anterior, de los tres conjuntos de datos concatenados en IN1, el primero se anula en el JCL y el resto se mantiene como el presente en PROC.
Definición de GDG en un JCL
Los grupos de datos de generación (GDG) son grupos de conjuntos de datos relacionados entre sí por un nombre común. El nombre común se denomina base GDG y cada conjunto de datos asociado con la base se denomina versión GDG.
Por ejemplo, MYDATA.URMI.SAMPLE.GDG es el nombre base de GDG. Los conjuntos de datos se denominan MYDATA.URMI.SAMPLE.GDG.G0001V00, MYDATA.URMI.SAMPLE.GDG.G0002V00 y así sucesivamente. La última versión de GDG se denomina MYDATA.URMI.SAMPLE.GDG (0), las versiones anteriores se denominan (-1), (-2) y así sucesivamente. La siguiente versión que se creará en un programa se denomina MYDATA.URMI.SAMPLE.GDG (+1) en el JCL.
Crear / modificar GDG en un JCL
Las versiones de GDG pueden tener parámetros DCB iguales o diferentes. Se puede definir un modelo inicial DCB para que lo utilicen todas las versiones, pero se puede anular al crear nuevas versiones.
//GDGSTEP1 EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
DEFINE GDG(NAME(MYDATA.URMI.SAMPLE.GDG) -
LIMIT(7) -
NOEMPTY -
SCRATCH)
/*
//GDGSTEP2 EXEC PGM=IEFBR14
//GDGMODLD DD DSN=MYDATA.URMI.SAMPLE.GDG,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(CYL,10,20),
// DCB=(LRECL=50,RECFM=FB)
//
En el ejemplo anterior, la utilidad IDCAMS define la base de GDG en GDGSTEP1 con los siguientes parámetros pasados en la declaración SYSIN DD:
NAME especifica el nombre del conjunto de datos físicos de la base de GDG.
LIMIT especifica el número máximo de versiones que la base de GDG puede contener.
EMPTY descataloga todas las generaciones cuando se alcanza el LÍMITE.
NOEMPTY descataloga la generación menos reciente.
SCRATCH elimina físicamente la generación cuando no está catalogada.
NOSCRATCH no borre el conjunto de datos, es decir, puede ser referido usando los parámetros UNIT y VOL.
En GDGSTEP2, la utilidad IEFBR14 especifica los parámetros del modelo DD que utilizarán todas las versiones.
IDCAMS se puede utilizar para modificar los parámetros de definición de un GDG, como aumentar el LÍMITE, cambiar VACÍO a NO VACÍO, etc., y sus versiones relacionadas utilizando el comando SYSIN es ALTER MYDATA.URMI.SAMPLE.GDG LIMIT(15) EMPTY.
Eliminar GDG en un JCL
Usando la utilidad IEFBR14, podemos eliminar una sola versión de un GDG.
//GDGSTEP3 EXEC PGM=IEFBR14
//GDGDEL DD DSN=MYDATA.URMI.SAMPLE.GDG(0),
// DISP=(OLD,DELETE,DELETE)
En el ejemplo anterior, se elimina la última versión de MYDATA.URMI.SAMPLE.GDG. Tenga en cuenta que el parámetro DISP en la finalización normal del trabajo está codificado como DELETE. Por lo tanto, el conjunto de datos se elimina cuando el trabajo completa la ejecución.
IDCAMS se puede usar para eliminar el GDG y sus versiones relacionadas usando el comando SYSIN DELETE(MYDATA.URMI.SAMPLE.GDG) GDG FORCE/PURGE.
FORCEelimina las versiones de GDG y la base de GDG. Si alguna de las versiones de GDG se establece con una fecha de vencimiento que aún no ha expirado, entonces no se eliminan y, por lo tanto, se conserva la base de GDG.
PURGE elimina las versiones de GDG y la base de GDG independientemente de la fecha de vencimiento.
Usando GDG en un JCL
En el siguiente ejemplo, la última versión de MYDATA.URMI.SAMPLE.GDG se utiliza como entrada para el programa y se crea una nueva versión de MYDATA.URMI.SAMPLE.GDG como salida.
//CNDSAMP JOB CLASS=6,NOTIFY=&SYSUID
//*
//STP01 EXEC PGM=MYCOBB
//IN1 DD DSN=MYDATA.URMI.SAMPLE.GDG(0),DISP=SHR
//OUT1 DD DSN=MYDATA.URMI.SAMPLE.GDG(+1),DISP=(,CALTG,DELETE)
// LRECL=100,RECFM=FB
Aquí, si el GDG ha sido referido por el nombre real como MYDATA.URMI.SAMPLE.GDG.G0001V00, entonces lleva a cambiar el JCL cada vez antes de la ejecución. El uso de (0) y (+1) hace que sustituya dinámicamente la versión GDG para la ejecución.