PostgreSQL - Dudas con Cursores

 
Vista:
Imágen de perfil de valeria

Dudas con Cursores

Publicado por valeria (5 intervenciones) el 30/10/2014 05:48:04
Hola, espero puedan ayudarme con esta función, que por más vueltas que le he dado no puedo hallar el error.

Tengo que realizar una función que reciba como parámetros una fecha desde y una fecha hasta, cargue el cursor con los datos de operaciones, lea el cursor y grabe dichos datos en la tabla “operacionespecial”.

Esta es la función que hice:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE OR REPLACE FUNCTION Operaciones(fech_desde date, fech_hasta date)
RETURNS VOID AS $Op$
DECLARE
   NroOp int;
   OpCursor CURSOR(fech_desde date, fech_hasta date) FOR SELECT * FROM Tb_Detalle_Operacion;
BEGIN
   IF NroOperac <>
   OPEN OpCursor(fech_desde, fech_hasta);
   LOOP
     FETCH OpCursor INTO NroOp;
     INSERT INTO Tb_OperacionesEspeciales SELECT * FROM Tb_Detalle_Operacion
     WHERE FechaOperacion BETWEEN fech_desde AND fech_hasta AND NroOperac <> NroOp;
     EXIT WHEN NOT FOUND;
   END LOOP;
   CLOSE OpCursor;
END;
$Op$ LANGUAGE 'plpgsql';

Al ejecutar la función me sale como mensaje de error:
1
2
3
ERROR:  llave duplicada viola restricción de unicidad «tb_operacionesespeciales_pkey»
DETAIL:  Ya existe la llave (nrooperac)=(101).
CONTEXT:  sentencia SQL: «INSERT INTO Tb_OperacionesEspeciales SELECT * FROM Tb_Detalle_Operacion
Este mensaje lo devuelve con todas la ejecuciones que haga.

Aclaro que tanto la Tabla Tb_Detalle_Operacion como Tb_OperacionesEspeciales contienen los mismos campos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Dudas con Cursores

Publicado por martin (121 intervenciones) el 31/10/2014 13:52:36
el error es basicamente que lo datos que estas insertando ya estan en la tabla destino.
Yo escribo distinto los cursores, me resulta raro como lo implementaste.
El if en postgre yo lo uso IF THEN y aca falta el THEN(y NroOperac no esta declarado en declare,no se de donde sale) .
Al cursor le pasas dos parametros pero no lo USAS en el query que vas a cargar en el cursor.
Con lo cual ese periodo no se filtra en el cursor y da lugar a varios registros.

Compilar bien ese codigo?

SAludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de valeria

Dudas con Cursores

Publicado por valeria (5 intervenciones) el 02/11/2014 20:17:18
Hola, primero los datos que estaba intentando insertar no se encontraban en la tabla, segundo si compilaba bien el código, ahora lo del IF tienes razón al igual que lo de los parámetros, que no lo había tenido en cuenta antes. Ya puede resolverlo.

Lo modifique de está manera:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE OR REPLACE FUNCTION OperacionCursor(FechDesde date, FechHasta date) RETURNS VOID AS
$OpCur$
DECLARE
    OperCursor CURSOR FOR SELECT * FROM Tb_Detalle_Operacion
    WHERE FechaOperacion BETWEEN FechDesde AND FechHasta;
    Contenido Tb_Detalle_Operacion %ROWTYPE;
BEGIN
    OPEN OperCursor;
    LOOP
      FETCH OperCursor INTO Contenido;
      IF NOT FOUND THEN
            EXIT;
      END IF;
      INSERT INTO Tb_OperacionesEspeciales(NroOperac, FechaOperacion, TotalOper,
      MatriculaOdontologo, CodPaciente)
      VALUES (Contenido.NroOperac, Contenido.FechaOperacion, Contenido.TotalOper,
      Contenido.MatriculaOdontologo, Contenido.CodPaciente);
    END LOOP;
    CLOSE OperCursor;
END;
$OpCur$
LANGUAGE 'plpgsql'

Y ahora funcionó correctamente. Gracias por responder
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Dudas con Cursores

Publicado por Cristian (1 intervención) el 26/02/2017 17:30:40
Excelente, muchas gracias por compartirlo.
Me ha funcionado muy bien la parte de insertar gracias a usted.
Casi que no encuentro un ejemplo tan claro como este.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar