Friday, September 26, 2008

[pgsql-es-ayuda] Consulta plpgsql

Hola lista!

Espero que anden bien. Estoy en un brete, tengo q entregar un Trabajo Practico y estoy tratando de hacer andar un Stored Procedure que hizo una compañera en SQLServer.
Basicamente, la idea del algoritmo es ir haciendo ciertas consultas, almacenarlas en tablas temporales y al final hacer un join con dos de ellas y una tabla comun y mostrar el resultado de dicho join.
Cuando empecé a pasarlo, me encontré con que no se puede hacer select into temp table dentro del Stored procedure, diganme si me equivoco.
Luego declare todas mis tempTables como variables record.
Actualmente, el error que me tira, es que no tengo definido el formato de la tabla, leí por ahí que puedo definirlo como el formato de otra tabla al definir la variable, pero no tengo ninguna tabla con la misma estructura.
Como sería la manera correcto de resolverlo?
Les adjunto al final el codigo.
Muchas gracias

Moski

CREATE OR REPLACE FUNCTION deudasSocios ()  RETURNS setof record AS $$
    DECLARE
    SocDeudaActualTemp FacturaCuota%rowtype;
    FacturaCuotaTemp record;
    SocDeudaAnteriorTemp record;
    deudaActualTemp record;
    deudaAnteriorTemp record;
    SocioDeudaTemp record;
    familiaresTemp record;

    BEGIN
   
    /*devuelve la mayor fecha de vencimiento de cada socio del a�o actual*/
    EXECUTE 'SELECT FC.Nro_Base, max(FC.fecha_vencimiento) as fecha_vencimiento
    FROM FacturaCuota as FC
    GROUP BY FC.Nro_Base'
    INTO SocDeudaActualTemp;

    /*devuelve todas las facturas del a�o anterior*/
    EXECUTE 'SELECT *
    FROM FacturaCuota as FC
    WHERE extract(year from FC.fecha_vencimiento) = extract(year from current_date) - 1'
    INTO FacturaCuotaTemp;

    /*devuelve la mayor fecha de vencimiento de cada socio del a�o anterior*/
    EXECUTE 'SELECT FC.Nro_Base, max(FC.fecha_vencimiento) as fecha_vencimiento
    FROM FacturaCuotaTemp as FC
    GROUP BY FC.Nro_Base'
    INTO SocDeudaAnteriorTemp;

    /*devuelve la deuda acumulada hasta el momento*/
    EXECUTE 'SELECT FC.Nro_Base, FC.deuda as deuda
    FROM SocDeudaActualTemp, FacturaCuota as FC
    WHERE FC.Nro_Base = SocDeudaActualTemp.Nro_Base and
    FC.fecha_vencimiento = SocDeudaActualTemp.fecha_vencimiento '
    INTO deudaActualTemp;

    /*devuelve la deuda acumulada hasta el a�o anterior*/
    EXECUTE 'SELECT FC.Nro_Base, FC.deuda as deuda
    FROM SocDeudaAnteriorTemp, FacturaCuota as FC
    WHERE FC.Nro_Base = SocDeudaAnteriorTemp.Nro_Base and
    SocDeudaAnteriorTemp.fecha_vencimiento = FC.fecha_vencimiento'
    INTO deudaAnteriorTemp;

    /*devuelve la deuda del ultimo a�o*/
    EXECUTE 'SELECT deudaActualTemp.nro_base, (deudaActualTemp.deuda - deudaAnteriorTemp.deuda) as deuda
    FROM deudaActualTemp, deudaAnteriorTemp
    WHERE deudaAnteriorTemp.Nro_Base = deudaActualTemp.Nro_Base and
    (deudaActualTemp.deuda - deudaAnteriorTemp.deuda) > 0'
    INTO SocioDeudaTemp ;

    /*devuelve la cantidad de socios familiares que tiene cada socio titular*/
    EXECUTE 'SELECT count(SF.nro_base) as cantidadFamilia, SF.nro_base
    FROM SocioFamiliar as SF
    GROUP BY SF.nro_base'
    INTO familiaresTemp;


    /*devuelve los datos del socio titular de grupos familiares que adeuden cuotas sociales del
    a�o en curso, junto con el importe total adeudado, y la cantidad de integrantes del
    grupo.*/
    RETURN QUERY SELECT  SocioDeudaTemp.deuda, familiaresTemp.cantidadFamilia, ST.*
        FROM quote_ident(SocioDeudaTemp), quote_ident(familiaresTemp), SocioTitular as ST
        WHERE SocioDeudaTemp.nro_base = familiaresTemp.nro_base and
        ST.nro_base = SocioDeudaTemp.nro_base;

   
    END;
$$ LANGUAGE 'plpgsql';


No comments: