Re: Retornar cursor

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

In response to

Responses

Browse pgsql-es-ayuda by date

  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