> Mi necesidad es la siguiente, tengo que insertar una gran > cantidad de > registros dentro de una tabla (conciliacion_inventario) y > luego tengo que > tomar todos aquellos registros que indican diferencias, y > buscar en que > partes de otra tabla coinciden los registros y regresar a > un campo de > observaciones la posicion de las diferencias, para realizar > esta tarea > decidi utilizar un trigger que cambie las observaciones y > coloque el lugar > donde se encuentra la diferencia. Cabe mencionar que tengo > poca experiencia > en manejo de base de datos... y me dijeron que deberia > utilizar cursores > para poder manejar todos esos registros por que si no solo > se aplicaria el > cambio al primer registro insertado. > mis tablas son de la siguiente manera: > conciliacion_inventario(id_ > conciliacion,id_inventario,id_sucursal,id_articulo,cantidad_conteo,cantidad_sistema,diferencia,observaciones) > marbetes(id_marbete,id_mueble,id_inventario,id_sucursal,id_articulo,cantidad) > > y esta es la funcion donde tengo problemas: > > CREATE FUNCTION marbetear_conciliacion() > RETURNS TRIGGER > AS $funcion$ > > DECLARE > cur_conciliacion CURSOR FOR SELECT > ci.id_articulo,(m.id_mueble||'-'||m.id_marbete) AS > observaciones FROM > marbetes m, conciliacion_inventario ci WHERE > ci.direnciancia<>0 AND > ci.id_articulo=m.id_articulo GROUP BY > ci.id_articulo,m.id_mueble,m.id_marbete ORDER BY > ci.id_articulo; > > BEGIN > > > IF(TG_OP='INSERT') THEN > OPEN cur_conciliacion; > FETCH NEXT IN cur_conciliacion; > WHILE(FOUND)LOOP > BEGIN > SELECT observaciones = observaciones + > ','; > > UPDATE conciliacion_inventario SET > observaciones = > (observaciones + observaciones) > WHERE NEW.id_articulo=ci.id_articulo; > > FETCH NEXT IN cur_conciliacion ; > END; > END LOOP ; > CLOSE cur_conciliacion; > END IF; > > > > END; > $funcion$ LANGUAGE 'plpgsql'; > > Espero que pudieran decirme donde esta mi error o ayudarme > a buscar otra > solucion. > De antemano gracias y que en espera de sus comentarios > > -- > by: > > Manuel Alejandro Estevez Fernandez > > _][_ Stvz _][_
Primero no veo donde esta el mensaje de tu error o en que linea se genera Segundo los errores que veo son Como dice alvaro el SELECT observaciones = observaciones + ','; deberia ser SELECT observaciones = observaciones || ','; y lo otro es que estas usando el FETCH para que te muestre el resultado de un cursor por consola no para interactuar con el cursos. DECLARE cur_conciliacion CURSOR FOR SELECT "2" OPEN cur_conciliacion; FETCH NEXT IN cur_conciliacion; si no me equivoco deberia de ser asi DECLARE cur_conciliacion CURSOR FOR SELECT "2" DECLARE registro record; OPEN cur_conciliacion; FETCH NEXT FROM cur_conciliacion IN registro; espero te sirva -- TIP 7: no olvides aumentar la configuración del "free space map"