Re: [pgsql-es-ayuda] Recorrer una consulta según un dato de una tabla

From: "Alejandro Romero Parra" <aromero(at)etesa(dot)com(dot)mx>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: [pgsql-es-ayuda] Recorrer una consulta según un dato de una tabla
Date: 2005-05-18 16:35:12
Message-ID: 004901c55bc7$9077b170$2e00020a@chafireta
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Se requiere auditar los valores que se cambian en las tablas de una BD, los
campos importantes son:

usuario, fecha, tabla, tipo de movimiento (inserción, actualización y
borrado), campo, valor anterior , valor nuevo.

Alguien ya habrá implementado un trigger con esa funcionalidad.

Saludos

----- Original Message -----
From: "Jaime Casanova" <systemguards(at)gmail(dot)com>
To: "Ricardo Fuentes Pereira" <rfuentesp(at)gmail(dot)com>
Cc: <pgsql-es-ayuda(at)postgresql(dot)org>
Sent: Wednesday, May 18, 2005 11:08 AM
Subject: Re: [pgsql-es-ayuda] Recorrer una consulta según un dato de una
tabla

> On 5/18/05, Ricardo Fuentes Pereira <rfuentesp(at)gmail(dot)com> wrote:
>> Hola.
>>
>> Necesito recorrer una tabla en funcion de un parámetro que se obtiene de
>> otra. Hasta aquí lo que llevo:
>>
>> ----
>> CREATE OR REPLACE FUNCTION select()
>> RETURNS refcursor AS
>> '
>> DECLARE
>> rec RECORD;
>> rc REFCURSOR;
>> BEGIN
>> FOR rec IN
>> SELECT param
>> FROM tabla1
>> LOOP
>> END LOOP;
>>
>> OPEN rc FOR
>> SELECT *
>> FROM tabla2
>> WHERE rut = rec.param;
>> RETURN rc;
>> END;
>> '
>> LANGUAGE 'plpgsql' VOLATILE;
>> ----
>>
> Tienes varias fallas en esa funcion por ejemplo tienes un loop que no
> hace nada mas que obtener un (y solo un) valor del select.
>
> Y creo que en general la logica es incorrecta, prueba mas bien con
> algo como esto:
>
> CREATE OR REPLACE FUNCTION select() RETURNS tabla2 AS '
> SELECT * FROM tabla2 WHERE rut IN (SELECT param FROM tabla1);'
> LANGUAGE 'sql' VOLATILE;
>
>> Antes hacía esto en el lenguaje de programación (Java), o sea obtenía
>> todos los parametros, y luego uno a uno iba obteniendo los datos de la
>> 'tabla2'. Funcionaba bien hasta que lo probamos en un entorno real donde
>> habían muchos datos. Y claro, el tiempo de espera se hizo eterno (6
>> minutos mas o menos), ocupa toda la CPU, entre otros problemas. Ahí el
>> cuello de botella estaría (a grueso modo) en abrir la conexion, obtener
>> los datos y cerrar la conexion por cada parametro.
>>
>> Volviendo a mi primer experimento, al ejecutar el SP, solo me devuelve
>> un registro. ¿Alguna idea de por qué ocurre esto?¿Cómo podría solucionar
>> mi problema?
>>
>> Salu2.
>>
>> PD1: Estoy "obligado" a devolver un refcursor debido a que trabajo con
>> Java y según la especificación tengo que trabajar con ese tipo de dato
>> para obtener los registros/filas.
>>
> No estas obligado, la funcion que te di la ejecutas como cualquier select
> select * from select(); y eso lo puedes ejecutar desde Java. O tienes
> algun tipo de problema al respecto?
>
> --
> Atentamente,
> Jaime Casanova
> (DBA: DataBase Aniquilator ;)
>
> ---------------------------(fin del mensaje)---------------------------
> TIP 5: ¿Has leído nuestro extenso FAQ?
>
> http://www.postgresql.org/files/documentation/faqs/FAQ.html

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alberto Pia 2005-05-18 16:41:40 ODBC contra OLEdb
Previous Message Jaime Casanova 2005-05-18 16:08:54 Re: Recorrer una consulta según un dato de una tabla