From: | Herman Estaban <hermanestaban(at)gmail(dot)com> |
---|---|
To: | Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> |
Cc: | FORO POSTGRES <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Funcion con SELECT |
Date: | 2016-05-16 22:08:38 |
Message-ID: | CAC-DekUX+d7oN__yhhN7UEjdZ-PeKJTtsUkuiyTkqEJQzEyPfQ@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
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 (<alvherre(at)2ndquadrant(dot)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
>
From | Date | Subject | |
---|---|---|---|
Next Message | Alvaro Herrera | 2016-05-16 22:18:14 | Re: Funcion con SELECT |
Previous Message | heriberto giron | 2016-05-16 21:54:29 | error Cannot update a complex query with more then one table |