Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-es-ayuda by date

Next:From: Javier Chávez B.Date: 2008-11-21 13:45:39
Subject: Re: Retornar cursor
Previous:From: Emanuel CALVO FRANCODate: 2008-11-21 13:38:35
Subject: Re: Fwd: PG Day

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group