Gracias por la respuesta. Hice 2 funciones con LANGUAGE 'plpgsql'
--------------------------------------------------------------- --1ra Funcion CREATE OR REPLACE FUNCTION F_CONSULTA_PLPGSQL1(param varchar) RETURNS TABLE(r_idcodigo integer, r_nombre varchar) AS $$ BEGIN RETURN QUERY SELECT idcodigo, nombre FROM MA_PRUEBA WHERE nombre LIKE param; END; $$ LANGUAGE 'plpgsql' VOLATILE; SELECT r_idcodigo, r_nombre FROM F_CONSULTA_PLPGSQL1('%LUIS%'); --------------------------------------------------------------- --2da Funcion CREATE OR REPLACE FUNCTION F_CONSULTA_PLPGSQL2(param varchar) RETURNS TABLE(r_idcodigo integer, r_nombre varchar) AS $$ DECLARE var_r record; BEGIN FOR var_r IN(SELECT idcodigo, nombre FROM MA_PRUEBA WHERE nombre LIKE param) LOOP r_idcodigo := var_r.idcodigo ; r_nombre := var_r.nombre; RETURN NEXT; END LOOP; END; $$ LANGUAGE 'plpgsql' VOLATILE; SELECT r_idcodigo, r_nombre FROM F_CONSULTA_PLPGSQL2('%LUIS%'); --------------------------------------------------------------- Observe lo siguiente - Ambas funciones usan *RETURNS TABLE* - La 1ra Función trabaja con *RETURN QUERY* - La 2da Función trabaja con *FOR* Mi preguntas son: 1.Solo puedo usar *RETURNS TABLE* en funciones de LANGUAGE 'plpgsql'? Ya que no me dejo con LANGUAGE 'sql' 2.Que diferencia hay en usar *RETURN QUERY* vs *FOR*? Por favor si pueden responder a mis dudas. Saludos. El vie., 13 may. 2016 a las 11:20, Alvaro Herrera (<alvhe...@2ndquadrant.com>) escribió: > Herman Estaban escribió: > > > 2do: > > > > CREATE OR REPLACE FUNCTION F_CONSULTA_PARAMETRO2(VARCHAR) RETURNS > > SETOF record AS $$ > > SELECT APPATER || ' ' || APMATER || ' ' || NOMBRES AS PERSONA > > FROM MA_PERSONAL > > WHERE IDCODIGO = $1; > > $$ LANGUAGE SQL; > > > > SELECT * FROM F_CONSULTA_PARAMETRO2('000033') AS (PERSONA VARCHAR); > > > El 2do me podria servir para select mas personalizados con joins pero > > tendria que declarar siempre el campo o los campos de la tablas o > > tablas involucradas en el select? > > > > Hay manera de crear una función sin necesidad de estar declarando los > campos? > > El sistema necesita saber qué tipo retorna la función antes de > ejecutarla. Si usas RETURNS SETOF RECORD entonces debes indicar el tipo > al momento de invocar la función, que es la cláusula AS. Si usas un > nombre de tipo específico, la cláusula AS no es necesaria. Si necesitas > un tipo que no corresponde con ninguna tabla, puedes crearlo: > > CREATE TYPE retorno_de_funcion AS (campo1 int, campo2 text, campo3 date); > > CREATE FUNCTION .... RETURNS SETOF retorno_de_funcion ... > > -- > Álvaro Herrera http://www.2ndQuadrant.com/ > PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services >