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

Procedure PostgreSQL

Estas en el tema de Procedure PostgreSQL en el foro de PostgreSQL en Foros del Web. El error es cuando ejecuto el procedure, ni cuando lo creo me da errores, solo al hacer select prueba('5'); Mis tablas @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: ...
  #1 (permalink)  
Antiguo 19/07/2016, 14:27
 
Fecha de Ingreso: julio-2014
Mensajes: 161
Antigüedad: 10 años, 5 meses
Puntos: 4
Procedure PostgreSQL

El error es cuando ejecuto el procedure, ni cuando lo creo me da errores, solo al hacer select prueba('5');

Mis tablas
Código SQL:
Ver original
  1. CREATE TABLE cfg_ima_rutas
  2. (
  3.   id INTEGER NOT NULL DEFAULT NEXTVAL('ima_rutas_id_seq'::regclass),
  4.   ruta text,
  5.   tipo INTEGER,
  6.   porcentaje INTEGER,
  7.   marca INTEGER
  8. )
  9. CREATE TABLE cfg_ima_marcas
  10. (
  11.   id INTEGER NOT NULL DEFAULT NEXTVAL('cfg_ima_marcas_id_seq'::regclass),
  12.   ruta text,
  13.   proporcion INTEGER
  14. )
Este es mi procedure

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION prueba(IN id_num INTEGER)
  2.   RETURNS TABLE(ruta text, tipo INTEGER, porcentaje INTEGER, marca INTEGER) AS
  3. 'DECLARE
  4. marca_opcion integer;
  5.  
  6. BEGIN
  7. marca_opcion="SELECT cfg_ima_rutas.marca FROM cfg_ima_rutas WHERE cfg_ima_rutas.id="||id_num;
  8.  
  9. IF(marca_opcion>0) THEN
  10. RETURN QUERY
  11.            SELECT
  12.        cfg_ima_rutas.ruta,  cfg_ima_rutas.tipo, cfg_ima_rutas.porcentaje, cfg_ima_rutas.marca, cfg_ima_marcas.ruta, cfg_ima_marcas.proporcion
  13.      FROM cfg_ima_marcas JOIN cfg_ima_rutas ON (cfg_ima_marcas.id = cfg_ima_rutas.marca) WHERE cfg_ima_rutas.id=id_num;
  14. ELSE
  15.    RETURN QUERY
  16.      SELECT
  17.         cfg_ima_rutas.ruta,  cfg_ima_rutas.tipo, cfg_ima_rutas.porcentaje, cfg_ima_rutas.marca
  18.      FROM cfg_ima_rutas WHERE cfg_ima_rutas.id=id_num;
  19. END IF;
  20.  
  21.  END;'
  22.   LANGUAGE plpgsql

no me da errores ni al insertar las tablas ni el procedure, solo cuando ejecuto el procedure

Código SQL:
Ver original
  1. SELECT prueba('5');
Código BASH:
Ver original
  1. ERROR:  column "SELECT cfg_ima_rutas.marca FROM cfg_ima_rutas WHERE cfg_ima_rut" does not exist
  2. LINE 1: SELECT "SELECT cfg_ima_rutas.marca FROM cfg_ima_rutas WHERE ...
  3.               ^
  4. QUERY:  SELECT "SELECT cfg_ima_rutas.marca FROM cfg_ima_rutas WHERE cfg_ima_rutas.id="||id_num
  5. CONTEXT:  PL/pgSQL function prueba(integer) line 4 at assignment

Última edición por Rebuilding; 19/07/2016 a las 15:07
  #2 (permalink)  
Antiguo 19/07/2016, 22:18
 
Fecha de Ingreso: julio-2014
Mensajes: 161
Antigüedad: 10 años, 5 meses
Puntos: 4
Respuesta: Procedure PostgreSQL

