| 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: | Whole Thread | Raw Message | 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 ;)
| 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 |