Re: Query dificil

From: Alvaro Herrera <alvherre(at)dcc(dot)uchile(dot)cl>
To: "Mario A(dot) Soto Cordones" <mario_soto(at)venezolanadeavaluos(dot)com>
Cc: rfuentesp(at)gmail(dot)com, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Query dificil
Date: 2005-03-09 02:13:21
Message-ID: 20050309021321.GB12798@dcc.uchile.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On Thu, Feb 24, 2005 at 08:33:43AM -0400, Mario A. Soto Cordones wrote:
> lo necesito ver asi para que cuando recupere las filas vea una sola fila
> por articulo no varias filas por articulo, mi problema radica en que el
> numero de columnas a retornar es variable, en estos momentos he
> solucionado esto pasandole el trabajo a la aplicacion es decir si la
> consulta me retorna 100 filas lo que la aplicacion hace es agruparlas por
> articulos y colocar los datos que las filas me retornan en columnas , pero
> yo quiero que este proceso no lo haga la aplicacion sin que ya venga listo
> desda la base de datos, estaba pensando en realizar una funcion el
> plpgsql, pero aun no se me ocurre como

Lamentablemente dudo que se pueda, por una limitacion fundamental del
modelo de retorno de las funciones: todos los registros del retorno
deben ser del mismo tipo (==> misma cantidad de columnas), por lo tanto
seria imposible retornar articulos con distintos numeros de atributos en
una sola funcion.

Me imagino que esto es relativamente sencillo de hacer para cada
articulo por separado.

Una posible alternativa a este problema seria usar una funcion que
retorne "setof refcursor", y retornar varios cursores abierots, uno para
cada articulo. Claro que cada cursor tendria que usar una consulta
separada (==> ineficiente): no creo que puedas usar una SRF para llenar
todos los cursores de una sola pasada (ciertamente no en plpgsql, pero
creo que tampoco en C).

Un ejemplo de multiples refcursors esta en la documentacion:

CREATE FUNCTION myfunc(refcursor, refcursor) RETURNS SETOF refcursor AS
$$
BEGIN
OPEN $1 FOR SELECT * FROM table_1;
RETURN NEXT $1;
OPEN $2 FOR SELECT * FROM table_2;
RETURN NEXT $2;
RETURN;
END;
$$ LANGUAGE plpgsql;

-- need to be in a transaction to use cursors.
BEGIN;

SELECT * FROM myfunc('a', 'b');

FETCH ALL FROM a;
FETCH ALL FROM b;
COMMIT;

--
Alvaro Herrera (<alvherre[(at)]dcc(dot)uchile(dot)cl>)
<Schwern> It does it in a really, really complicated way
<crab> why does it need to be complicated?
<Schwern> Because it's MakeMaker.

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2005-03-09 02:21:25 Re: Query dificil
Previous Message Victor M. Zarate Mtz. 2005-03-08 23:32:39 Reporteador