Ver Mensaje Individual
  #4 (permalink)  
Antiguo 19/11/2009, 07:44
rProgged
 
Fecha de Ingreso: agosto-2004
Mensajes: 131
Antigüedad: 19 años, 9 meses
Puntos: 2
Respuesta: SQL dinamico en funcion pgsql

Hola de nuevo Huesos

Mira al final la función me quedó así y funciona perfecto

Código:
CREATE OR REPLACE FUNCTION BuscarAreas(estado boolean) RETURNS SETOF tbl_area_tematica AS $$
DECLARE
	datos tbl_area_tematica%rowtype;
	sql TEXT := 'SELECT area_tem_id, area_tem_nombre, area_tem_activa FROM tbl_area_tematica';
	sqlEstado TEXT;
BEGIN
	IF ( estado=TRUE ) THEN
		sql = sql || ' WHERE area_tem_activa=TRUE';
	ELSE
		sql = sql || ' WHERE area_tem_activa=FALSE';
	END IF;
	FOR datos IN EXECUTE sql LOOP
		RETURN NEXT datos;
	END LOOP;
	RETURN;
END
$$ LANGUAGE plpgsql VOLATILE;

Sin embargo estuve mirando la documentación y encontré la función EXECUTE.. INTO...USING, la intenté usar pero me funcionaba sólo al no pasar el parámetro, si le paso el parámetro no me devuelve nada. Había quedado así:

Código:
CREATE OR REPLACE FUNCTION BuscarAreas(estado boolean) RETURNS SETOF tbl_area_tematica AS $$
DECLARE
	datos tbl_area_tematica%rowtype;
	sql TEXT := 'SELECT area_tem_id, area_tem_nombre, area_tem_activa FROM tbl_area_tematica';
	sqlEstado TEXT;
BEGIN
	IF ( estado<>NULL ) THEN
		sql = sql || ' WHERE area_tem_activa=$1';
	END IF;
	EXECUTE sql INTO datos USING estado;
END
$$ LANGUAGE plpgsql VOLATILE;
Desplegué la consulta por pantalla y estaba OK, lo único que se me ocurre es que no se haya realizado bien el reemplazo del parámetro, que según entiendo es la fortaleza de usar EXECUTE

¿Algún comentario con respecto a la última función?

Saludos y muchas gracias de nuevo

Rodrigo

PD: ¿Cómo posteo el código en formato SQL? (como lo pusiste en la respuesta), gracias