Re: Como volcar un query sobre un array

From: Anthony Sotolongo <asotolongo(at)gmail(dot)com>
To: Kernel <jucabapa(at)gmail(dot)com>, Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Como volcar un query sobre un array
Date: 2015-07-09 13:10:18
Message-ID: 559E72BA.2040306@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola Kernel, te pongo un ejemplo volcándolo en un Arreglo y recorriendo
un Cursor, no se si se ajuste a tu escenario, la primera función lo
vuelca en un arreglo y la segunda a un cursor y estos son los
resultados, con sus veces de ejecución y los tiempos, saca tus
conclusiones y ajústalo a tu escenario:

func_oid | line_number | line | exec_count | total_time | longest_time
----------+-------------+-----------------------------------------------------------------------------------------+------------+------------+--------------
68829 | 1 |
| 0 | 0 | 0
68829 | 2 | DECLARE
| 0 | 0 | 0
68829 | 3 | contador integer := 0; |
0 | 0 | 0
68829 | 4 | precio numeric;
| 0 | 0 | 0
68829 | 5 | arreglo int[2];
| 0 | 0 | 0
68829 | 6 | BEGIN
| 0 | 0 | 0
68829 | 7 | for arreglo in select
array[prod_id,category] from products where prod_id>$1 LOOP | 1
| 26019 | 26019
68829 | 8 | contador:=contador+arreglo[2]; |
9869 | 13389 | 59
68829 | 9 | END LOOP; | 0
| 0 | 0
68829 | 10 | RETURN contador; |
1 | 3 | 3
68829 | 11 | END; | 0 |
0 | 0
68831 | 1 |
| 0 | 0 | 0
68831 | 2 | DECLARE | 0
| 0 | 0
68831 | 3 | cur CURSOR FOR select
array[prod_id,category] from products where prod_id>$1; |
0 | 0 | 0
68831 | 4 | contador integer := 0;
| 0 | 0 | 0
68831 | 5 | arreglo int[2];
| 0 | 0 | 0
68831 | 6 | BEGIN | 0 |
0 | 0
68831 | 7 | OPEN cur; | 1
| 210 | 210
68831 | 8 | LOOP
| 1 | 48382 | 48382
68831 | 9 | FETCH cur INTO arreglo;
| 9870 | 24318 | 84
68831 | 10 | EXIT WHEN not found;
| 9870 | 11754 | 44
68831 | 11 | contador:=contador+arreglo[2]; |
9869 | 9992 | 47
68831 | 12 | END LOOP;
| 0 | 0 | 0
68831 | 13 | CLOSE cur;
| 1 | 6 | 6
68831 | 14 | RETURN contador; | 1
| 2 | 2
68831 | 15 | END;
| 0 | 0 | 0
(26 filas)

(END)

saludos

On 09/07/15 08:31, Kernel wrote:
> Hola,
>
> Estoy empezando a crear funciones en plpgsql, y la verdad tengo
> bastantes dudas
>
>
> Tengo que recorrerme varias veces el resultado de un mismo query y la
> verdad no se cual es la mejor, la tabla va ha ser grande y sera una
> tabla muy concurrida, y necesito que la funcion sea muy rápida
>
> Este es el query
>
> SELECT ubicacion,articulo,lote,sum(entradas-salidas)
> FROM movi
> WHERE movi.id_contenedor = a407.i_contenedor
> GROUP BY ubidacion,articulo,lote
> HAVING sum(entradas - salidas) <> 0
> ORDER BY ubidacion,articulo,lote
>
> el resultado estará mas o menos entre 0 y 3 filas
>
> Mis dudas :
>
> - ¿la segunda vez que intente hacer un loop, esta en cache y no cuesta ?
> - ¿Mejor lo vuelco a un record.array y recorro el array las veces que
> necesite? ¿como lo vuelco?
>
> - Declaro un cursor y solo lo habro una vez (con el OPEN) y luego lo
> recorro con fecth las veces que necesite?
>
> - y la ultima que se me ocurre y mas limpia, si utilizo sentecias
> select sobre esta que actuaria como una subconsulta que si esta en
> cache iria rapido (esto ultimo es algo que creo yo)
>
> Algo asi ....
>
> SELECT a. ...
> from
> (SELECT ubicacion,articulo,lote,sum(entradas-salidas)
> FROM movi
> WHERE movi.id_contenedor = a407.i_contenedor
> GROUP BY ubidacion,articulo,lote
> HAVING sum(entradas - salidas) <> 0
> ORDER BY ubidacion,articulo,lote)) a
> group by a. ....
>
>
> Gracias ..
>
> -
> Enviado a la lista de correo pgsql-es-ayuda
> (pgsql-es-ayuda(at)postgresql(dot)org)
> Para cambiar tu suscripci�n:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
Para cambiar tu suscripcin:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2015-07-09 13:11:30 Re: Como volcar un query sobre un array
Previous Message Kernel 2015-07-09 11:31:10 Como volcar un query sobre un array