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
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 |