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
>

Reply via email to