Re: Array de Objects en una funcion

From: Emanuel Calvo <postgres(dot)arg(at)gmail(dot)com>
To: "Ivan Perales M(dot)" <ivan(dot)perales(at)gmail(dot)com>
Cc: Ayuda Esp PostgreSQL <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Array de Objects en una funcion
Date: 2014-09-14 20:45:45
Message-ID: CAGHEX6bsWkxZYsnRUfc-eM7FYQ9P+3=LOCLmdoTJfbvFr0sbVA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El 11 de septiembre de 2014, 21:50, Ivan Perales M. <ivan(dot)perales(at)gmail(dot)com>
escribió:

> Hola buenas noches.
>
> Estoy batallando con un escenario. Estoy migrando una base de datos de H2
> database a postgresql ya que en algunas ocasiones falla por razones que no
> he podido debugear y como el tiempo es oro decidi a cambiar de base.
>
> Todo muy bien excepto por una funcion que escribi, la cual hace lo
> siguiente:
>
> Tengo una tabla con facturas, y cada factura tiene diferentes impuestos.
> Así una factura puede no tener impuestos, otras pueden tener 1 o 2 o 3 o N
> impuestos.
>
> Entonces tengo una tabla con impuestos y tengo otra tabla intermedia donde
> relaciono la factura con sus impuestos. Como las facturas las muestro en un
> paginador, hago un query como:
>
> select *, myfuncion('select impuesto, valor from tabla_intermedia where
> fac_id =' || id) from factura...
>
> myfuncion se encarga de ejecuta el query que indico, el cual como ven
> retorna dos valores por cada impuesto, la clave del impuesto y el valor del
> mismo. La funcion creada en h2 database se encarga de crear un array y
> retornarlo. Por ejemplo si una factura tiene 2 impuestos: el valor
> resultante seria: {'impuesto1', 1243.23, 'Impuesto2', 543.43}. Este
> resultado lo proceso y lo muestra en una tabla.
>
>
Para ese tipo de formato preferiría hstore. IMHO no es muy consistente
depender del orden de las variables para identificarlas (esto es, separar
por coma columnas distintas).

http://www.postgresql.org/docs/9.3/static/hstore.html

Un ejemplo:

esayuda=# select other_sol from impuestoingreso where id =4;
other_sol
---------------------------------
"nombre1"=>"1", "otro_imp"=>"5"
"nombre3"=>"3", "otro_imp"=>"5"
"nombre1"=>"3", "otro_imp"=>"5"
(3 rows)

La ventaja de este tipo es que luego puedes buscar dentro de cada valor
(además de muchas otras operaciones):

esayuda=# select other_sol->'otro_imp' from impuestoingreso where id =4;
?column?
----------
5
5
5
(3 rows)

Otra solución más manejable es que te retorne una tabla:

esayuda=# CREATE FUNCTION sarasa (id int) RETURNS TABLE (nombreunico
text,valor double precision)
esayuda-# AS $$
esayuda$# SELECT nombreunico,valor from impuestoingreso
esayuda$# WHERE id = $1
esayuda$# $$
esayuda-# LANGUAGE SQL;
CREATE FUNCTION
esayuda=# select * from sarasa(4);
nombreunico | valor
-------------+-------
nombre1 | 1
nombre3 | 3
nombre1 | 3
(3 rows)

--
--
Emanuel Calvo http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Carlos Joaniquet Tamburini 2014-09-15 11:49:44 Re: Disparador que crea registros en una tabla para control de UPDATE y DELETE de otra tabla
Previous Message Ivan Perales M. 2014-09-12 19:17:47 Re: Array de Objects en una funcion