viernes, 7 de enero de 2022

DB2 - filas leídas por un cursor

Primero refrescaremos la memoria con los cursores y las operaciones básicas que se pueden realizar con los cursores. Para ello pincharemos aquí (eso sí, si consideras necesario refrescar la memoria; en caso contrario, no es necesario).

En ocasiones es necesario utilizar un cursor por las especificaciones dadas para implementar en un determinado programa. Si además queremos saber cuántas filas ha leído dicho cursor, ¿cómo se puede hacer? En un principio puede parecer un tanto complejo por los siguientes motivos:
  1. En la copy SQLCA no existe una variable para tal efecto.
  2. Si consultas diferentes foros en los que se trata esta duda, se llega a esta conclusión: no se puede saber de antemano cuántas filas va a leer dicho cursor.
  3. La variable ROWCOUNT se utiliza en gestores de BBDD como Sql Server  para saber cuántas filas devuelve una consulta, pero en DB2 no existe y, por tanto, en Cobol no encontrarás una variable que se use con tal fin (a menos que no definas por programa una variable auxiliar con dicho nombre).

Por lo tanto, llegados a este punto, ¿cómo podemos saber cuántas filas ha leído un cursor? A continuación explicamos una posible solución.

Al realizar el FETCH del cursor, cuando el SQLCODE es igual a 0 podemos incrementar en 1 una variable auxiliar, por ejemplo AUX-ROWCOUNT, que previamente estará inicializada a 0 (si se inicializa antes de abrir/tratar/cerrar el cursor, mejor que mejor).

Cuando hayamos realizado el tratamiento del cursor, con lo que ello implica, podremos saber cuántas filas han sido leídas por el cursor. Tratar un cursor implicaría lo siguiente:
  1. Abrir cursor
  2. Leer cursor
  3. Tratar cursor hasta el final del mismo, en donde se realizan dos operaciones:
    1. Operaciones a realizar con la fila recuperada del cursor
    2. Leer cursor
  4. Cerrar cursor

Y tras tratar el cursor dando estos pasos sabremos las filas leídas por el cursor gracias a la variable auxiliar que habremos ido incrementando en 1 con cada FETCH. En el caso de que el cursor no recuperara ninguna fila tendríamos dicha variable auxiliar con su valor de inicialización (es decir, 0).

¿Qué sucede si el cursor está dentro de un módulo o rutina? No es mayor problema. En la copy de E/S de dicho módulo o rutina, si estuviera correctamente codificada, debería haber una variable dentro de las variables de salida de la misma que se encargara de informarnos de cuántas filas han sido leídas por el cursor en cuestión. Dicha variable se podría llamar, por ejemplo, COPY-S-FIL-RECU-CURSOR o COPY-S-ROWCOUNT.

Si el programa o módulo/rutina no tiene definida una variable a tal efecto puesss....va a ser difícil saber cuántas filas ha leído el cursor. Es difícil pero no imposible, ¿sabéis por qué? Porque se puede aprovechar una modificación en el código para incluir dicha variable que cuente las filas leídas por el cursor y en ese momento ya tendríamos dicha información.

Pues esto ha sido todo, espero que os haya servido de ayuda.