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

PostGis // Función que devuelve un booleano

Estas en el tema de PostGis // Función que devuelve un booleano en el foro de PostgreSQL en Foros del Web. Buenas, quería comentaros un problema con el que me estoy encontrando y que (pese a que probablemente sea una tontería) me está llevando de craneo: ...
  #1 (permalink)  
Antiguo 23/05/2011, 06:56
 
Fecha de Ingreso: noviembre-2010
Mensajes: 30
Antigüedad: 14 años
Puntos: 0
PostGis // Función que devuelve un booleano

Buenas, quería comentaros un problema con el que me estoy encontrando y que (pese a que probablemente sea una tontería) me está llevando de craneo:

Tengo una función con la que pretendo comprobar que el primer carácter de un campo textual sea 'F'. La función tiene este código:

Código:
BEGIN
	EXECUTE 'select substring(s1.'|| $2||'::text from '|| $4||' for '|| $5||') from '|| $1||' as s1 
	where s1.gid='|| $3||' and substring(s1.'|| $2||'::text from '|| $4||' for '|| $5||')='''|| $6||'''::text;';
	IF FOUND THEN
		RETURN true;
	ELSE
		RETURN false;
	END IF;
END;
Y la llamada la realizo tal que así: select devuelve_booleano('x2bis','txt', '5', '1','1','F')

La explicación de los parámetros:

/*Comprueba en el registro $3 del campo textual $2 de la tabla $1*/
/*si los $5 siguientes carácteres a la posición $4*/
/*coincide con el valor $6*/

--------------------------------------------------------------------------------------------------------------------------------------------------------------

Para el caso particular de esta query: select substring(s1.txt::text from 1 for 1) from x2bis as s1 where s1.gid=5 el resultado es 'F'

Pero la función me está devolviendo 'false' en todo momento independientemente del carácter que tenga que buscar en el parámetro 6º

¿Alguien sabe que puedo estar haciendo mal?

Gracias por la ayuda.
  #2 (permalink)  
Antiguo 24/05/2011, 07:31
 
Fecha de Ingreso: noviembre-2010
Mensajes: 30
Antigüedad: 14 años
Puntos: 0
Respuesta: PostGis // Función que devuelve un booleano

Al final lo he solucionad utilizando un select into, y comprobando que el valor asignado a la variable coincida con el pasado como parámetro.

Código:
CREATE OR REPLACE FUNCTION devuelve_booleano(text, text)
  RETURNS boolean AS
$BODY$
/*comprieba que la primera posición de la cadena $1 sea $2*/
DECLARE
	car text;
BEGIN
	select into car substring($1, 1, 1);
	IF car=$2 THEN
		RETURN true;
	ELSE
		RETURN false;
	END IF;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE STRICT
  COST 100;
ALTER FUNCTION devuelve_booleano(text, text) OWNER TO postgres;
Ahora el problema lo tengo con la siguiente función:

Código:
CREATE OR REPLACE FUNCTION str(text)
  RETURNS text AS
$BODY$
/*Devuelve */
DECLARE
	car text;
BEGIN
	select into car txt from  $1;
	return car;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE STRICT
  COST 100;
ALTER FUNCTION str(text) OWNER TO postgres;
Pues al intentar compilarla salta un error de sintaxis que no alcanzo a entender...

Cita:
Iniciado por Pgadmin
ERROR: error de sintaxis en o cerca de «$1»
LINE 1: select txt from $1
^
QUERY: select txt from $1
CONTEXT: SQL statement in PL/PgSQL function "str" near line 7
¿me puede alguien orientar?
  #3 (permalink)  
Antiguo 24/05/2011, 07:33
 
Fecha de Ingreso: noviembre-2010
Mensajes: 30
Antigüedad: 14 años
Puntos: 0
Error de sintaxis.

Al final lo he solucionad utilizando un select into, y comprobando que el valor asignado a la variable coincida con el pasado como parámetro.

Código:
CREATE OR REPLACE FUNCTION devuelve_booleano(text, text)
  RETURNS boolean AS
$BODY$
/*comprieba que la primera posición de la cadena $1 sea $2*/
DECLARE
	car text;
BEGIN
	select into car substring($1, 1, 1);
	IF car=$2 THEN
		RETURN true;
	ELSE
		RETURN false;
	END IF;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE STRICT
  COST 100;
ALTER FUNCTION devuelve_booleano(text, text) OWNER TO postgres;
Ahora el problema lo tengo con la siguiente función:

Código:
CREATE OR REPLACE FUNCTION str(text)
  RETURNS text AS
$BODY$
/*Devuelve */
DECLARE
	car text;
