Oracle

Cursores dinámicos en PL/SQL

Por : Jhons_1101
2018-08-14
Tags :
Los cursores dinámicos o SQL dinámico proporcionan una solución flexible para muchos problemas de programación, aunque también puede ser difícil de construir, depurar y entender su estructura (esto ya en una consulta de grandes proporciones).
Estas consultas dinámicas se hacen a partir de cadenas de caracteres entrecomillados o tambien por medio de q '[]'.

Para utilizar un SQL dinámicos en cursores sólo debemos construir nuestra sentencia SELECT en una variable de tipo caracter y ejecutarla con EXECUTE IMMEDIATE utilizando la palabra clave INTO.


DECLARE
    lvc_query          VARCHAR2(200);
    lnu_cantPaises     NUMBER(10);
BEGIN
    lvc_query := 'SELECT count(*) FROM PAIS';
    EXECUTE IMMEDIATE lvc_query INTO lnu_cantPaises;

    dbms_output.put_line('la cantidad de paises en la tabla es de :' || lnu_cantPaises);
END; 

/*
    ----------------------------------- 
    -- SALIDA 
    ----------------------------------- 
        ver la imagen siguiente...
*/


ejemplo cursor dinámico en PL/SQL

Claro que también podemos usar los cursores dinámicos con parámetros de entrada, con subquerys, con OPEN LOOP FETCH.
compartir en facebook compartir en Google compartir en Twitter compartir en Blogger compartir como código embebido compartir la url

Cursor dinámico con variables HOST



------------------------------------------------------------------------------------
-- Ejemplo de cursor con variables HOST
------------------------------------------------------------------------------------
DECLARE
    TYPE cur_type IS REF CURSOR;
    lrc_cursor    CUR_TYPE;

    fila PAIS%ROWTYPE;
    lvc_query     VARCHAR2(400);
    codigo_pais   NUMBER(3) := 57;
BEGIN

    lvc_query := 'SELECT * FROM PAIS WHERE COD_PAIS = :cpais';

    OPEN lrc_cursor FOR lvc_query USING codigo_pais;
    LOOP
        FETCH lrc_cursor INTO fila;
        EXIT WHEN lrc_cursor%NOTFOUND;

        dbms_output.put_line(fila.NOM_PAIS);
    END LOOP;
    CLOSE lrc_cursor;
END;

/*
    ----------------------------------- 
    -- SALIDA 
    ----------------------------------- 
        ver la imagen siguiente...
*/


ejemplo cursor dinámico en PL/SQL


Cursor dinámico con parámetros



------------------------------------------------------------------------------------
-- Ejemplo de cursor con parámetros
------------------------------------------------------------------------------------
DECLARE
    TYPE cur_type IS REF CURSOR;
    lrc_cursor    CUR_TYPE;

    fila PAIS%ROWTYPE;
    lvc_query     VARCHAR2(400);
    codigo_pais   NUMBER(3) := 850;
BEGIN

    lvc_query := 'SELECT * FROM PAIS WHERE COD_PAIS = ' || codigo_pais;

    OPEN lrc_cursor FOR lvc_query;
    LOOP
        FETCH lrc_cursor INTO fila;
        EXIT WHEN lrc_cursor%NOTFOUND;

        dbms_output.put_line(fila.NOM_PAIS);
    END LOOP;
    CLOSE lrc_cursor;
END;

/*
    ----------------------------------- 
    -- SALIDA 
    ----------------------------------- 
        ver la imagen siguiente...
*/


ejemplo cursor dinámico en PL/SQL

Si paramos a analizar los últimos dos cursores, podemos ver que su uso es muy parecido..
Pero existe otra manera que también podemos usar para hacer cursores dinámicos.
miremos...


------------------------------------------------------------------------------------
--   Ejemplo de cursor variables HOST con q'[]'
------------------------------------------------------------------------------------
DECLARE
    TYPE cur_type IS REF CURSOR;
    lrc_cursor    CUR_TYPE;

    fila PAIS%ROWTYPE;
    lvc_query     VARCHAR2(400);
    codigo_pais   NUMBER(3) := 57;
