Metsu 3.0

Ad astra per aspera

Oracle PL/SQL – Plantilla de PL con Cursor Dinamico

Filed under: Metsu 3.0 — metsuke at 1:00 am on Friday, January 30, 2009

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


  • Print
  • email
  • Google Bookmarks
  • Digg
  • BarraPunto
  • Technorati
  • Slashdot
  • del.icio.us
  • Facebook
  • Reddit
  • Sphinn
  • Mixx
  • Live
  • MySpace
  • Ping.fm
  • Twitter
  • Bitacoras.com
  • Faves
  • Furl
  • Identi.ca
  • N4G
  • LinkedIn
  • Netvibes
  • StumbleUpon
  • Haohao
  • MSN Reporter
  • PDF
  • RSS
  • SphereIt
  • Wikio
  • Socialogs

4 Comments »

212

Comment by Candle

March 13, 2009 @ 9:03 pm

Muchas gracias por la plantilla Raul, me funciona perfectamente en SQL*Plus y con ella evito tener que usar nvl’s y decodes en la where de consultas con muchos parámetros… que muchas veces la mayoría de estos parámetros son nulos

… pero no puedo compilarlo en un módulo de un form. No entiendo nada…la ud. de programa que funciona OK en el SQL*Plus no compila el form. ¿?¿?¿?

El error de compilación dice que se esperaba select (y se encuentra v_query), en la linea donde va a abrir el cursor

OPEN c_datos FOR v_query

Por lo pronto intentaré atualizar la versión de Forms Builder (no sé qué versión de PL/SQL usa)… la BD es 10g.

¿A tí te compila bien dentro de una unidad de programa de un form?

Reitero las gracias y saludos
P

213

Comment by metsuke

March 13, 2009 @ 11:26 pm

Gracias por el apoyo , me alegro de que te ahorre trabajo :)

En cuanto a la pregunta, lo cierto es que me pillas fuera de juego, no use nunca Oracle Forms, por ahora uso pls compilados como functions.

Lo que igual el sistema de forms no usa la ultima version de PL/SQL, esa forma de trabajar la prepare con la ayuda de un libro sobre la version 10g que es la que tengo a mano, e igual es una caracteristica nueva.

O quiza esa forma de hacer dinamico no le guste al sistema de oracle forms aunque me resulta extraño porque al fin y al cabo es el motor de pl y por extension el nucleo sql el que procesa la info, y ese al menos en teoria debiera ser unico para todo el sistema.

Googleare un poco para ver si averiguo algo pero por desgracia en este momento no se responder a su pregunta con una solucion concreta.

Saludos

Raul

406

Comment by calabuch

February 17, 2010 @ 10:15 am

increíble, me has salido en una búsqueda sobre sql dinámico, je je … de verdad que no esperaba encontrarte en esto.
andas metido en tó.
saludos.
:-)

407

Comment by metsuke

February 17, 2010 @ 2:57 pm

jejeje, ahora lo tengo algo mas paradillo pero si, tuve que meterme en “ElCaro” xDDD :**

RSS feed for comments on this post. TrackBack URI

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">