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

Store procedure con execute y update

Estas en el tema de Store procedure con execute y update en el foro de PostgreSQL en Foros del Web. holita a todos. tengo un procedimiento almacenado que debe: 1) hacer un select 2) crear unos campos geometricos 3) actualizar los valores de estos campos ...
  #1 (permalink)  
Antiguo 22/09/2010, 16:45
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Store procedure con execute y update

holita a todos. tengo un procedimiento almacenado que debe:
1) hacer un select
2) crear unos campos geometricos
3) actualizar los valores de estos campos geometricos
4) crear un indice geoespacial

CUANDO EJECUTO EL SP ME GENERA ERROR EN EL PUNTO 3 AL HACER UN UPDATE Y EJECUTARLO CON EXECUTE sql;

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION p_poblaingas_geoindex(CHARACTER VARYING)
  2.   RETURNS void AS
  3. $BODY$
  4. DECLARE
  5.     rec refcursor;
  6.     SQL VARCHAR;
  7.     city    ALIAS FOR $1;
  8.     year_mi INTEGER;
  9.     year_ma INTEGER;
  10.     i   INTEGER;
  11.  
  12. BEGIN
  13.     SQL :=  'SELECT MIN(periodo) AS min,MAX(periodo) AS max
  14.          FROM   servcon_poblaingas_'||city;
  15.          
  16.     OPEN rec FOR EXECUTE SQL;
  17.     FETCH rec INTO year_mi,year_ma;
  18.    
  19.     i    :=  year_mi;      
  20.    
  21.     LOOP
  22.         SQL := 'SELECT AddGeometryColumn ('||QUOTE_LITERAL('servcon_poblaingas_'||city||'_'||i)||','||QUOTE_LITERAL('geom')||',4326,'||QUOTE_LITERAL('POINT')||',2)';
  23.         EXECUTE SQL;
  24.  
  25.         SQL := 'UPDATE servcon_poblaingas_'||city||'_'||i||' set geom = GeometryFromText('||QUOTE_LITERAL('POINT('||cx||' '||cy||')')||',4326)';
  26.         EXECUTE SQL;
  27.  
  28.         SQL := 'CREATE INDEX idx_servcon_poblaingas_'||city||'_'||i||' ON servcon_info2009 USING GIST (geom)';
  29.         EXECUTE SQL;
  30.         i  := i + 1;
  31.                    
  32.         EXIT WHEN  i > year_ma;
  33.     END LOOP;
  34.  
  35.     RETURN;
  36. END;
  37. $BODY$
  38.   LANGUAGE 'plpgsql' VOLATILE;

el error que me saca es este:

ERROR: column "cx" does not exist
CONTEXT: SQL statement "SELECT 'UPDATE servcon_poblaingas_'|| $1 ||'_'|| $2 ||' set geom = GeometryFromText('||QUOTE_LITERAL('POINT('||cx||' '||cy||')')||',4326)'"
PL/pgSQL function "p_poblaingas_geoindex" line 23 at assignment
  #2 (permalink)  
Antiguo 22/09/2010, 18:10
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: Store procedure con execute y update

En vez de ejecutarlo, imprime sql cuando guarde el update. Pruebalo en consola y mira si no tienes errores de concatenaciòn.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 22/09/2010, 18:11
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Store procedure con execute y update

Pero a simple vista notas algo raro, algo que deba tener en cuenta?
  #4 (permalink)  
Antiguo 22/09/2010, 18:13
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: Store procedure con execute y update

Pues, aunque no manejo bases de datos geograficas, diría que la función POINT tiene 2 parametros y no los separas por una coma.
No se porque usas la función quote_literal por fuera de las comillas.
Pero no tengo como probar si es o no valido.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 22/09/2010, 18:15
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: Store procedure con execute y update