BEGIN
	select into car txt from  $1;
	return car;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE STRICT
  COST 100;
ALTER FUNCTION str(text) OWNER TO postgres;
Pues al intentar compilarla salta un error de sintaxis que no alcanzo a entender...

Cita:
Iniciado por Pgadmin
ERROR: error de sintaxis en o cerca de «$1»
LINE 1: select txt from $1
^
QUERY: select txt from $1
CONTEXT: SQL statement in PL/PgSQL function "str" near line 7
¿me puede alguien orientar?
  #4 (permalink)  
Antiguo 24/05/2011, 07:51
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 6 meses
Puntos: 344
Respuesta: PostGis // Función que devuelve un booleano

No sé que intentas hacer con ese SELECT,pero la sintaxis está mal.

La sintaxis es así:

Código SQL:
Ver original
  1. SELECT [campos | *  ] INTO variable [FROM tabla]
  #5 (permalink)  
Antiguo 24/05/2011, 08:08
 
Fecha de Ingreso: noviembre-2010
Mensajes: 30
Antigüedad: 14 años
Puntos: 0
Respuesta: PostGis // Función que devuelve un booleano

Hola Alex, tu sintaxis y la mía me dan el mismo resultado (aparentemente), pero en ambos casos no me deja sustituir el nombre de la tabla por el parámetro pasado desde la llamada ($1). Salta un error de sintaxis cuya causa no logro entender.
Mas me sorprende cuando en la primera función no he tenido esos problemas.

Ah, básicamente lo que pretendo es tener una función que me devuelva el campo txt de la tabla que le indique en la llamada.

Gracias por todo.
  #6 (permalink)  
Antiguo 24/05/2011, 08:37
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 6 meses
Puntos: 344
Respuesta: PostGis // Función que devuelve un booleano

Ah, que lo que querías pasar era el nombre de una tabla. No se puede realizar tal y como lo haces tú.

Si lo que quieres es realizar consultas dinámicas necesitas usar el comando EXECUTE:

Código SQL:
Ver original
  1. CREATE OR REPLACE FUNCTION str(text)
  2.   RETURNS text AS
  3. $BODY$
  4. /*Devuelve */
  5. DECLARE
  6.     car text;
  7. BEGIN
  8.     EXECUTE 'select text from ' ||  $1
  9.     INTO car;
  10.     RETURN car;
  11. END;
  12. $BODY$
  13.   LANGUAGE 'plpgsql' VOLATILE STRICT
  14.   COST 100;
  15. ALTER FUNCTION str(text) OWNER TO postgres;


No puedes usar el SELECT INTO con EXECUTE, en su defecto, debes usar la construcción EXECUTE ... INTO.

Además, ten en cuenta que en la variable car solo se va a guardar el valor del campo text de la primera fila de resultados (porque esa consulta normalmente devolverá más de una fila de resultados).

Te dejo un link de la documentación oficial sobre la sentencia EXECUTE:
http://www.postgresql.org/docs/9.0/interactive/plpgsql-statements.html
  #7 (permalink)  
Antiguo 25/05/2011, 02:49
 
Fecha de Ingreso: noviembre-2010
Mensajes: 30
Antigüedad: 14 años
Puntos: 0
Respuesta: PostGis // Función que devuelve un booleano

Fantástico alexg88, probé con el Select into y me marcaba error de sintaxis en el into. Pero con el EXECUTE "statement" INTO funciona a la perfección.

Ahora me asalta otra duda: me adviertes que la función solo devuelve un carácter, y mi intención es usar esta función dentro de otra que hace un innerjoin aplicando esta función (bueno, no esta exactamente, pero si una que se apoyará en esta).

Me explico un poco mejor, mi función base tiene esta estructura:

Función (Tabla Volcado, Condición para el innerjoin, Texto explicativo, Tabla input 1, Condición para Tabla 1, Tabla input 2, Condición para Tabla 2)
que ejecuta:

EXECUTE 'INSERT INTO '|| $1||'(gid, id1, tabla1, id2, tabla2, txt, geom) select nextval('''|| $1||'_gid_seq''), s1.gid, '''|| $4||''', s2.gid, '''|| $6||''',
'|| $3||', intersection (s1.geom,s2.geom) from '|| $4||' As s1 INNER JOIN '|| $6||' As s2 ON '|| $2||' AND s1.'|| $5||' AND s2.'|| $7||';

En condición para Tabla 1/2 pretendía poner que el retorno de la función fuera true. Pero claro: ¿analizará el registro correspondiente o siempre analizará el primero?

Gracias miles por la ayuda.

Etiquetas: devuelve, postgis
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 08:00.