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"