PerroCobolero

PerroCobolero

ADS

miércoles, 27 de julio de 2016

SQL en JCL

SQL en JCL.

En este artículo vamos a ver una manera de hacer querys a través de un JCL:

//PASO001  EXEC IKJEFT01
//SYSTSIN  DD *
DSN SYSTEM(DB2D)
RUN PROGRAM(DSNTEP2) PLAN(DSNTEP2) -
    LIB('LIBRERIA.DE.TU.INSTALACION')
END
//SYSIN    DD *
Aquí escribiríamos la query
/*

Por ejemplo:
//SYSIN    DD *
  UPDATE TBPRU01
   SET CAMPO1 = 'SI'
   WHERE CLAVE = '01'
  ;
/*

Ó

//SYSIN    DD *
INSERT INTO TBPRU01
      (CAMPO1, CAMPO2, CAMPO3)
      VALUES
      ('01', '02', '03')
      ;
/*

Otra utilidad de las querys en JCLs podría ser hacer un inventario de todas las tablas de las aplicaciones, con sus campos, índices, etc. Lo que viene siendo la típica documentación que nadie quiere hacer, pero que con este JCL te llevará 1 minuto.

Para ello utilizaríamos las ya conocidas tablas del SYSIBM: SYSTABLES, SYSCOLUMS, SYSINDEXES, SYSKEYS.

Os dejo dos ejemplos: uno para obtener la información de los campos de cada tabla (con su formato) y otro para obtener la información de los índices de cada tabla (con los campos que los componen).

Inventario tablas:

//UNLOAD EXEC PGM=IKJEFT01,DYNAMNBR=20
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(DB2D)
RUN PROGRAM(DSNTIAUL) PLAN(DSNTIAUL) -
LIB('LIBRERIA.DE.TU.INSTALACION')
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSPUNCH DD SYSOUT=*
//SYSREC00 DD DSN=XXXX.UNLOAD.TABLAS,
//            DISP=(NEW,CATLG,DELETE),UNIT=SYSDA,
//            SPACE=(CYL,(100,50),RLSE)
//SYSIN DD *
  SELECT B.TBNAME || ';' ||
        A.REMARKS || ';' ||
        B.NAME    || ';' ||
        CASE
         WHEN B.COLTYPE = 'INTEGER' THEN
           STRIP(B.COLTYPE,T,' ') || '(' ||
           STRIP(DIGITS(B.LENGTH),L,'0') || ')'
         WHEN B.COLTYPE = 'CHAR' THEN
           STRIP(B.COLTYPE,T,' ') || '(' ||
           STRIP(DIGITS(B.LENGTH),L,'0') || ')'
         WHEN B.COLTYPE = 'DECIMAL' THEN
           STRIP(B.COLTYPE,T,' ') || '(' ||
           STRIP(DIGITS(B.LENGTH),L,'0') || ',' ||
           STRIP(DIGITS(B.SCALE),L,'0') || ')'
        ELSE
           STRIP(B.COLTYPE,T,' ')
        END || ';' ||
        B.NULLS || ';' ||
        B.REMARKS
   FROM SYSIBM.SYSTABLES A
       ,SYSIBM.SYSCOLUMNS B
  WHERE A.NAME = B.TBNAME
    AND B.TBNAME LIKE 'TBPRU%'
    AND A.CREATOR = 'DB2O'
    AND B.CREATOR = 'DB2O'
 ORDER BY B.TBNAME,
          B.COLNO;
/*

Incluimos entre cada campo un separador ";" para poder guardar la información en un archivo .csv y poder abrirlo con el EXCEL.

El resultado una vez exportado a .csv sería:
Columna 1: Nombre físico
Columna 2: Nombre descriptivo
Columna 3: Campo
Columna 4: Tipo de dato
Columna 5: Acepta nulos
Columna 6: Descripción del campo

TBPRU01;TABLA NUMERO 1;CAMPO1;DECIMAL(9,2);N;ES EL CAMPO NUMERO 1


Inventario índices:

//UNLOAD EXEC PGM=IKJEFT01,DYNAMNBR=20
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(DB2D)
RUN PROGRAM(DSNTIAUL) PLAN(DSNTIAUL) -
LIB('LIBRERIA.DE.TU.INSTALACION')
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSPUNCH DD SYSOUT=*
//SYSREC00 DD DSN=XXXX.UNLOAD.INDICES,
//            DISP=(NEW,CATLG,DELETE),UNIT=SYSDA,
//            SPACE=(CYL,(100,50),RLSE)
//SYSIN DD *
SELECT A.TBNAME || ';' ||
     A.NAME || ';' ||
     B.COLNAME
FROM SYSIBM.SYSINDEXES A
    ,SYSIBM.SYSKEYS B
WHERE A.NAME = B.IXNAME
 AND A.TBNAME LIKE 'TBPRU%'
 AND A.CREATOR = 'DB2O'
 AND B.CREATOR = 'DB2O'
ORDER BY A.TBNAME
      ,A.NAME
      ,B.COLNO;
/*

El resultado una vez exportado a .csv sería:
Columna 1: Nombre físico tabla
Columna 2: Nombre índice
Columna 3: Campo

TBPRU01;INPRU011;CAMPO1


Y por supuesto podéis hacer las combinaciones de campos que os parezcan.

No hay comentarios.:

Publicar un comentario