Re: plpsql con resultado de consulta

From: Miguel Rodríguez Penabad <penabad(at)gmail(dot)com>
To: Ramón Alberto Bruening González <albertobruening(at)hotmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: plpsql con resultado de consulta
Date: 2007-09-15 18:58:37
Message-ID: 95335e4e0709151158y483141aas436608a6448d6842@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El 14/09/07, Ramón Alberto Bruening González
<albertobruening(at)hotmail(dot)com> escribió:
>
> Buenas tardes listeros:
>
> Como puedo hacer que una funcion en plpsql me devuelve un resultado con la
> clausula select * from mi_tabla, porque actualmente inserto dicha sentencia
> sql y el resultado me dice que no tiene ningun destino.
>
> Quiero realizar mi consulta de esa manera para crear consultas dinamicas
> que se ejecuten de acuerdo a una condicion que voy a insertar por ej:
>
> If accion = 1 then
> Select * from mi_tabla_1;
> else
> if accion = 2 then
> select * from mi_tabla_2;
> end if;
> end if;
>
> desde ya muchas gracias.

No sé, yo dudo de la utilidad de una función de ese estilo, pero te
paso un script que
funciona y te comento lo más "gordo" que encontré:

-- Primero creo dos tablas de prueba y meto datos.
create table ta(a1 int, a2 text);
create table tb(b1 date, b2 numeric);
insert into ta values(1,'uno'),(2,'dos');
insert into tb values(now()::date,50), ('12/07/2000',60);

-- Ahora creo la función. Al ser en PL/pgSQL no se puede "devolver"
-- directamente un Select * from tabla, hay que hacer un bucle sobre
-- el select y hacer uso del "return next". Creo que esto cambiará en
-- futuras versiones.
-- Además, dado que puedes hacer selects distintos dependiendo
-- de la opción elegida, la función devolverá algo "setof record",
-- sin especificar qué tipo de registro.

create function funcion(opcion text)
returns setof record
as
$funcion$
declare
registro record;
begin
if opcion='uno' then
for registro in select * from ta loop
return next registro;
end loop;
return;
elseif opcion='dos' then
for registro in select * from tb loop
return next registro;
end loop;
return;
end if;
end
$funcion$
language plpgsql;

-- Probamos las funciones. Dado que la función devuelve "setof record"
-- hay que indicar el esquema en la llamada a la función, como los ejemplo
-- siguientes.
select * from funcion('uno') as (a1 int, a2 text);
select * from funcion('dos') as (b1 date, b2 numeric);

No sé si era esto lo que pretendías...

Saludos
--
Miguel Rodríguez Penabad

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Ernesto Quiñones 2007-09-15 19:13:07 Nuevos videos del PostgreSQL Day 2007 - Perú
Previous Message Arturo Munive [pgsql-es-ayuda] 2007-09-15 18:26:26 Re: URGENTE