BEGIN

    lvc_query := q'[SELECT * FROM PAIS WHERE COD_PAIS = :codigo_pais]';

    OPEN lrc_cursor FOR lvc_query USING  codigo_pais;
    LOOP
    FETCH lrc_cursor INTO fila;
    EXIT WHEN lrc_cursor%NOTFOUND;

    dbms_output.put_line(fila.NOM_PAIS);
    END LOOP;
    CLOSE lrc_cursor;
END;

/*
    ----------------------------------- 
    -- SALIDA 
    ----------------------------------- 
        COLOMBIA...
*/


------------------------------------------------------------------------------------
--   Ejemplo de cursor con parámetros q'[]'
------------------------------------------------------------------------------------
DECLARE
    TYPE cur_type IS REF CURSOR;
    lrc_cursor    CUR_TYPE;

    fila PAIS%ROWTYPE;
    lvc_query     VARCHAR2(400);
    codigo_pais   NUMBER(3) := 850;
BEGIN

    lvc_query := q'[SELECT * FROM PAIS WHERE COD_PAIS = ]' || codigo_pais;

    OPEN lrc_cursor FOR lvc_query;
    LOOP
    FETCH lrc_cursor INTO fila;
    EXIT WHEN lrc_cursor%NOTFOUND;

    dbms_output.put_line(fila.NOM_PAIS);
    END LOOP;
    CLOSE lrc_cursor;
END;

/*
    ----------------------------------- 
    -- SALIDA 
    ----------------------------------- 
        COREA DEL NORTE...
*/



O una mezcla de los dos también es posible, no recomendable, pero posible...



DECLARE
    lnu_genero NUMBER (1) := 2; -- MASCULINO
    pty_no_identificacion VARCHAR (15) := '12345600';
    
    TYPE TYPE_CURSOR IS REF CURSOR;
    lcu_dinamico TYPE_CURSOR;
    
    lvc_nomestudiante VARCHAR2 (100);
    
    lvc_query VARCHAR2(600) := q'[SELECT 
        NOM1_ESTUDIANTE || ' - ' || NOM2_ESTUDIANTE || ' - ' ||
        AP1_ESTUDIANTE  || ' - ' || AP2_ESTUDIANTE  
        AS NOMBRE_ESTUDIANTE FROM ESTUDIANTE WHERE COD_GENERO = :lnu_genero
    ]';
BEGIN
    IF lnu_genero = 1 THEN -- 1 = masculino

        -- por este tipo de comillado es importante usar q '[]'
        lvc_query := lvc_query || ' AND NO_IDENTIFICACION = ''' || pty_no_identificacion||''''; 
        OPEN lcu_dinamico FOR lvc_query USING lnu_genero;
        LOOP
        FETCH lcu_dinamico INTO lvc_nomestudiante;
            EXIT WHEN lcu_dinamico%NOTFOUND;
                
            dbms_output.put_line(UPPER(lvc_nomestudiante));
        END LOOP;
        CLOSE lcu_dinamico;
    ELSE
        OPEN lcu_dinamico FOR lvc_query USING lnu_genero;
        LOOP
        FETCH lcu_dinamico INTO lvc_nomestudiante;
            EXIT WHEN lcu_dinamico%NOTFOUND;
                
            dbms_output.put_line(lvc_nomestudiante);
        END LOOP;
        CLOSE lcu_dinamico;
    END IF;
END;
/*
----------------------------------- 
-- SALIDA 
----------------------------------- 
    ATENCIÓN: si esta linea [IF lnu_genero = 1 THEN -- 1 = masculino] está en 1, mostrará ...
    JOHN - STIVEN - VARGAS-
    Notemos que al final nos deja una line media. esto quiere decir que 
    no tiene segundo apellido... Pero ara poder que nos funcione, el número de identificación 
    debemos cambiarlo por este valor 123456, si por el contrario está en 2, mostrará .. 
    Luisa - andrea - lópez- pérea
    tal cual está escrito en la DB.
*/







Si este contenido te fue útil, no olvides compartirlo en redes sociales, Considéralo. Puede ser la manera de agradecer!


Agrega tu comentario...

Puedes utilizar etiquetas <pre></pre>, <p></p>, <div></div>, + (Nombre usuario, para responderle a alguien)

ily6I5P





Este post no tiene comentarios, sé el primero en hacerlo
Esta entrada no cuenta con imágenes adjuntas

Unete al grupo de whatsApp +57 316 392 6456

Sigue el grupo en facebook

Siguenos.....