Mostrando entradas con la etiqueta where. Mostrar todas las entradas
Mostrando entradas con la etiqueta where. Mostrar todas las entradas

miércoles, 2 de noviembre de 2016

Cobol: Utilizar cursor en un programa

En ocasiones tenemos que utilizar cursores en los programas cobol. Así que en esta entrada aprenderemos a declarar y utilizar los cursores en un programa cobol.

La declaración de un cursor no es más que definir una SELECT a una tabla. Dicha consulta puede devolvernos 0, 1 o más filas; todo depende de si existe en la tabla alguna/s fila/s que cumpla/n o no la cláusula WHERE definida.

Lo primero de todo es definir el cursor en la WORKING-STORAGE SECTION del programa cobol tal y como se indica a continuación:

          EXEC SQL
             DECLARE CURSOR CUR_TABLA FOR
              SELECT CAMPO1,
                         CAMPO2,
                         CAMPO3,
                         CAMPO4,
                         CAMPO5
                FROM TABLA1
               WHERE CAMPO1 = :TABLA1.CAMPO1
                   AND CAMPO2 > :TABLA1.CAMPO2
               ORDER BY CAMPO1, CAMPO2
          END-EXEC

También declararemos un switch:

          01 SW-FIN-CURSOR.
              05 SI-FIN-CURSOR             PIC X(01) VALUE 'S'.
              05 NO-FIN-CURSOR            PIC X(01) VALUE 'N'.

Hay tres operaciones básicas que podemos hacer con un cursor:
  • Apertura del cursor: OPEN <Nombre_del_cursor>
  • Lectura del cursor: FETCH <Nombre_del_cursor>
  • Cierre del cursor: CLOSE <Nombre_del_cursor>

En el programa existirán 3 párrafos que realizarán dichas operaciones:

     APERTURA-CURSOR.

         SET NO-FIN-CURSOR TO TRUE
         MOVE ENT-CAMPO1   TO CAMPO1 OF TABLA1
         MOVE ENT-CAMPO2   TO CAMPO2 OF TABLA1

           EXEC SQL
              OPEN CUR_TABLA
           END-EXEC.

         IF SQLCODE NOT EQUAL ZEROES
             PERFORM FIN-ERR-DB2
         END-IF.

     LECTURA-CURSOR.

           EXEC SQL
              FETCH CUR_TABLA
                 INTO :TABLA.CAMPO1,
                            :TABLA.CAMPO2,
                            :TABLA.CAMPO3,
                            :TABLA.CAMPO4,
                            :TABLA.CAMPO5
           END-EXEC.

         EVALUATE SQLCODE
             WHEN ZEROES
                  CONTINUE
             WHEN +100
                  SET SI-FIN-CURSOR TO TRUE
             WHEN OTHER
                  PERFORM FIN-ERR-DB2
         END-EVALUATE.

     CIERRE-CURSOR.

           EXEC SQL
              CLOSE CUR_TABLA
           END-EXEC.

         IF SQLCODE NOT EQUAL ZEROES
             PERFORM FIN-ERR-DB2
         END-IF.

Nota: ENT-CAMPO1 y ENT-CAMPO2 serán dos variables previamente declaradas en el programa cobol y tienen que ser del mismo tipo que las variables CAMPO1 y CAMPO2 de la tabla TABLA1. Ambas variables deberán contener algún valor válido (espacios o 'CAD' si son alfanuméricos, ceros o 59 si son numéricos, ect).  También se podría haber asignado valores dichos valores directamente sin la utilización de variables auxiliares.

Cuando se realice el PROCESO en el programa cobol, tendremos algo como lo siguiente:

          PERFORM APERTURA-CURSOR
          PERFORM LECTURA-CURSOR

          PERFORM TRATAMIENTO-CURSOR
               UNTIL SI-FIN-CURSOR

          PERFORM CIERRE-CURSOR

En el párrafo TRATAMIENTO-CURSOR se ejecutará el código que se tenga que ejecutar con el objetivo de tratar la información leída del cursor y por último se ejecutará una lectura del cursor. Es decir, tendríamos algo como lo siguiente:

     TRATAMIENTO-CURSOR.

          <<Sentencias>>
          PERFORM LECTURA-CURSOR.

