Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-10-2012
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Funcion IN en Procedimiento Almacenado

Estimados, estoy intentando crear un procedimiento con una variable de entrada que sea de tipo varchar, tal que esta varible haga referencia a al identificador que deseo buscar.
Creo que lo mejor es un ejemplo, solo muestro la parte donde tengo problema.

Código SQL [-]
begin
for select id_item, nombre from insumos into :id_item, :nombre do
begin
 select coalesce(avg(precio),0), coalesce(sum(cantidad),0) from inventario
 where id_bodega in (:bodegas) and id_item =:id_item into recio_ingreso, :cantidad_ingreso;
end
suspend
end

La variable de entradad la genero en Delphi según las necesidades del usuario, y puede ser por ejemplo (1), (2, 3), (1, 2, 3, 4).

el problema esta en que me arroja un error, ya que trata de convertir la cadena en integer, ya que el campo id_bodega es entero.

Si ejecuto esta sentencia como una consulta directamente no me arroja error, el problema está en que necesariamente debo ejecutarla dentro de un procedimiento almacenado.

Como puedo pasarle esta variable al procedimiento?
Responder Con Cita
  #2  
Antiguo 03-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
En principio... deberías poner el código completo del procedimiento, nos estamos perdiendo datos.
Responder Con Cita
  #3  
Antiguo 03-10-2012
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
lo que esta faltando es la declaracion de la varialbes de entrada y salida, las de salida están ok, la de entrada es donde tengo problema, ya que la he definido como varchar ya que quiero buscar en varias bodega, por esto la consulta en el procedimiento con la condición "IN". He aqui el problema, ya que el campo id_bodega de la tabla inventario es de tipo integer, sin embargo, yo intreso una cadena para que debe buscar en mas de una bodega... por ejemplo:

- (1)
- (1,3)
- (2,3,5)

Espero se entienda, y me puedan ayudar a resolverlo. Utilizo Firebird 2.5.
Responder Con Cita
  #4  
Antiguo 03-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Dudo que eso funcione (no puedo asegurarlo al 100%), para lo que quieres es posible que tengas que usar execute_statement, haz una búsqueda, se ha tratado en diversas ocasiones.
Básicamente se trata de componer la sentencia completa y pasarla como una cadena, resumiendo:

Código SQL [-]
sentencia := 'select * from tbtabla where id=5';
execute_statement( sentencia );
Responder Con Cita
  #5  
Antiguo 03-10-2012
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Ojito que el predicado "in" es limitado. Le caben creo 1024 elementos o algo así, pero sigue siendo limitado.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 03-10-2012
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 910
Poder: 22
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Podría ser algo así...
Código SQL [-]
    FOR SELECT id_item, nombre
        FROM insumos
        INTO :id_item, :nombre
    DO
    BEGIN
         EXECUTE STATEMENT ('SELECT coalesce(avg(precio),0), coalesce(sum(cantidad),0)
                             FROM inventario
                             WHERE id_bodega in (:bodegas) AND id_item =:id_item INTO recio_ingreso, :cantidad_ingreso')
                            (bodegas:=:Bodegas, id_item:=:Id_item);
         suspend;
    end

El parametro :Bodegas deberia ser enviado así '1,2,...', quedando la sentencia id_bodega in (1,2,3)

Espero te ayude, saludos cordiales
Responder Con Cita
  #7  
Antiguo 03-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Seguro que no lo has probado porque eso no funciona.
Tienes que pasarle la cadena completa ya formada.
O sea, algo como lo que te he puesto en el ejemplo anterior, 'montas' la cadena en una variable y la llamas con execute_statement.
Responder Con Cita
  #8  
Antiguo 03-10-2012
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
gracias a todos por sus comentarios, finalmente el tema lo resolví asi.

Código SQL [-]
begin
for select id_item, nombre from insumos
into :id_item, :nombre do
begin
execute statement
'select coalesce(avg(precio),0), coalesce(sum(cantidad),0) from inventario
where id_item ='||:id_item||' and id_bodega in '||(:bodegas)
into recio_ingreso, :cantidad_ingreso;
suspend;
end
end

Esto funciona bien y rápido, sin embargo, como se comportará al tener muchos más registros?
El comando execute statement es igual de eficiente que una consulta directa?

Gracias nuevamente.
Responder Con Cita
  #9  
Antiguo 03-10-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por mjjj Ver Mensaje
El comando execute statement es igual de eficiente que una consulta directa?
No, no es tan rápido, pero sólo lo notarás en consultas muy complejas con muchas tablas involucradas.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Procedimiento almacenado efelix MS SQL Server 7 21-11-2007 18:53:00
Procedimiento Almacenado rodrigo19 Oracle 5 22-08-2007 23:55:40
Procedimiento almacenado LucianoRey MS SQL Server 2 23-08-2005 01:37:06
Creando funcion o procedimiento almacenado buffygcs MS SQL Server 3 05-05-2005 10:44:56
Procedimiento almacenado y Ado LucianoRey MS SQL Server 11 06-07-2004 23:55:23


La franja horaria es GMT +2. Ahora son las 23:00:52.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi