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

return select

Estas en el tema de return select en el foro de PostgreSQL en Foros del Web. hola amigos tengo un problema necesito retornar un select con todas las filas y columnas que pueda traer y no se como hacerlo... este es ...
  #1 (permalink)  
Antiguo 09/08/2010, 11:15
Avatar de death_nemesis  
Fecha de Ingreso: abril-2009
Ubicación: Santiago - Chile
Mensajes: 147
Antigüedad: 15 años
Puntos: 2
return select

hola amigos tengo un problema necesito retornar un select con todas las filas y columnas que pueda traer y no se como hacerlo...
este es el codigo que tengo, ojala me puedan ayudar

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION prueba(idTaller INTEGER, Alias VARCHAR(255)) RETURNS SETOF VEHICULOS AS $$
  2. --DECLARE
  3.  
  4. BEGIN
  5.     RETURN QUERY EXECUTE 'select count(VEHICULOS.id_vehiculo)as Vehiculos_taller,locales.capacidad_instalada as Capacidad_Taller from SINIESTROS,COMPANIAS,VEHICULOS,LOCALES,TALLERES
  6.     where SINIESTROS.id_compania = COMPANIAS.id_compania and SINIESTROS.id_vehiculo = VEHICULOS.id_vehiculo and VEHICULOS.id_estado <> 12 and
  7.     VEHICULOS.id_local   = LOCALES.id_local and LOCALES.id_taller = TALLERES.id_taller and TALLERES.id_taller ='||idTaller||' and COMPANIAS.alias = upper('||Alias||')
  8.     group by locales.capacidad_instalada UNION  select count(VEHICULOS.id_vehiculo),locales.capacidad_instalada from SINIESTROS,COMPANIAS,VEHICULOS,LOCALES,TALLERES
  9.     where SINIESTROS.id_compania = COMPANIAS.id_compania and SINIESTROS.id_vehiculo = VEHICULOS.id_vehiculo and VEHICULOS.id_estado <> 12 and
  10.     VEHICULOS.id_local   = LOCALES.id_local and LOCALES.id_taller = TALLERES.id_taller and TALLERES.id_taller = '||idTaller||' and COMPANIAS.alias <> upper('||Alias||')
  11.     group by locales.capacidad_instalada';
  12.    
  13. END;
  14. $$
  15. LANGUAGE plpgsql;
  #2 (permalink)  
Antiguo 09/08/2010, 12:43
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: return select

Mirate esto
http://www.depesz.com/index.php/2008...uple_fraction/

En el retorno debes hacerlo como record al ser una consulta que involucra varias tablas.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 09/08/2010, 13:25
Avatar de death_nemesis  
Fecha de Ingreso: abril-2009
Ubicación: Santiago - Chile
Mensajes: 147
Antigüedad: 15 años
Puntos: 2
Respuesta: return select

oka huesos52 lo estoy revisando apenas tenga resultados ( buenos o malos) comento
  #4 (permalink)  
Antiguo 09/08/2010, 13:36
Avatar de death_nemesis  
Fecha de Ingreso: abril-2009
Ubicación: Santiago - Chile
Mensajes: 147
Antigüedad: 15 años
Puntos: 2
Respuesta: return select

me fue mal viejo lo deje así
Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION prueba(IN idTaller INTEGER,IN Alias VARCHAR(255),OUT VehiculosTaller BIGINT,OUT CapacidadTaller SMALLINT) RETURNS SETOF RECORD AS $BODY$
  2. DECLARE
  3. use_sql TEXT;
  4. BEGIN
  5.        use_sql := 'select count(VEHICULOS.id_vehiculo)as VehiculosTaller,locales.capacidad_instalada as CapacidadTaller from SINIESTROS,COMPANIAS,VEHICULOS,LOCALES,TALLERES
  6.     where SINIESTROS.id_compania = COMPANIAS.id_compania and SINIESTROS.id_vehiculo = VEHICULOS.id_vehiculo and VEHICULOS.id_estado <> 12 and
  7.     VEHICULOS.id_local   = LOCALES.id_local and LOCALES.id_taller = TALLERES.id_taller and TALLERES.id_taller =' || idTaller ||'
  8.     and COMPANIAS.alias = upper(' || Alias ||' )
  9.     group by locales.capacidad_instalada UNION ALL select count(VEHICULOS.id_vehiculo),locales.capacidad_instalada from SINIESTROS,COMPANIAS,VEHICULOS,LOCALES,TALLERES
  10.     where SINIESTROS.id_compania = COMPANIAS.id_compania and SINIESTROS.id_vehiculo = VEHICULOS.id_vehiculo and VEHICULOS.id_estado <> 12 and
  11.     VEHICULOS.id_local   = LOCALES.id_local and LOCALES.id_taller = TALLERES.id_taller and TALLERES.id_taller = ' || idTaller ||' and COMPANIAS.alias <> upper(' || Alias ||')
  12.     group by locales.capacidad_instalada';
  13.     RETURN QUERY EXECUTE use_sql;
  14. $BODY$
  15. LANGUAGE plpgsql;

