Re: plpsql: bucle for con cursor

From: Oswaldo Hernández <listas(at)soft-com(dot)es>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: plpsql: bucle for con cursor
Date: 2008-10-08 16:48:46
Message-ID: 48ECE46E.3040505@soft-com.es
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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.

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message postgres Emanuel CALVO FRANCO 2008-10-08 22:53:10 Re: plpsql: bucle for con cursor
Previous Message Javier Chávez B. 2008-10-08 15:43:55 Re: plpsql: bucle for con cursor