From: | "Erik Ferney Cubillos Garcia" <erikferneycubillos(at)gmail(dot)com> |
---|---|
To: | "Fernando Siguenza" <fsigu(at)hotmail(dot)com> |
Cc: | "Foro Postgres" <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Retornar cursor |
Date: | 2008-11-21 13:41:11 |
Message-ID: | 147151cc0811210541r289b943fo9003e0f660c989b0@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
hola compa... bueno la diferencia no es mucha... es básicamente como vayas
el cursor... aqui te dejo un ejemplo de una Función, si vas a hacer un
select de la función, esata debe tener más de dos tipos de parámetro OUT,
como el ejemplo, espero te sirva
*CREATE OR REPLACE FUNCTION spnmcalpromconcepto (
IN PSiCodEmpr INTEGER, -- Codigo de Empresa
IN PDeCodEmpl NUMERIC, -- Codigo del empleado
IN PStNroCont CHARACTER VARYING, -- Número de Contrato
IN PDtFecInic TIMESTAMP, -- Fecha Inicial del calculo
IN PDtFecFina TIMESTAMP, -- Fecha Final del calculo
IN PSiCodConc INTEGER, -- Codigo del concepto a promediar
IN PStTipProm CHARACTER VARYING, -- Indicador de si es con el valor
pagado o el valor real
OUT PDeValProm NUMERIC, -- Base de liquidacion
OUT PStValor CHARACTER VARYING --ESTA VARIABLE NO SIRVE PARA NADA, SOLO
SE PONE PARA PODER RETORNAR UN CONJUNTO DE DATOS
)
RETURNS RECORD
AS
$BODY$
DECLARE
-- Declara variables del cursor
v_LDeSumValo NUMERIC(28,2); -- Valor acumulado
v_DeValProm NUMERIC(16,2) := 0; -- Base de liquidacion
-- Declara cursores
CurPromReal refcursor;
CurPromAcum refcursor;
BEGIN
open CurPromReal FOR
(SELECT SUM(val_real) as val_real
FROM nm_preno
WHERE nm_preno.cod_empr = PSiCodEmpr AND
nm_preno.cod_empl = PDeCodEmpl AND
nm_preno.nro_cont = PStNroCont AND
nm_preno.cod_conc = PSiCodConc AND
nm_preno.fec_acum >= PDtFecInic AND
nm_preno.fec_acum <= PDtFecFina
UNION
SELECT SUM(val_real) as val_real
FROM nm_acumu
WHERE nm_acumu.cod_empr = PSiCodEmpr AND
nm_acumu.cod_empl = PDeCodEmpl AND
nm_acumu.nro_cont = PStNroCont AND
nm_acumu.cod_conc = PSiCodConc AND
nm_acumu.fec_acum >= PDtFecInic AND
nm_acumu.fec_acum <= PDtFecFina);
open CurPromAcum FOR
(SELECT SUM(val_acum) as val_acum
FROM nm_preno
WHERE nm_preno.cod_empr = PSiCodEmpr AND
nm_preno.cod_empl = PDeCodEmpl AND
nm_preno.nro_cont = PStNroCont AND
nm_preno.cod_conc = PSiCodConc AND
nm_preno.fec_acum >= PDtFecInic AND
nm_preno.fec_acum <= PDtFecFina
UNION
SELECT SUM(val_acum) as val_acum
FROM nm_acumu
WHERE nm_acumu.cod_empr = PSiCodEmpr AND
nm_acumu.cod_empl = PDeCodEmpl AND
nm_acumu.nro_cont = PStNroCont AND
nm_acumu.cod_conc = PSiCodConc AND
nm_acumu.fec_acum >= PDtFecInic AND
nm_acumu.fec_acum <= PDtFecFina);
FETCH CurPromAcum INTO v_LDeSumValo;
WHILE FOUND LOOP
begin
IF NOT v_LDeSumValo IS NULL THEN
begin
v_DeValProm := v_DeValProm + v_LDeSumValo;
end;
end if;
fetch CurPromAcum INTO v_LDeSumValo;
end;
END LOOP; -- Fdel while del cursor
CLOSE CurPromAcum;
PDeValProm := v_DeValProm;
END; -- Fdel procedimiento;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION spnmcalpromconcepto (
IN PSiCodEmpr INTEGER, -- Codigo de Empresa
IN PDeCodEmpl NUMERIC, -- Codigo del empleado
IN PStNroCont CHARACTER VARYING, -- Número de Contrato
IN PDtFecInic TIMESTAMP, -- Fecha Inicial del calculo
IN PDtFecFina TIMESTAMP, -- Fecha Final del calculo
IN PSiCodConc INTEGER, -- Codigo del concepto a promediar
IN PStTipProm CHARACTER VARYING, -- Indicador de si es con el valor
pagado o el valor real
OUT PDeValProm NUMERIC, -- Base de liquidacion
OUT PStValor CHARACTER VARYING
)
OWNER TO postgres;*
2008/11/21 Fernando Siguenza <fsigu(at)hotmail(dot)com>
> Amigos acudo a ustedes a ver si me pueden orientar en lo que necesito.
> Quiero crear una funcion en la que me retorne varios registros bueno lo que
> tengo es dos tablas cabecera,detalle necesito en la funcion hacer un select
> de estas tablas, recorrer los registros que retorna este select y crear me
> imagino un cursor en el cual pueda ingresar los datos del select mas otros
> calculos
> entonces..
> Cual es la diferencia exacta entre cursor, refcursor o setof record para
> retornar datos?
> Como creo un cursor con ciertos campos algo asi cursor cResultado (cuenta
> varchar,saldo integer)??
> luego como manipulo este cursor es decir aderir filas modificar etc etc?
> y como retorno este cursor o tengo que retornar setof record no se?
> Ahora la ultima pregunta en c# simplemente llamaria a la funcion y los
> datos retornados los manejaria como datatable???
> Espero que me puedan ayudar gracias por su ayuda
>
> ------------------------------
> See how Windows(R) connects the people, information, and fun that are part of
> your life <http://clk.atdmt.com/MRT/go/119463819/direct/01/>
>
--
Atentamente,
______________________________
ERIK FERNEY CUBILLOS GARCIA
Ing. Desarrollo - Kactus HR
DIGITAL WARE LTDA.
Calle 72 No. 12-65 Piso 2
Bogotá, Colombia
erikc(at)digitalware(dot)com(dot)co
www.digitalware.com.co
From | Date | Subject | |
---|---|---|---|
Next Message | Javier Chávez B. | 2008-11-21 13:45:39 | Re: Retornar cursor |
Previous Message | Emanuel CALVO FRANCO | 2008-11-21 13:38:35 | Re: Fwd: PG Day |