y me tira este error

Código SQL:
Ver original
  1. ERROR:  syntax error at END OF INPUT
  2. LINE 14: $BODY$
  3.          ^
  4.  
  5. ********** Error **********
  #5 (permalink)  
Antiguo 09/08/2010, 13:51
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: return select

Falta el END antes del $BODY$.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 09/08/2010, 14:01
Avatar de death_nemesis  
Fecha de Ingreso: abril-2009
Ubicación: Santiago - Chile
Mensajes: 147
Antigüedad: 15 años
Puntos: 2
Respuesta: return select

Código SQL:
Ver original
  1. ERROR:  syntax error at OR near "END"
  2. LINE 36: END;
  3.          ^
  4.  
  5. ********** Error **********
  6.  
  7. ERROR: syntax error at OR near "END"
  8. Estado SQL:42601
  9. Caracter: 2479
  #7 (permalink)  
Antiguo 09/08/2010, 14:07
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: return select

death_nemesis acabo de hacer una prueba con el ejemplo que te sugerí y una consulta que me involucraba 2 tablas de mi base de datos. He probado y me anda de lujos. Lo que tienes es un error de sintaxis que puede estar escondido en la construcción de tu cadena. Revisa con cuidado donde puede estar fallando tu código.

2 cosas.
Vuelve a postear la totalidad del codigo.
Hazte una función aparte donde puedas retornar como texto la variable use_sql para tener la certeza que la sentencia se está armando correctamente,

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 09/08/2010, 14:19
Avatar de death_nemesis  
Fecha de Ingreso: abril-2009
Ubicación: Santiago - Chile
Mensajes: 147
Antigüedad: 15 años
Puntos: 2
Respuesta: return select

ya mira viejo me funciona pero a medias este es el codigo

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION prueba(idTaller INTEGER,IN Alias VARCHAR(255),OUT VehiculosTaller BIGINT,OUT CapacidadTaller SMALLINT) RETURNS SETOF RECORD AS $BODY$
  2. DECLARE
  3.     use_sql TEXT;
  4. BEGIN  
  5. use_sql := 'select count(VEHICULOS.id_vehiculo)as VehiculosTaller,locales.capacidad_instalada as CapacidadTaller from SINIESTROS,COMPANIAS,VEHICULOS,LOCALES,TALLERES
  6. where SINIESTROS.id_compania = COMPANIAS.id_compania and SINIESTROS.id_vehiculo = VEHICULOS.id_vehiculo and VEHICULOS.id_estado <> 12 and
  7. VEHICULOS.id_local   = LOCALES.id_local and LOCALES.id_taller = TALLERES.id_taller and TALLERES.id_taller = 5 and
  8. COMPANIAS.alias = upper(''bci'')group by locales.capacidad_instalada UNION ALL
  9. select count(VEHICULOS.id_vehiculo),locales.capacidad_instalada from SINIESTROS,COMPANIAS,VEHICULOS,LOCALES,TALLERES
  10. where SINIESTROS.id_compania = COMPANIAS.id_compania and SINIESTROS.id_vehiculo = VEHICULOS.id_vehiculo and VEHICULOS.id_estado <> 12 and
  11. VEHICULOS.id_local   = LOCALES.id_local and LOCALES.id_taller = TALLERES.id_taller and TALLERES.id_taller = 5 and COMPANIAS.alias <> upper(''bci'')
  12. group by locales.capacidad_instalada';  
  13. RETURN QUERY EXECUTE use_sql;  
  14. END;
  15. $BODY$
  16. LANGUAGE plpgsql;
  17. -- estos valores fueron por poner nomas ya que despues voy a arreglar lo de la concatenacion
  18. SELECT prueba (5,'text');