ademas... en esta linea
sql := 'UPDATE servcon_poblaingas_'||city||'_'||i||' set geom = GeometryFromText('||QUOTE_LITERAL('POINT('||cx||' '||cy||')')||',4326)';
creo que te falta concatenar aca:
LITERAL('POINT('
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #6 (permalink)  
Antiguo 22/09/2010, 18:31
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Store procedure con execute y update

Don huesos, el problema esta es que estoy dejando los campos cx y cy como campos de tabla que nunca estoy espceficiando.

la cadena que necesito que se ejecute debe quedar algo asi como esto:


UPDATE servcon_poblaingas_05001_2007 set geom = GeometryFromText('POINT('||cx||' '||cy||')',4326);
  #7 (permalink)  
Antiguo 22/09/2010, 18: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: Store procedure con execute y update

Lo mejor es que la imprimas y la retornes y desde ahí mires donde está el fallo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 23/09/2010, 08:09
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Store procedure con execute y update

Hola huesos, ya estoy que soluciono mi problema, y efectivamente en un lio algo complicado con las comillas, para lo cual uso QUOTE_LITERAL

pero siempre lo he usado asi: QUOTE_LITERAL(7) Y ME DEVUELVE '7' o QUOTE_LITERAL('HOLA MUNDO') y añade al string existe 'HOLA MUNDO', pero ahora solo quiero añadir una comilla SIMPLE, mande la funcion sin parametros y genera error.

como lo puedo solucionar?
  #9 (permalink)  
Antiguo 23/09/2010, 08:17
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: Store procedure con execute y update

A ver si te entiendo.

Cuando haces quote_literal(7) te retorna '7'.
CUando dices que quieres solo una comilla quisieras que te retornara algo así?
'''
3 comillas simples? Eso en la cadena te traería muchsimos problemas al no saber que comillas cierran o abren las cadenas.

Podrías poner un ejemplo simple de lo que quiers lograr?

saludos webness
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 23/09/2010, 08:47
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Store procedure con execute y update

CUANDO DIGO QUE ME QUIERO UNA SOLA COMILLA ES simplemente esto ' entonces asi como hago QUOTE_LITERAL(8) para obtener '8', que debo hacer para obtener simplemente ' ?


OSEA HUESOS: LA VARIABLE sql inicialmente esta asi
Código SQL:
Ver original
  1. SQL := 'UPDATE servcon_poblaingas_'||city||'_'||i||' t set geom = GeometryFromText('||QUOTE_LITERAL('POINT('||cx||' '||cy||')')||',4326)';

poniendo problema por el PL cree el cx y el cy son variables previamente definidas, cuando necesito que sean parte del texto, es decir necesito que la cadena sql, contenga literalmente los valor cx y y cy de tal modo que al ejecutarce quede algo como lo que indique mas arriba:

UPDATE servcon_poblaingas_05001_2007 set geom = GeometryFromText('POINT('||cx||' '||cy||')',4326), para lo cual es necesario meter las barras || y el cx y el cy dentro de mas comillas se me ocurre ami
  #11 (permalink)  
Antiguo 23/09/2010, 09:01
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: Store procedure con execute y update

Vamos a simplificar esto...
Postea el update que quieres que se ejecute.
sin concatenaciones, sin nada...
UPDATE servcon_poblaingas_bogota_1 t SET ....

+Postealo tal cual sabes que funciona. Con esto, yo te ayudo a armar la cadena para que quede en la variable sql y pueda ser ejecutada.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #12 (permalink)  
Antiguo 23/09/2010, 09:10
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Store procedure con execute y update

ESTO ES LO QUE NORMALMENTE EJECUTO Y FUNCION

UPDATE servcon_poblaingas_05001_2007 set geom = GeometryFromText('POINT('||cx||' '||cy||')',4326)
  #13 (permalink)  
Antiguo 23/09/2010, 09:14
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: Store procedure con execute y update

Listo.

Código SQL:
Ver original
  1. SQL := 'UPDATE servcon_poblaingas_'||city||'_'||i||' set geom = GeometryFromText(''POINT(''||cx||'' ''||cy||'')'',4326)';
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #14 (permalink)  
Antiguo 23/09/2010, 09:29
Avatar de webness  
Fecha de Ingreso: enero-2009
Ubicación: BOGOTA
Mensajes: 312
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: Store procedure con execute y update

Eselente ya me funciono y asi quedo:

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION p_poblaingas_geoindex(CHARACTER VARYING)
  2.   RETURNS VOID AS
  3. $BODY$
  4. DECLARE
  5.     rec refcursor;
  6.     SQL VARCHAR;
  7.     city    ALIAS FOR $1;
  8.     year_mi INTEGER;
  9.     year_ma INTEGER;
  10.     i   INTEGER;
  11.  
  12. BEGIN
  13.     SQL :=  'SELECT MIN(periodo) AS min,MAX(periodo) AS max
  14.          FROM   servcon_poblaingas_'||city;
  15.          
  16.     OPEN rec FOR EXECUTE SQL;
  17.     FETCH rec INTO year_mi,year_ma;
  18.    
  19.     i    :=  year_mi;      
  20.    
  21.     LOOP
  22.         EXECUTE 'SELECT AddGeometryColumn ('||QUOTE_LITERAL('servcon_poblaingas_'||city||'_'||i)||','||QUOTE_LITERAL('geom')||',4326,'||QUOTE_LITERAL('POINT')||',2)';
  23.         EXECUTE 'UPDATE servcon_poblaingas_'||city||'_'||i||' set geom = GeometryFromText(''POINT(''||CX||'' ''||CY||'')'',4326)';
  24.         EXECUTE 'CREATE INDEX idx_poblaingas_'||city||'_'||i||' ON servcon_poblaingas_'||city||'_'||i||' USING GIST (geom)';
  25.         i  := i + 1;
  26.                    
  27.         EXIT WHEN  i > year_ma;
  28.     END LOOP;
  29.  
  30.     RETURN;
  31. END;
  32. $BODY$
  33.   LANGUAGE 'plpgsql' VOLATILE;

Última edición por webness; 23/09/2010 a las 09:39

Etiquetas: execute, procedure, store, update
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 18:02.