Iteración de Cursores. Ayuda MODO TEXTO!!!!!

From: "Julio C(dot) Avila" <limpby4(at)hotmail(dot)com>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Iteración de Cursores. Ayuda MODO TEXTO!!!!!
Date: 2005-12-21 19:35:28
Message-ID: BAY107-DAV105C6A77186794CDA3782DF8310@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola a todos, tengo un problema con PostgreSQL (8.1) y agradezco de antemano
a quien pueda ayudarme.

La cuestion es la siguiente:

- Tengo una función a la cual se le pasa por parámetro un estatus, una fecha
inicial y una fecha final. Algo asi:

CREATE OR REPLACE FUNCTION MiFuncion(Status,FechaIni,FechaFin) RETURNS
refcursor as '

Nota: ya está validado que siempre la fecha inicial sea menor que la
final.

- Dentro de esa función, se hace llamado a otra fución
"rango_fecha(Status,FechaIni,FechaFin)", que calcula
un determinado rango entre la fecha inicial y la final, y dependiendo del
estatus se devuelven diferentes tipos
de rangos en un arreglo tipo date[], ejemplo:

* Estatus 1 (Significa rango mensual), Fechas: 2005-03-10 / 2005-05-19

La función "rango_fecha((Status,FechaIni,FechaFin))", retorna un
arreglo date[] de la siguiente manera:

{2005-03-10, 2002-03-31, 2005-04-01, 2005-04-30, 2005-05-01, 2005-05-19}

| Mes 1 | Mes 2
| Mes 3 |

* Estatus 2 (Significa rango semanal), Fechas: 2005-03-10 / 2005-05-19

La función "rango_fecha((Status,FechaIni,FechaFin))", retorna un
arreglo date[] de la siguiente manera:

{2005-03-10, 2005-03-17, 2005-03-18, 2005-03-25, 2005-03-26, 2005-04-02,
AAAA-MM-DD, AAAA-MM-DD, ...}

| Semana 1 | Semana 2 |
Semana 3 | Semana n ...}

* Estatus 3 (Significa rango diario), Fechas: 2005-03-10 / 2005-05-19

La función "rango_fecha((Status,FechaIni,FechaFin))", retorna un
arreglo date[] de la siguiente manera:

{2005-03-10, 2005-03-11, 2005-03-12, 2005-03-13, 2005-03-14, 2005-03-15,
AAAA-MM-DD, AAAA-MM-DD, ...}

| Dia 1 | Dia 2
| Dia 3 | Dia n
..}

NOTA: Ya la función rango_fecha((Status,FechaIni,FechaFin)) funciona
perfectamente y retorna el arreglo con las
fechas ordenadas.

ESTE ES EL PROBLEMA:

- Es necesario recorrer el arreglo de fechas, en un ciclo en el cual durante
cada iteración se realice un SELECT,
donde sus condiciones sean las fechas del arreglo tomándolas de par en
par, y en cada iteración ir agregando al cursor
cada resultado obtenido del select, como en el siguiente algoritmo:

i = 1 (i integer)

inicio ciclo

abrir cursor

cursor = cursor + select * from tabla where FechaIni >=
ArregloRango[i] and FechaFin <= ArregloRango[i+1]

/* ó alguna manera equivalente a esta instruccion. */

/* Es decir, agregarle al contenido del cursor, el resultado
de la sentencia select anterior.
por supuesto, si es que es posible hacer esto. ESTE ES EL
PROBLEMA CONCISO Y NO HE ENCONTRADO
OTRA MANERA DE RESOLVERLO
*/

cerrar cursor

i := i + 2 --De modo que tome el siguiente par de fechas del
arreglo.

fin ciclo

return cursor

- todo esto de manera de retornar un cursor que incluya todas las consultas
realizadas durante las iteraciones del ciclo.

- Otra manera que pensé para resolver esto, fue utilizar un arreglo de
cursores en cada iteración del ciclo anterior y
retornarlo al final, de modo que con cada vuelta del ciclo, se almacenase
el resultado del select en una posición del
arreglo de cursores. Y al final retornar este arreglo del cursores para
luego obtener los resultados con la instrucción
"FETCH" recorriendo el arreglo, pero tampoco sé si es posible retornar un
arreglo de cursores porque con el SQL Manager
me da problemas al compilar la función pero no me da errores al compilarla
con el PGAdmin.

Ejemplo de una posible segunda solución:

ArrCur refcursor[]; (Arreglo de cursores)
cur refcursor;
i = 1 (i integer)
j = 1 (j integer)

inicio ciclo

abrir cur FOR

select * from tabla where FechaIni >= ArregloRango[j] and
FechaFin <= ArregloRango[j+1]

Arrcur[i]:=cur
cerrar cur

i := i + 1

j := j + 2

fin ciclo

return ArrCur

- Todo lo planteado anteriormente es para construir un reporte com en el
siguiente ejemplo

+--------------------------------------------------------------------------------+ || || | REPORTE MENSUAL DE: TITULO DEL REPORTE| || | DESDE: 2005-03-10 HASTA: 2005-05-19| || || TotalSolicitudes: 102 TotalSolicitudes Tipo 1: 42 TotalSolicitudes Tipo 2: 60 +-----------------------------------------------------------------------+ | FECHA | Solicitudes tipo 1 |Solicitudes tipo 2 | |-----------------------------+---------------------+-------------------| | 2005-03-10 a 2002-03-31 | 26 |19 | |-----------------------------+---------------------+-------------------| | 2005-04-01 a 2005-04-30 | 14 |24
| |-------------------------+-------------------------+-------------------| | 2005-05-01 a 2005-05-19 | 2 |17 | +-----------------------------------------------------------------------+ || || || +--------------------------------------------------------------------------------+NOTA: Las socitudes no está totalizadas es por eso que se necesita hacer unSELECT en cada iteración para poder totalizar segun las fechas.

Responses

  • Qué es Slony? at 2005-12-21 21:10:28 from Morena Elizabeth González Villalta

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Ariel Tavella 2005-12-21 20:55:23 Error desconocido
Previous Message Alvaro Herrera 2005-12-21 17:20:14 Re: Iteración con Cursores. Ayuda!!!