RE: Retornar cursor

From: Fernando Siguenza <fsigu(at)hotmail(dot)com>
To: <erikferneycubillos(at)gmail(dot)com>
Cc: Foro Postgres <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: Retornar cursor
Date: 2008-11-21 15:32:06
Message-ID: COL111-W65798AEA5F3359D3907789A10F0@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


Amigos no me quedo muy claro he probado pero nada no se si me ayudar, como creo un cursor con dos columna o las que necesite??, luego quiero retornar este cursor despues de haberlo manipulado como se hace??

Saludos

Date: Fri, 21 Nov 2008 08:41:11 -0500From: erikferneycubillos(at)gmail(dot)comTo: fsigu(at)hotmail(dot)comSubject: Re: [pgsql-es-ayuda] Retornar cursorCC: pgsql-es-ayuda(at)postgresql(dot)orghola 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 RECORDAS$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 calculosentonces..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® connects the people, information, and fun that are part of your life-- Atentamente,______________________________ERIK FERNEY CUBILLOS GARCIAIng. Desarrollo - Kactus HRDIGITAL WARE LTDA.Calle 72 No. 12-65 Piso 2 Bogotá, Colombia erikc(at)digitalware(dot)com(dot)cowww(dot)digitalware(dot)com(dot)co
_________________________________________________________________
Stay up to date on your PC, the Web, and your mobile phone with Windows Live
http://clk.atdmt.com/MRT/go/119462413/direct/01/

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Javier Chávez B. 2008-11-21 15:37:47 Re: Retornar cursor
Previous Message Emanuel CALVO FRANCO 2008-11-21 15:12:43 Re: Fw: Instalacion de postgres en windows