Código SQL:
Ver original
  1. Prueba
  2. Record
  3. -------------
  4. "(2,30)"
  5. "(1,30)"
la idea es que aparesca asi

Código SQL:
Ver original
  1. VehiculosTaller            CapacidadTaller  
  2. -------------------        -----------------------
  3.         2                               30
  4.         1                               30
  #9 (permalink)  
Antiguo 09/08/2010, 14:20
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: return select

Ejecutalo así
Código SQL:
Ver original
  1. SELECT *FROM prueba(5,'text');

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 09/08/2010, 14:26
Avatar de death_nemesis  
Fecha de Ingreso: abril-2009
Ubicación: Santiago - Chile
Mensajes: 147
Antigüedad: 15 años
Puntos: 2
Respuesta: return select

vale huesos52 ya esta funcionando bien....ahora termino lo de la concatenacion y posteo el codigo por si a alguien mas le sirve
  #11 (permalink)  
Antiguo 09/08/2010, 14:32
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: return select

__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #12 (permalink)  
Antiguo 09/08/2010, 14:44
Avatar de death_nemesis  
Fecha de Ingreso: abril-2009
Ubicación: Santiago - Chile
Mensajes: 147
Antigüedad: 15 años
Puntos: 2
Respuesta: return select

jajaj ahora tengo otro problema resulta que al concatenar la variable me tira un resultado que no me sirve pero al no concatenar me tira bien el resultado

creo que se explica mejor con el codigo

CONCATENADO alias (No me sirve el resultado)

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION prueba(idTaller INTEGER,IN alias VARCHAR(255),OUT VehiculosTaller BIGINT,OUT CapacidadTaller SMALLINT) RETURNS SETOF RECORD AS $BODY$
  2. DECLARE
  3.     use_sql TEXT;
  4. BEGIN  
  5. use_sql := 'select count(VEHICULOS.id_vehiculo)as VehiculosTaller,locales.capacidad_instalada as CapacidadTaller from SINIESTROS,COMPANIAS,VEHICULOS,LOCALES,TALLERES
  6. where SINIESTROS.id_compania = COMPANIAS.id_compania and SINIESTROS.id_vehiculo = VEHICULOS.id_vehiculo and VEHICULOS.id_estado <> 12 and
  7. VEHICULOS.id_local   = LOCALES.id_local and LOCALES.id_taller = TALLERES.id_taller and TALLERES.id_taller = '||idTaller||' and
  8. COMPANIAS.alias = upper('||'alias'||')group by locales.capacidad_instalada UNION ALL
  9. select count(VEHICULOS.id_vehiculo),locales.capacidad_instalada from SINIESTROS,COMPANIAS,VEHICULOS,LOCALES,TALLERES
  10. where SINIESTROS.id_compania = COMPANIAS.id_compania and SINIESTROS.id_vehiculo = VEHICULOS.id_vehiculo and VEHICULOS.id_estado <> 12 and
  11. VEHICULOS.id_local = LOCALES.id_local and LOCALES.id_taller = TALLERES.id_taller and TALLERES.id_taller = '||idTaller||' and COMPANIAS.alias <> upper('||'alias'||')
  12. group by locales.capacidad_instalada';  
  13. RETURN QUERY EXECUTE use_sql;  
  14. END;
  15. $BODY$
  16. LANGUAGE plpgsql;
  17.  
  18. SELECT * FROM prueba (5,'bci');
  19.  
  20.  
  21. VehiculosTaller           CapacidadTaller
  22. ---------------------    ---------------------------
  23.             3                             3

SIN CONCATENAR alias (SI me sirve el resultado)

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION prueba(idTaller INTEGER,IN alias VARCHAR(255),OUT VehiculosTaller BIGINT,OUT CapacidadTaller SMALLINT) RETURNS SETOF RECORD AS $BODY$
  2. DECLARE
  3.     use_sql TEXT;
  4. BEGIN  
  5. use_sql := 'select count(VEHICULOS.id_vehiculo)as VehiculosTaller,locales.capacidad_instalada as CapacidadTaller from SINIESTROS,COMPANIAS,VEHICULOS,LOCALES,TALLERES
  6. where SINIESTROS.id_compania = COMPANIAS.id_compania and SINIESTROS.id_vehiculo = VEHICULOS.id_vehiculo and VEHICULOS.id_estado <> 12 and
  7. VEHICULOS.id_local   = LOCALES.id_local and LOCALES.id_taller = TALLERES.id_taller and TALLERES.id_taller = '||idTaller||' and
  8. COMPANIAS.alias = upper(''bci'')group by locales.capacidad_instalada UNION ALL
  9. select count(VEHICULOS.id_vehiculo),locales.capacidad_instalada from SINIESTROS,COMPANIAS,VEHICULOS,LOCALES,TALLERES
  10. where SINIESTROS.id_compania = COMPANIAS.id_compania and SINIESTROS.id_vehiculo = VEHICULOS.id_vehiculo and VEHICULOS.id_estado <> 12 and
  11. VEHICULOS.id_local = LOCALES.id_local and LOCALES.id_taller = TALLERES.id_taller and TALLERES.id_taller = '||idTaller||' and COMPANIAS.alias <> upper(''bci'')
  12. group by locales.capacidad_instalada';  
  13. RETURN QUERY EXECUTE use_sql;  
  14. END;
  15. $BODY$
  16. LANGUAGE plpgsql;
  17.  
  18. SELECT * FROM prueba (5,'bci');
  19.  
  20.  
  21. VehiculosTaller           CapacidadTaller
  22. ---------------------    ---------------------------
  23.             2                             30
  24.             1                             30
  #13 (permalink)  
Antiguo 09/08/2010, 14:52
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: return select

Para que las comillas que envulven el alias? No sería igual que con idTaller?
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #14 (permalink)  
Antiguo 09/08/2010, 15:03
Avatar de death_nemesis  
Fecha de Ingreso: abril-2009
Ubicación: Santiago - Chile
Mensajes: 147
Antigüedad: 15 años
Puntos: 2
Respuesta: return select

mira lo dejo como en el idTaller y me sale este error...ya me di cuenta que el error esta en la concatenacion del string pero no cacho el por que esta mal concatenado

Código SQL:
Ver original
  1. ERROR:  COLUMN "alias" does NOT exist
  2. LINE 4: COMPANIAS.alias = UPPER('||alias||') GROUP BY locales.capaci...

y cuando concateno asi toma el alias y no el valor del alias

Código SQL:
Ver original
  1. SELECT * FROM prueba (7,'xxx');
  2. UPPER('||'alias'||')
  3. ......COMPANIAS.alias = UPPER(alias).......
y deberia ser asi

Código SQL:
Ver original
  1. SELECT * FROM prueba (7,'xxx');
  2. ......COMPANIAS.alias = UPPER(xxx).......
  #15 (permalink)  
Antiguo 10/08/2010, 11:22
Avatar de death_nemesis  
Fecha de Ingreso: abril-2009
Ubicación: Santiago - Chile
Mensajes: 147
Antigüedad: 15 años
Puntos: 2
Respuesta: return select

