Re: problema con cursores

From: Lennin Caro <lennin(dot)caro(at)yahoo(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org, "Manuel A(dot) Estevez Fernandez" <stvzito(at)gmail(dot)com>
Subject: Re: problema con cursores
Date: 2009-03-03 22:34:06
Message-ID: 797284.71296.qm@web59502.mail.ac4.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


> 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

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message inf200476 2009-03-04 02:30:02 PL/pgsql
Previous Message Alvaro Herrera 2009-03-03 21:34:15 Re: obtener semana segun el dia