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

[SOLUCIONADO] concatenar nombre de una tabla con un valor integer

Estas en el tema de concatenar nombre de una tabla con un valor integer en el foro de PostgreSQL en Foros del Web. buenos dias amigos me encuentro un poco fustrado por no poder dar solucion a mi problema les explico estoy creando un proceso almacenado en postgresql ...
  #1 (permalink)  
Antiguo 05/11/2015, 07:36
 
Fecha de Ingreso: agosto-2015
Mensajes: 35
Antigüedad: 9 años, 4 meses
Puntos: 0
concatenar nombre de una tabla con un valor integer

buenos dias amigos me encuentro un poco fustrado por no poder dar solucion a mi problema les explico estoy creando un proceso almacenado en postgresql y dentro del proceso estoy creando un for que va desde 1 a 10 este valor deseo colocarlo en un select concatenandolo con el nombre de la tabla ejemplo 'dia_habil_1' el uno seria el valor del for y lo que deberia retornar es un numero este es el codigo :


Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION prueba()
  2.     RETURNS SETOF "int8" AS
  3.     $BODY$
  4. DECLARE
  5.     r INTEGER;
  6.     i INTEGER;
  7.    
  8. BEGIN
  9.  
  10. r := 0;
  11.  
  12.  FOR i IN 1..10  LOOP
  13.  
  14.  
  15. r:= r+ (SELECT ´dia_habil_´ || i FROM dia_habil WHERE dispositivo='10000002' AND intervalo='06:00');
  16.  
  17. RETURN NEXT r;
  18.  
  19. END LOOP;
  20.  
  21.  
  22.  
  23. END;
  24. $BODY$
  25. LANGUAGE 'plpgsql' VOLATILE


pero me surge un erro :
Código SQL:
Ver original
  1. ERROR:  no existe la columna «dia_habil_»
  2. LINE 1: SELECT (SELECT dia_habil_||'' || i FROM dia_habil WHERE disp...

si pueden ayudarme -?

Última edición por gnzsoloyo; 05/11/2015 a las 09:11
  #2 (permalink)  
Antiguo 05/11/2015, 12:53
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: concatenar nombre de una tabla con un valor integer

Cuando quieras utilizar sql dinamico como veo que lo estas tratando de hacer, es necesario que utilices la sentencia EXECUTE.

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION prueba()
  2.     RETURNS SETOF "int8" AS
  3.     $BODY$
  4. DECLARE
  5.     r INTEGER;
  6.     r2 INTEGER;
  7.     i INTEGER;
  8.    
  9. BEGIN
  10.  
  11. r := 0;
  12.  
  13.  FOR i IN 1..10  LOOP
  14.  
  15.  EXECUTE 'SELECT dia_habil_'|| i ||' FROM dia_habil WHERE dispositivo=''10000002'' AND intervalo=''06:00''' INTO r2;
  16. r:= r+ r2;
  17.  
  18. RETURN NEXT r;
  19.  
  20. END LOOP;
  21.  
  22.  
  23.  
  24. END;
  25. $BODY$
  26. LANGUAGE 'plpgsql' VOLATILE;
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 05/11/2015, 15:24
 
Fecha de Ingreso: agosto-2015
Mensajes: 35
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: concatenar nombre de una tabla con un valor integer

Gracias Amigo me sacaste de una ...
  #4 (permalink)  
Antiguo 06/11/2015, 07:55
 
Fecha de Ingreso: agosto-2015
Mensajes: 35
Antigüedad: 9 años, 4 meses
Puntos: 0
sql dinamico

muchachos tengo un procedimiento almacenado con un sql dinamico pero quiero que colocarle a ese sql unos parametros de que viene de otra consulta lo tengo algo si:
Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION prueba()
  2.     RETURNS SETOF "int8" AS
  3.     $BODY$
  4. DECLARE
  5.     r INTEGER;
  6.     r2 INTEGER;
  7.     i INTEGER;
  8.     j record;
  9.    
  10. BEGIN
  11.  
  12.  
  13.  FOR j IN SELECT dispositivo,salidas.intervalo FROM mapeo_bca INNER JOIN salidas ON mapeo_bca.acceso_de_estación=salidas.acceso WHERE salidas.fecha_de_trasaccion='29/10/2015' AND salidas.intervalo='00:00' AND dispositivo='10000002' ORDER BY dispositivo
  14. loop
  15.  r := 0;
  16.  FOR i IN 1..10  LOOP
  17.  
  18.  EXECUTE 'SELECT dia_habil_'|| i ||' FROM dia_habil WHERE dispositivo='||j.dispositivo||' AND intervalo='||j.intervalo||''  INTO r2;
  19. r:= r+ r2;
  20.  
  21. RETURN NEXT r;
  22.  
  23. END LOOP;
  24.  
  25.  
  26. END loop;
  27.  
  28.  
  29. END;
  30. $BODY$
  31. LANGUAGE 'plpgsql' VOLATILE;

pero el inconveniente es que los dos valores tiene que estar dentro de comillas por que son varchar miren el erro que me sale :
Código SQL:
Ver original
  1. ERROR:  error de sintaxis en o cerca de «:»
  2. LINE 1: ...ROM dia_habil WHERE dispositivo=10000002 AND intervalo=00:00
  3.                                                                     ^
  4. QUERY:  SELECT dia_habil_1 FROM dia_habil WHERE dispositivo=10000002 AND intervalo=00:00
  5. CONTEXT:  función PL/pgSQL prueba() en la línea 16 en sentencia EXECUTE

me podrian ayudar

Última edición por gnzsoloyo; 06/11/2015 a las 08:16
  #5 (permalink)  
Antiguo 06/11/2015, 08:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: concatenar nombre de una tabla con un valor integer

@edwin100:
No abras nuevos hilos si el problema es la continuación de la solución planteada en otro. Hace que el seguimiento del avance se pierda, y terminarás con respuestas des-sincronizadas en ambos hilos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 06/11/2015, 12:43
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: concatenar nombre de una tabla con un valor integer

En este caso lo quer necesitas es doble comilla para simular la comilla interna.

Código SQL:
Ver original
  1. EXECUTE 'SELECT dia_habil_'|| i ||' FROM dia_habil WHERE dispositivo='''||j.dispositivo||''' AND intervalo='''||j.intervalo||''''  INTO r2;

Esto puede resultar engorroso, para lo cual también aplica una función llamada quote_literal que creo que aplica así:

Código SQL:
Ver original
  1. EXECUTE 'SELECT dia_habil_'|| i ||' FROM dia_habil WHERE dispositivo='||quote_literal(j.dispositivo)||' AND intervalo='||quote_literal(j.intervalo)  INTO r2;

De igual forma, si no te funciona, mira la documentación, ya que no tengo forma de probarla en este momento.
http://www.postgresql.org/docs/9.1/s...ns-string.html

Revisala.

Adicional, como dice gnzsoloyo, creo que es conveniente separarlo en diferentes temas.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Etiquetas: concatenar, dinamico, integer, nombre, sql, tabla, valor
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 19:48.