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/
--
TIP 9: visita nuestro canal de IRC #postgresql-es en irc.freenode.net

Responder a