miércoles, 27 de abril de 2016

USO DE CURSORES DINAMICOS EN INFORMIX 4GL - Using dynamic Cursors in Informix 4gl

Si la query asociada a la declaración de un CURSOR puede variar en funcion de determinadas condiciones, no nos queda mas remedio que definirlo de manera dinámica a partir de una variable:

Por ejemplo, imaginemos que queremos seleccionar los pedidos del ultimo año, pero el usuario puede optar por filtrar su pais de origen o no.
Dependiendo de si existe un filtro o no deberemos incluir un JOIN en nuestra QUERY:

Montamos la query en una variable de texto:

DEFINE myQuery CHAR(300) ,
            datosPedido LIKE pedidos.*,
            filtro CHAR(30)
---
---
---
LET myQuery = "SELECT pedidos.* FROM pedidos"
##
## Incluyo la tabla de paises si se ha definido un filtro
##
IF filtro IS NOT NULL THEN
    LET myQuery = myQuery CLIPPED, ", paises"
END IF
LET myQuery = myQuery CLIPPED,
    " WHERE pedidos.fecha BETWEEN '01/01/2015' AND '31/12/2015'
##
## Incluyo las condiciones de Join con la tabla de paises
##
IF filtro IS NOT NULL THEN
    LET myQuery = myQuery CLIPPED,
         "  AND paises.nombre = ", filtro,
         "  AND pedidos.id_pais = paises.id_pais"
END IF

Una vez montada la query en la variable de texto, declaramos el CURSOR:

##
## Preparo la variable que contiene la query antes de declarar el cursor
##
PREPARE mySql FROM myQuery
DECLARE myCursor CURSOR FOR  mySql
FOREACH myCursor INTO datosPedido
    ----
    ----
    ----
END FOREACH
FREE myCursor
FREE mySql

Hay que destacar que tenemos que hacer un FREE tanto del cursor como de la instruccion preparada para liberar recursos.


Hasta la próxima.

No hay comentarios:

Publicar un comentario