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.