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