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.