Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

procedimiento almacenado consulta

Estas en el tema de procedimiento almacenado consulta en el foro de Oracle en Foros del Web. Buenas, tengo este procedimiento, y le estoy pasando parametros a la consulta pero no me los acepta, ejemplo la variable tablas o CondFuente q solo ...
  #1 (permalink)  
Antiguo 28/10/2011, 13:00
 
Fecha de Ingreso: octubre-2011
Mensajes: 3
Antigüedad: 13 años, 1 mes
Puntos: 0
procedimiento almacenado consulta

Buenas, tengo este procedimiento, y le estoy pasando parametros a la consulta pero no me los acepta, ejemplo la variable tablas o CondFuente q solo tienen q tener valor si yo lo preciso.

pero no me acepta con ' + + '

q puedo hacer¿?¿?¿?

CREATE OR REPLACE procedure estados_clientes(tablas in varchar2,CondFuente in varchar2,sec in date,sFec2 in date,sdes out varchar2,scont out integer)
is
sdes1 varchar2(100);
scont1 integer;
begin

select estados.descripcion,count(clientes.cod_cliente) into sdes1,scont1
from clientes,estados,cliente_curso '+tablas+'
where clientes.cod_cliente=cliente_curso.cod_cliente_cur so '+CondFuente+'
and clientes.cod_estado=estados.cod_estado
and TO_DATE(cliente_curso.fecha_entrada) between '+sFec+' and '+sFec2+'
group by estados.descripcion order by count(clientes.cod_cliente) asc;
sdes:=sdes1;
scont:=scont1;
end estados_clientes;
  #2 (permalink)  
Antiguo 02/11/2011, 11:32
 
Fecha de Ingreso: noviembre-2007
Ubicación: Argentina
Mensajes: 134
Antigüedad: 17 años
Puntos: 3
Respuesta: procedimiento almacenado consulta

Hola Arekumaro,

Te adelanto que tu procedure no va a funcionar como pretendes. Porque existen algunas cosas que se pueden cambiar en tiempo de ejecucion y otras que no.

Los nombres de las tablas es una de las cosas que no se puede cambiar. Necesitas implementar SQL Dinamico haciendo uso de la sentencia EXECUTE IMMEDIATE para esto.

Otra opcion para solucionar el tema de las tablas podria ser:
En base al valor de parametro, en una estructura if preguntas: ¿ tablas es igual a TablaUno o a TablaDos? Y dependiendo del resultado ejecutas una consulta u otra. Si, las dos consultas deben repertirse totalmente solo que solamente ejecutas uno o la otra, me explico?

Esto es asi porque el procedure debe poder compilarse, por eso no puedes cambiarlo cuando esta en ejecucion, la idea de los procedures es que te evitas el tiempo de compilacion, entre otras cosas.

En el caso del CodFuente y su implementacion en la parte de los filtros de la consulta pasa lo mismo, no lo puedes cambiar. La misma solucion que para el parametro tablas debes implementar aqui.

Ahora con las fechas, en buena hora amigo, eso si tiene solucion. !!!
En la consulta deja las fechas de la siguiente manera.

Código SQL:
Ver original
  1. AND TO_DATE(CLIENTE_CURSO.FECHA_ENTRADA) BETWEEN TO_DATE(SFec, 'DD.MM.YYYY') AND TO_DATE(sFec2, 'DD.MM.YYYY') + 86399/86400

De esta manera puedes pasarlas las fechas como un String y no tener errores de compilacion.

Notas:

- Estoy notando que la tabla CLIENTE_CURSO tiene un campo FECHA_ENTRADA que es VARCHAR o VARCHAR2 y no es de tipo DATE. Porque es eso? Es realmente necesario que sea de tipo String y no de tipo fecha? Esta decision de mantener un campo de tipo String te afecta la performance de la consulta porque hace un full scan de la tabla CLIENTE_CURSO. Intenta corregir esto, notaras una mejora en el tiempo de resolucion de la consulta.

Y por ultimo, si lo que necesitas hacer es muy dinamico, es decir, que tu procedure tiene muchos valores distintos para el parametro tablas y CodFuente y esta solucion no te funciona, prueba con sqlplus. Lee un poco sobre esto.

Arekumaro, Exitos.
Saludos, Mario.
__________________
Y venció David al filisteo con honda y piedra; e hirió al filisteo y lo mató, sin tener David espada en su mano.

Etiquetas: procedimiento, procedure, select, tablas, almacenar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:17.