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 <[EMAIL PROTECTED]>

>  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
[EMAIL PROTECTED]
www.digitalware.com.co

Responder a