Re: Funcion con SELECT

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
>

In response to

Responses

Browse pgsql-es-ayuda by date

  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