Me doy cuenta que hay un error en el valor de retorno del procedure, por lo que he leido debo usar un valor de retorno polimorfico, como este, pero no me sale, alguien que me oriente

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION prueba(IN id_num INTEGER)
  2.  RETURNS SETOF anyelement AS
  3. 'DECLARE
  4. marca_opcion integer;
  5. BEGIN
  6. marca_opcion="SELECT cfg_ima_rutas.marca FROM cfg_ima_rutas WHERE cfg_ima_rutas.id="||id_num;
  7.  
  8. IF(marca_opcion>0) THEN
  9. RETURN QUERY
  10.            SELECT
  11.        cfg_ima_rutas.ruta,  cfg_ima_rutas.tipo, cfg_ima_rutas.porcentaje, cfg_ima_rutas.marca, cfg_ima_marcas.ruta, cfg_ima_marcas.proporcion
  12.      FROM cfg_ima_marcas JOIN cfg_ima_rutas ON (cfg_ima_marcas.id = cfg_ima_rutas.marca) WHERE cfg_ima_rutas.id=id_num;
  13. ELSE
  14.    RETURN QUERY
  15.      SELECT
  16.         cfg_ima_rutas.ruta,  cfg_ima_rutas.tipo, cfg_ima_rutas.porcentaje, cfg_ima_rutas.marca
  17.      FROM cfg_ima_rutas WHERE cfg_ima_rutas.id=id_num;
  18. END IF;
  19.  
  20.  END;'
  21.   LANGUAGE plpgsql
  #3 (permalink)  
Antiguo 21/07/2016, 09:24
 
Fecha de Ingreso: julio-2014
Mensajes: 161
Antigüedad: 10 años, 5 meses
Puntos: 4
Respuesta: Procedure PostgreSQL

UMM, ERROR DE OMISION DE POSTGRES

Nadie me respondio, lo resolvi asi, creo que no es la mejor manera ya que en la segunda consulta, repito el alias de dos columnas, con el fin de poder solventar el "error de postgresql" al no soportar consultas dinamicas como lo hace mysql en los procedures
Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION imagenes(id_num INTEGER)
  2.   RETURNS TABLE (ruta_img text, tipo_img INTEGER, porcentaje INTEGER, marca_id INTEGER, ruta_marca text, proporcion_marca INTEGER) AS
  3. $BODY$
  4. DECLARE
  5. SQL text;
  6. marca_opcion INTEGER;
  7. BEGIN
  8. SELECT cfg_ima_rutas.marca INTO marca_opcion FROM cfg_ima_rutas WHERE cfg_ima_rutas.id=id_num;
  9. IF(marca_opcion>0) THEN
  10. SQL := 'SELECT
  11. cfg_ima_rutas.ruta AS ruta_img, cfg_ima_rutas.tipo AS tipo_img, cfg_ima_rutas.porcentaje AS porcentaje, cfg_ima_rutas.marca AS marca_id, cfg_ima_marcas.ruta AS ruta_marca, cfg_ima_marcas.proporcion AS proporcion_marca
  12. FROM cfg_ima_marcas JOIN cfg_ima_rutas ON (cfg_ima_marcas.id = cfg_ima_rutas.marca) WHERE cfg_ima_rutas.id='||id_num;
  13. ELSE
  14. SQL := 'SELECT
  15. cfg_ima_rutas.ruta AS ruta_img, cfg_ima_rutas.tipo AS tipo_img, cfg_ima_rutas.porcentaje AS porcentaje, cfg_ima_rutas.marca AS marca_id,cfg_ima_rutas.ruta AS ruta_marca, cfg_ima_rutas.porcentaje AS proporcion_marca
  16. FROM cfg_ima_rutas WHERE cfg_ima_rutas.id='||id_num;
  17. END IF;
  18. RETURN query EXECUTE SQL;
  19. END;
  20. $BODY$
  21.   LANGUAGE plpgsql VOLATILE
  22.   COST 100;

Etiquetas: bases-de-datos-general, procedure, select, sql, tabla
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:24.