Re: plpsql: bucle for con cursor

From: "postgres Emanuel CALVO FRANCO" <postgres(dot)arg(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: plpsql: bucle for con cursor
Date: 2008-10-08 22:53:10
Message-ID: f205bb120810081553w1f0cbd81x3e70165763fe4c7d@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

En la lista general preguntaron lo mismo

LOOP
FETCH ...;
IF.....;
EXIT WHEN NOT FOUND;
...

END LOOP;

En el manual no aparece este tipo de tecnica. Seria interesante agregarla

El día 8 de octubre de 2008 13:48, Oswaldo Hernández
<listas(at)soft-com(dot)es> escribió:
> Alvaro Herrera escribió:
>>
>> Oswaldo Hernández escribió:
>>
>>> El problema se presenta en una funcion que elimina una serie de
>>> registros, pero, despues de eliminarlos aún necesito algunos datos de esos
>>> registro que he borrado. Al ya están eliminados no puedo hacer un select
>>> sobre ellos, y tampoco puedo procesar los datos antes de eliminar los
>>> registros puesto que entre la eliminacion y el procesado de los datos hay
>>> otra serie de operaciones que necesitan que estén en ese estado.
>>>
>>> Para solucionarlo habia pensado dos opciones: 1.- Guardar los datos que
>>> necesito en una tabla temporal y despues hacer un for..loop sobre la tabla
>>> temporal, y 2.- Cargarlos en un cursor y leer posteriormente los datos del
>>> cursor.
>>
>> No entiendo eso de cargar en un cursor. Ayer escribí un artículo en la
>> lista sobre los cursores, échale un vistazo.
>
> Lei tu mensaje sobre los cursores, pero creo que no es el mismo caso, ya que
> aqui el fetch lee las tuplas de una en una al igual que haria un for..loop.
>
> Sobre lo de cargar el cursor, puede que no me explicara bien. Esta es una
> version reducida de lo que pretendo:
>
> CREATE OR REPLACE FUNCTION pruebas.test_cursor()
> RETURNS boolean AS
> $BODY$
> declare
> v_cursor refcursor;
> v_rec record;
> begin
> create table pruebas.test (c integer);
> insert into pruebas.test values (1),(2),(3),(4),(5);
>
> -- *carga* antes de la eliminacion
> open v_cursor for select c from pruebas.test;
> -- eliminacion
> delete from pruebas.test;
>
> -- ... otras operaciones
>
> -- lectura de los datos almacenados en el cursor
> loop
> fetch v_cursor into v_rec;
> if v_rec is null then exit; end if;
> raise notice 'valor de cursor: %', v_rec.c;
> end loop;
> close v_cursor;
>
> drop table pruebas.test;
> return True;
> end
> $BODY$
> LANGUAGE 'plpgsql' VOLATILE
> COST 100;
>
>> Un cursor no es una
>> especie de tabla temporal al que puedas pasarle tuplas y después leerlas
>> de vuelta. Las tuplas necesitan estar almacenadas en alguna parte; el
>> cursor no tiene almacenamiento propio.
>>
> Entiendo eso y de ahi mi comentario sobre que entendia que postgres
> procesaria internamente tanto una opcion como la otra de forma muy similar,
> almacenando los datos en alguna parte. La elección entre usar una tabla
> temporal y el cursor era simplemente una cuestión de estilo.
>
> De todas formas si recomiendas que es preferible utilizar tablas temporales
> para estos casos, seguiré tu consejo.
>
> Saludos.
> --
> *****************************************
> Oswaldo Hernández
> oswaldo (@) soft-com (.) es
> *****************************************
> PD:
> Antes de imprimir este mensaje, asegúrese de que es necesario.
> El medio ambiente está en nuestra mano.
> --
> TIP 7: no olvides aumentar la configuración del "free space map"
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2008-10-08 23:06:15 Re: plpsql: bucle for con cursor
Previous Message Oswaldo Hernández 2008-10-08 16:48:46 Re: plpsql: bucle for con cursor