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';
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:
Post a Comment