Re: Recorrer una consulta según un dato de una tabla

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" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Recorrer una consulta según un dato de una tabla
Date: 2005-05-18 16:08:54
Message-ID: c2d9e70e050518090841c8877b@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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 ;)

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alejandro Romero Parra 2005-05-18 16:35:12 Re: [pgsql-es-ayuda] Recorrer una consulta según un dato de una tabla
Previous Message Alvaro Herrera 2005-05-18 16:04:55 Re: de ae2