> 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"

Responder a