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 ...}
 
  |          Semana 1          |            Semana 2         |           Semana 3          |                    ...}

 

  *  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 ...}

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

 

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


                                                                      Total Solicitudes: 102
 
                                                                      Total Solicitudes Tipo 1: 42
                                             
                                                                      Total Solicitudes 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 un SELECT en cada iteración para poder totalizar segun las fechas.