Oracle PL/SQL – Plantilla de PL con Cursor Dinamico
En esta ocasion voy a compartir con ustedes una plantilla que evolucione a partir de la Plantilla de PL con Cursor que publique recientemente, precisaba que la sql fuera construida en tiempo de ejecución, y este es el método que encontre:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | CREATE OR REPLACE FUNCTION "DEV_PLANTILLA_CURSOR_DINAMICO" (p_input IN NUMBER DEFAULT 0) RETURN VARCHAR2 IS -- Raul Carrillo Garrido aka metsuke - www.metsuke.com -- Released Under LGPL License v3 (http://www.gnu.org/copyleft/lesser.html) sDebug BOOLEAN := TRUE; sDonde VARCHAR2(50) := 'DEV_PLANTILLA_CURSOR_DINAMICO'; testClause VARCHAR2(2000); -- clausula variable, ejemplo pero puede usarse de forma creativa. v_query VARCHAR2(2000); TYPE cur_typ IS REF CURSOR; c_datos CUR_TYP; TYPE reg_datos IS RECORD ( co_nombre VARCHAR2(300), co_id NUMBER ); datos reg_datos; resultado VARCHAR2(200); BEGIN -- validacion de datos . -- Construimos de forma dinamica la sql del cursor. -- Por ejemplo en este caso establecemos p_input como una lista para clausula in que puede o no aparecer. IF (p_input = '') THEN testClause := ''; ELSIF ( p_input IS NULL) THEN testClause := ''; ELSE testClause := ' AND id IN (' || p_input || ')'; END IF; -- Las dobles comillas simples para pintar una sola comilla dentro de la cadena. v_query := 'SELECT name, id FROM dual WHERE estado = ''ok'' ' || testClause || ' ORDER BY id'; OPEN c_datos FOR v_query; -- USING otro campo; //por si tengo que consultar como se hace en otro momento. LOOP FETCH c_datos INTO datos; EXIT WHEN c_datos%NOTFOUND; resultado := resultado || ',' || datos.co_id; END LOOP; CLOSE c_datos; --IF (sDebug) THEN P_Debug_Log(sDonde,p_input || ' =>' || resultado ); END IF; RETURN (resultado); EXCEPTION WHEN NO_DATA_FOUND THEN resultado := 'ERR: El parametro introducido no corresponde con ningun dato existente en la base de datos'; IF (sDebug) THEN P_Debug_Log(sDonde,p_input || ' =>' || resultado ); END IF; RETURN (resultado); WHEN OTHERS THEN resultado:= 'ERR: Error no definido - ' || SQLERRM; IF (sDebug) THEN P_Debug_Log(sDonde,p_input || ' =>' || resultado ); END IF; RETURN (resultado); END; / |
Esta plantilla esta en fase de experimentacion y pruebas asi que si tienen algo que aportar no duden en hacerlo.
Dependencias










Pueden consultar mis 