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"

Responder a