Esto ha sido todo, espero que te haya servido de ayuda.

viernes, 5 de agosto de 2016

Cobol: Utilizar cursor for update en un programa

En ocasiones tenemos que utilizar cursores en los programas cobol. En una entrada anterior ya vimos cómo se definían los cursores y cómo se manejaban (pinchar aquí para ver dicha entrada). 

También existen los cursores FOR UPDATE. Estos cursores se utilizan cuando queremos seleccionar una serie de filas de una tabla y modificar la información contenida en dichas filas. Así que en esta entrada aprenderemos a declarar y utilizar los cursores for update en un programa cobol.

La declaración de un cursor no es más que definir una SELECT a una tabla. Dicha consulta puede devolvernos 0, 1 o más filas; todo depende de si existe en la tabla alguna/s fila/s que cumpla/n o no la cláusula WHERE definida.

Lo primero de todo es definir el cursor en la WORKING-STORAGE SECTION del programa cobol tal y como se indica a continuación:

          EXEC SQL
             DECLARE CURSOR CUR_TABLA FOR
              SELECT CAMPO1,
                         CAMPO2,
                         CAMPO3,
                         CAMPO4
                FROM TABLA1
               WHERE CAMPO1 = :TABLA1.CAMPO1
               FOR UPDATE OF CAMPO2CAMPO3, CAMPO4
          END-EXEC

También declararemos el mismo switch de la entrada anterior, es decir:

          01 SW-FIN-CURSOR.
              05 SI-FIN-CURSOR             PIC X(01) VALUE 'S'.
              05 NO-FIN-CURSOR            PIC X(01) VALUE 'N'.

Se mantienen las tres operaciones básicas que vimos en la anterior entrada:
  • Apertura del cursor: OPEN <Nombre_del_cursor>
  • Lectura del cursor: FETCH <Nombre_del_cursor>
  • Cierre del cursor: CLOSE <Nombre_del_cursor>
En el programa existirán los 3 mismos párrafos vistos en la anterior entrada (APERTURA-CURSOR, LECTURA-CURSOR, CIERRE-CURSOR). Se incluirá un párrafo más para realizar la actualización de la información:

     ACTUALIZACION-CURSOR.

         EXEC SQL
              UPDATE TABLA1
                      SET CAMPO2 = :UPD-CAMPO2,
                              CAMPO3 = :UPD-CAMPO3,
                              CAMPO3 = :UPD-CAMPO4
                 WHERE CURRENT OF CUR_TABLA
           END-EXEC.

         IF SQLCODE NOT EQUAL ZEROES
             PERFORM FIN-ERR-DB2
         END-IF.

Nota: UPD-CAMPO2, UPD-CAMPO3 y UPD-CAMPO4 serán variables previamente declaradas en el programa cobol. Tienen que ser del mismo tipo que los campos CAMPO2, CAMPO3 y CAMPO4 de la tabla TABLA1. Las mencionadas variables deberán contener algún valor válido (espacios o 'CAD' si son alfanuméricos, ceros o 59 si son numéricos, ect).
De este modo no tendríamos que indicarle al UPDATE la clave del registro a actualizar, pues actualizaría el registro recuperado por el FETCH.

Cuando se realice el PROCESO en el programa cobol, tendremos algo como lo siguiente:

          PERFORM APERTURA-CURSOR
          PERFORM LECTURA-CURSOR

          PERFORM TRATAMIENTO-CURSOR
               UNTIL SI-FIN-CURSOR

          PERFORM CIERRE-CURSOR

En el párrafo TRATAMIENTO-CURSOR se ejecutará el código que se tenga que ejecutar con el objetivo de tratar la información leída del cursor y por último se ejecutará una lectura del cursor. Es decir, tendríamos algo como lo siguiente:

     TRATAMIENTO-CURSOR.

          <<Sentencias>>
          PERFORM ACTUALIZACION-CURSOR
          PERFORM LECTURA-CURSOR.

Esto ha sido todo, espero que te haya servido de ayuda.