
LOAD
La utilidad "LOAD" se utiliza para realizar "cargas" de datos a una tabla DB2.
La carga se realizará desde un fichero que puede venir con el formato de la tabla o no.
La estructura general de un paso de LOAD sería algo así:
//*================================================
//* CARGA DE LA TABLA TBPRU00
//* Donde los ficheros SORTWKXX son temporales para
//* ordenar la entrada
//* el SYSREC es el fichero con los datos para la carga
//* y el SORTOUT es temporal para ordenar la salida
//*======================================================
//LOADTBL EXEC DSNUPROC,SYSTEM=DSNP,UID=LOADIND
//DSNUPROC.SORTWK01 DD DSN=&&SORTWK01,
// DISP=(NEW,DELETE,DELETE),
// SPACE=(4000,(1000,700),,,ROUND),
// UNIT=SYSDA
//DSNUPROC.SORTWK02 DD DSN=&&SORTWK02,
// DISP=(NEW,DELETE,DELETE),
// SPACE=(4000,(1000,700),,,ROUND),
// UNIT=SYSDA
//DSNUPROC.SORTWK03 DD DSN=&&SORTWK03,
// DISP=(NEW,DELETE,DELETE),
// SPACE=(4000,(1000,700),,,ROUND),
// UNIT=SYSDA
//DSNUPROC.SORTWK04 DD DSN=&&SORTWK04,
// DISP=(NEW,DELETE,DELETE),
// SPACE=(4000,(1000,700),,,ROUND),
// UNIT=SYSDA
//DSNUPROC.SYSUT1 DD DSN=&&SYSUT1,
// DISP=(NEW,DELETE,DELETE),
// SPACE=(4000,(5000,2000),,,ROUND),
// UNIT=SYSDA
//DSNUPROC.SYSREC DD DSN=XXXX.LOAD.TABLA,DISP=SHR
//DSNUPROC.SORTOUT DD DSN=&&SORT1,UNIT=SYSDA,
// SPACE=(4000,(5000,2000),,,ROUND)
//SYSIN DD *
1. Vamos a ver en primer lugar el caso más sencillo, con un fichero de carga que tenga el mismo formato que la tabla:
//SYSIN DD *
LOAD
A continuación tendríamos varias opciones:
//*Si vamos a añadir registros
RESUME YES
INTO TABLE TBPRU00
LOG NO NOCOPYPEND
/*
//*Si vamos a reemplazar registros (se borrarán todos los que haya)
RESUME NO REPLACE
INTO TABLE TBPRU00
LOG NO NOCOPYPEND
/*
Utilizamos la opción RESUME para indicar si vamos a cargar datos en una tabla vacía o no:
RESUME YES: La tabla no está vacía, añadimos los registros de nuestro fichero.
RESUME NO: La tabla está vacía. Por si no lo estuviese, indicamos con REPLACE que reemplace los registros existentes por los de nuestro fichero.
La opción NOCOPYPEND se utiliza para quitar el estado COPY de la tabla y que quede accesible después de la LOAD.
2. Para el caso en que el fichero no tenga el mismo formato que la tabla tendríamos un paso de JCL similar, pero después de indicar el nombre de la tabla, indicaríamos para cada campo de la tabla, las posiciones que tiene el mismo campo en el fichero, y le daríamos el formato adecuado.
Vamos a suponer que nuestra tabla tiene el siguiente formato:
CAMPO1 S9(9) COMP-3.
CAMPO2 X(30).
CAMPO3 X(60).
CAMPO4 DATE
CAMPO5 S9(9) COMP-3.
Y que nuestro fichero tiene este otro:
Descripción campo Posición
CAMPO1 PIC S9(9) COMP-3. 1
CAMPO2 PIC X(2). 6
CAMPO3 PIC X(1). 8
CAMPO4 PIC X(10). 9
CAMPO5 PIC 9(8). 19
En nuestra LOAD quedaría:
//SYSIN DD *
LOAD
RESUME NO REPLACE
INTO TABLE TBPRU00
(CAMPO1 POSITION(1:5) DECIMAL
,CAMPO2 POSITION(6:7) CHAR (2)
,CAMPO3 POSITION(8) CHAR (1)
,CAMPO4 POSITION(9:18) DATE EXTERNAL(10)
,CAMPO5 POSITION(19:26) DECIMAL EXTERNAL
)
LOG NO NOCOPYPEND
Un JCL completo podría ser:
//*===============================================
//* CARGA DE LA TABLA TBPRU00 *
//*===============================================
//LOADTBL EXEC DSNUPROC,SYSTEM=DSN1,UID=LOADIND
//DSNUPROC.SORTWK01 DD DSN=&&SORTWK01,
// DISP=(NEW,DELETE,DELETE),
// SPACE=(4000,(1000,700),,,ROUND),
// UNIT=SYSDA
//DSNUPROC.SORTWK02 DD DSN=&&SORTWK02,
// DISP=(NEW,DELETE,DELETE),
// SPACE=(4000,(1000,700),,,ROUND),
// UNIT=SYSDA
//DSNUPROC.SORTWK03 DD DSN=&&SORTWK03,
// DISP=(NEW,DELETE,DELETE),
// SPACE=(4000,(1000,700),,,ROUND),
// UNIT=SYSDA
//DSNUPROC.SORTWK04 DD DSN=&&SORTWK04,
// DISP=(NEW,DELETE,DELETE),
// SPACE=(4000,(1000,700),,,ROUND),
// UNIT=SYSDA
//DSNUPROC.SYSUT1 DD DSN=&&SYSUT1,
// DISP=(NEW,DELETE,DELETE),
// SPACE=(4000,(5000,2000),,,ROUND),
// UNIT=SYSDA
//DSNUPROC.SYSREC DD DSN=XXXX.LOAD.TABLA,DISP=SHR
//DSNUPROC.SORTOUT DD DSN=&&SORT1,UNIT=SYSDA,
// SPACE=(4000,(5000,2000),,,ROUND)
//SYSIN DD *
LOAD
RESUME YES
INTO TABLE TBPRU00
LOG NO NOCOPYPEND
/*
Otros pasos útiles/opcionales cuando hacemos una LOAD:
Quitar estado COPY-pending
//*===================================================*
//* ANULAR COPY Y RECOVERY PENDIENTES *
//*==================================================*
//REPMES EXEC DSNUPROC,UID=TSPRU00
//SYSIN DD *
REPAIR SET TABLESPACE DBPRU.TSPRU00 NORCVRPEND
REPAIR SET TABLESPACE DBPRU.TSPRU00 NOCOPYPEND
/*
O también
//****************************************************
//* ABRE PARA R/W
//****************************************************
//ARRANGEN EXEC PGM=IKJEFT01,DYNAMNBR=20
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=4,DEST=JESTC3
//SYSTSIN DD *
DSN SYSTEM(DSN1)
-START DB(DBPRU) SPACE(TSPRU00) ACCESS(FORCE) <--tablespace
-START DB(DBPRU) SPACE(INPRU001) ACCESS(FORCE) <--índice /*
Poner tablespace/índices a UT (sólo permite acceder a la tabla a las utilitys)
//************************************************
//* STO: STOP STA: START
//******************************************************
//DSNTIAD1 EXEC PGM=IKJEFT01,DYNAMNBR=20
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM (DSN1)
-STO DATABASE(EXAMP001) SPACENAM(EXAMPTLF)
-STA DATABASE(EXAMP001) SPACENAM(EXAMPTLF) ACCESS(UT)
-STO DATABASE(EXAMP001) SPACENAM(IXAMPTLF)
-STA DATABASE(EXAMP001) SPACENAM(IXAMPTLF) ACCESS(UT)
END
/*
Poner tablespaces/índices a RW
//*************************************************
//* REALIZA UN START DE LECTURA/ESCRITURA SOBRE LA TABLA
//*******************************************************
//ARRANGEN EXEC PGM=IKJEFT01,DYNAMNBR=20
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=4,DEST=JESTC3
//SYSTSIN DD *
DSN SYSTEM (DSN1)
-STA DATABASE(EXAMP001) SPACENAM(EXAMPTLF) ACCESS(RW)
-STA DATABASE(EXAMP001) SPACENAM(IXAMPTLF) ACCESS(RW)
END
/*
Es recomendable hacer siempre una descarga previa, por lo que pueda pasar :P
UNLOAD
La utilidad "UNLOAD" sirve para realizar "descargas" de información de tablas.
La estructura general de un paso de UNLOAD sería algo así:
//*=================================================*
//* DESCARGA DE LA TABLA TBPRU00 *
//* Donde SYSPRINT contendrá mensajes de error
//* SYSPUNCH las sentencias de LOAD para una posterior
//* recarga de datos
//* y SYSRECnn es el fichero donde guardaremos la información
//*=======================================================*
//UNLOAD EXEC PGM=IKJEFT01,DYNAMNBR=20
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(DSN1)
RUN PROGRAM(DSNTIAUL) PLAN(DSNTIAUL) -
LIB('LIBRERIA.DE.TU.INSTALACION')
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSPUNCH DD SYSOUT=*
//SYSREC00 DD DSN=XXXX.UNLOAD.TBPRU00,
// DISP=(NEW,CATLG,DELETE),UNIT=SYSDA,
// SPACE=(CYL,(100,50),RLSE)
//SYSIN DD *
En la SYSIN escribiremos la query para seleccionar los datos que queremos descargar. Por ejemplo:
SELECT *
FROM DSN1.TBPRU00 <-- El prefijo cambia según la instalación
WHERE CAMPO1 = 112 ORDER BY CAMPO2 ;
Esta SELECT se puede complicar tanto como queramos (SUBSELECTs, JOINs, etc).
Por supuesto, lo mejor en estos casos es buscar un JCL de carga o descarga que ya exista en tu entorno de explotación, y adaptarlo a tus necesidades ^^