ya mira esto quedo así

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION prueba(idTaller INTEGER, aliasCompania text,OUT VehiculosTaller BIGINT,OUT CapacidadTaller SMALLINT) RETURNS SETOF RECORD AS $BODY$
  2. DECLARE
  3.     use_sql TEXT;
  4. BEGIN  
  5. use_sql := 'select count(VEHICULOS.id_vehiculo)as VehiculosTaller,locales.capacidad_instalada as CapacidadTaller from SINIESTROS,COMPANIAS,VEHICULOS,LOCALES,TALLERES
  6. where SINIESTROS.id_compania = COMPANIAS.id_compania and SINIESTROS.id_vehiculo = VEHICULOS.id_vehiculo and VEHICULOS.id_estado <> 12 and
  7. VEHICULOS.id_local   = LOCALES.id_local and LOCALES.id_taller = TALLERES.id_taller and TALLERES.id_taller = '||idTaller||' and
  8. COMPANIAS.alias = upper('||aliasCompania||') group by locales.capacidad_instalada UNION ALL
  9. select count(VEHICULOS.id_vehiculo),locales.capacidad_instalada from SINIESTROS,COMPANIAS,VEHICULOS,LOCALES,TALLERES
  10. where SINIESTROS.id_compania = COMPANIAS.id_compania and SINIESTROS.id_vehiculo = VEHICULOS.id_vehiculo and VEHICULOS.id_estado <> 12 and
  11. VEHICULOS.id_local = LOCALES.id_local and LOCALES.id_taller = TALLERES.id_taller and TALLERES.id_taller = '||idTaller||' and COMPANIAS.alias <> upper('||aliasCompania||')
  12. group by locales.capacidad_instalada';
  13. raise notice 'Running query: %', use_sql;
  14. RETURN QUERY EXECUTE use_sql;  
  15. END;
  16. $BODY$
  17. LANGUAGE plpgsql;
  18.  
  19. SELECT * FROM prueba (7,'xxx');

pero me da un error me sale lo siguiente

ERROR: column "xxx" does not exist
LINE 4: COMPANIAS.alias = upper(xxx)

siendo que el xxx es un valor de un alias que existe en la bd y no es una columna entonces no se por que me da ese error
  #16 (permalink)  
Antiguo 10/08/2010, 12:16
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: return select

Prueba así

Código SQL:
Ver original
  1. AND COMPANIAS.alias <> UPPER('''||aliasCompania||''')
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #17 (permalink)  
Antiguo 10/08/2010, 12:29
Avatar de death_nemesis  
Fecha de Ingreso: abril-2009
Ubicación: Santiago - Chile
Mensajes: 147
Antigüedad: 15 años
Puntos: 2
Respuesta: return select

gracias huesos52 me fue de gran ayuda tu orientacion...y en gratitud posteo el codigo completo y depurado por si a alguien lo puede necesitar

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION prueba(idTaller INTEGER, aliasCompania text,OUT VehiculosTaller BIGINT,OUT CapacidadTaller SMALLINT) RETURNS SETOF RECORD AS $BODY$
  2. DECLARE
  3.     use_sql TEXT;
  4. BEGIN  
  5. use_sql := 'select count(VEHICULOS.id_vehiculo)as VehiculosTaller,locales.capacidad_instalada as CapacidadTaller from SINIESTROS,COMPANIAS,VEHICULOS,LOCALES,TALLERES
  6. where SINIESTROS.id_compania = COMPANIAS.id_compania and SINIESTROS.id_vehiculo = VEHICULOS.id_vehiculo and VEHICULOS.id_estado <> 12 and
  7. VEHICULOS.id_local   = LOCALES.id_local and LOCALES.id_taller = TALLERES.id_taller and TALLERES.id_taller = '||idTaller||' and
  8. COMPANIAS.alias = upper('''||aliasCompania||''') group by locales.capacidad_instalada UNION ALL
  9. select count(VEHICULOS.id_vehiculo),locales.capacidad_instalada from SINIESTROS,COMPANIAS,VEHICULOS,LOCALES,TALLERES
  10. where SINIESTROS.id_compania = COMPANIAS.id_compania and SINIESTROS.id_vehiculo = VEHICULOS.id_vehiculo and VEHICULOS.id_estado <> 12 and
  11. VEHICULOS.id_local = LOCALES.id_local and LOCALES.id_taller = TALLERES.id_taller and TALLERES.id_taller = '||idTaller||' and COMPANIAS.alias <> upper('''||aliasCompania||''')
  12. group by locales.capacidad_instalada';
  13. --raise notice 'Running query: %', use_sql;
  14. RETURN QUERY EXECUTE use_sql;  
  15. END;
  16. $BODY$
  17. LANGUAGE plpgsql;
  18.  
  19. SELECT * FROM prueba (6,'xxx');

Etiquetas: return, select
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 22:08.