lunes, 15 de febrero de 2016

DECLARACION Y USO DE CURSORES EN INFORMIX 4GL - Declaring Cursors in Informix 4gl

Una de las herramientas mas potentes en Informix 4gl es el uso de cursores para obtener información de la base de datos. Voy a comentaros cómo se declaran y las formas que conozco de explotarlos.
La forma de declararlos es muy sencilla:

DECLARE myCursor CURSOR FROM
SELECT * FROM tabla
WHERE condiciones

Es decir, definimos un CURSOR con el nombre que queramos (myCursor en el ejemplo) asociado a una query que nos aportará los datos que necesitamos.
Existen dos formas distintas de abrir el cursor y empezar a explotar la informacion aportada:

* Uso de FOREACH:

DEFINE datosCliente RECORD LIKE clientes.*

DECLARE myCursor CURSOR FOR
SELECT * FROM clientes
WHERE condiciones

FOREACH myCursor INTO datosCliente
   ---
   ---
   ---
END FOREACH
FREE myCursor

* Uso de OPEN - CLOSE

DEFINE datosCliente RECORD LIKE clientes.*

DECLARE myCursor CURSOR FOR
SELECT * FROM clientes
WHERE condiciones

OPEN myCursor
FETCH myCursor INTO datosCliente
IF STATUS = 0 THEN
    WHILE TRUE
        ---
        ---
        ---
        FETCH myCursor INTO datosCliente        
        IF STATUS = NOTFOUND THEN
           EXIT WHILE
        END IF
    END WHILE
END IF
CLOSE myCursor
FREE myCursor

No hay diferencias en cuanto al uso de uno u otro método, pero yo recomiendo usar OPEN - CLOSE para realizar REPORTS por una razón muy sencilla, al realizar el primer FETCH podemos averiguar si el cursor nos va a devolver alguna información. De esta forma podemos hacer el START REPORT seguros de que al menos va a tener una linea.

DECLARE myCursor CURSOR FOR
SELECT * FROM clientes
WHERE condiciones

OPEN myCursor
FETCH myCursor INTO datosCliente
IF STATUS = 0 THEN
    ##
    ## Inicio el Report cuando sé que va a tener contenido
    ##
    START REPORT myReport TO printer
    WHILE TRUE
        OUTPUT TO REPORT miReport (datosCliente)
        FETCH miCursor INTO datosCliente
        IF STATUS = NOTFOUND THEN
            EXIT WHILE
        END IF
    END WHILE
    ##
    ## Finalizo el Report cuando salgo del while
    ##
    FINISH REPORT myReport
END IF
CLOSE myCursor
FREE myCursor

Espero que os sea de utilidad... hasta la próxima.

No hay comentarios:

Publicar un comentario