RE: cursores

From: Gabriel Hermes Colina Zambra <hermeszambra(at)yahoo(dot)com>
To: lista postgres <pgsql-es-ayuda(at)postgresql(dot)org>, andrea lisseth fuentes meneses <andri04_7(at)hotmail(dot)com>
Subject: RE: cursores
Date: 2008-08-03 02:09:15
Message-ID: 128236.30456.qm@web63707.mail.re1.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


Hola todos: necesito una ayudita, e manejado cursores en sql server, pero no en postgres, no se como es la estrucutra, trate de
correrlo asi pero me sale un error no se en que cambia la sintaxis.

agradeceria mucho si me pueden ayudar.

BEGIN
DECLARE consecutivo AS INTEGER
SET consecutivo=0
curciudad INSENSITIVE CURSOR FOR select mun_cdgo,mun_nmbre from udi.mncpios;
begin
OPEN curciudad;
 FETCH NEXT FROM curciudad INTO codigo,nombre
WHILE (found) loop
  BEGIN
  consecutivo=consecutivo+1
   INSERT INTO bodega.ciudad VALUES (@consecutivo,@codigo,@nombre)
END;
end loop;
close curciudad;
  

Andrea Lisseth Fuentes Meneses

Me parece que con este procedimiento estas generando multiples insert y no es lo mas adecuado en mi himo, igualmente en mi contestacion anterior te puse un ejemplo que te orienta en lo que tu estas buscando.

No obstante te pongo dos ejemplos que creo te puedan servir, uno con pl/pgsql y otro que no viene al caso pero devuelve un cursor en una funcion con lenguaje sql.

CREATE OR REPLACE FUNCTION "central"."fnc_estadistica_articulos" (varchar) RETURNS bigint AS
$body$
declare
cmes alias for $1;
BEGIN
delete from central.estadistica_articulos;
insert into central.estadistica_articulos
(mes,id_familia,familia,id_articulo,articulo,m1,m2,m3,m4,m5,m6,m7,
m8,m9,m10,m11,m12,venta,s_central,s_sucursal,s_deposito1,stock)
SELECT $1 as mes,articulos.id_familia,familia.familia,articulos.id_articulo, articulos.descripcion AS articulo,
cestadistica_articulos_stock.m1, cestadistica_articulos_stock.m2,
cestadistica_articulos_stock.m3, cestadistica_articulos_stock.m4,
cestadistica_articulos_stock.m5, cestadistica_articulos_stock.m6,
cestadistica_articulos_stock.m7, cestadistica_articulos_stock.m8,
cestadistica_articulos_stock.m9, cestadistica_articulos_stock.m10,
cestadistica_articulos_stock.m11, cestadistica_articulos_stock.m12,
(((((((((((cestadistica_articulos_stock.m1 +
cestadistica_articulos_stock.m2) + cestadistica_articulos_stock.m3) +
cestadistica_articulos_stock.m4) + cestadistica_articulos_stock.m5) +
cestadistica_articulos_stock.m6) + cestadistica_articulos_stock.m7) +
cestadistica_articulos_stock.m8) + cestadistica_articulos_stock.m9) +
cestadistica_articulos_stock.m10) + cestadistica_articulos_stock.m11) +
cestadistica_articulos_stock.m12) AS venta,
cestadistica_articulos_stock.s_central,
cestadistica_articulos_stock.s_sucursal,
cestadistica_articulos_stock.s_deposito1, ((CASE WHEN
(nullvalue(cestadistica_articulos_stock.s_central) = true) THEN (0)::double
precision ELSE cestadistica_articulos_stock.s_central END + CASE WHEN
(nullvalue(cestadistica_articulos_stock.s_sucursal) = true) THEN
(0)::double precision ELSE cestadistica_articulos_stock.s_sucursal END) +
CASE WHEN (nullvalue(cestadistica_articulos_stock.s_deposito1) = true) THEN
(0)::double precision ELSE cestadistica_articulos_stock.s_deposito1 END) AS stock
FROM (central.articulos LEFT JOIN central.cestadistica_articulos_stock ON

(((articulos.id_articulo)::text =
(cestadistica_articulos_stock.id_articulo)::text)))

left join central.familia on familia.id_familia=articulos.id_familia
where articulos.desactivado<>true;
RETURN 1;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

Esta funcion es vieja, puesto que despues aprendi que para los valores null, coalesce es una opcion mejor, de todas maneras valga el ejemplo

Si yo quisiera mantener un numero consecutivo del orden del insert en la tabla recipiente pondria un serial (autonumerico), incluso si necesito borrar la tabla y que el serial vuelva a empezar en 0 antes de insertar lo puedo lograr desde la funcion.

Ahora como aporte va otra funcion en lenguaje sql, que mucho no tiene que ver con el tema pero te va a orientar en que podes hacer procedimientos en varios lenguajes segun el cometido y que es mas potente que Transact Sql.

Y por supuesto cumple mejor el standard.

En postgresql no tenemos vistas actualizables, salvo que declaremos las reglas rule que permitan que las mismas acepten delete update o insert.

Bien aca va una funcion que me devuelve un recordset de una vista filtrada por parametros y que es actualizable desde una gilla de visual basic a traves de un dataenviroment.

CREATE OR REPLACE FUNCTION "central"."fnc_acree_sin_asignar" (nempresa integer, nmoneda integer) RETURNS SETOF "central"."cdocumentos_acreedores_sin_asignar" AS
$body$
select * from central.cdocumentos_acreedores_sin_asignar
where id_empresa = $1 and id_moneda = $2
$body$
LANGUAGE 'sql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

Piola no ?.

Bien espero que los dos correos te aporten para que continues con esta herramienta que en costo/beneficio no es superada por ninguna del SL ni del Software Propietario.

En la lista encontraras gente que te de mejores soluciones puesto que saben muchisimo mas que yo, pero pediselo respetado la netiquette que te mande en el otro correo.

De todas maneras me gusta aportar lo que puedo para que mucha gente que viene de la cultura del Soft Propietario tenga los elementos para adaptarse mas rapidamente que yo a algo que lo beneficiara muchisimo, como es PostgreSQL y su notable comunidad.

Bienvenida.

Atte.
Gabriel Colina

____________________________________________________________________________________
Yahoo! MTV Blog & Rock &gt;¡Cuéntanos tu historia, inspira una canción y gánate un viaje a los Premios MTV! Participa aquí http://mtvla.yahoo.com/

In response to

  • RE: cursores at 2008-08-02 23:55:15 from andrea lisseth fuentes meneses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Luis Felipe Aguilar Pereda 2008-08-03 04:42:33 mygeneration
Previous Message andrea lisseth fuentes meneses 2008-08-02 23:55:15 RE: cursores