Ver Mensaje Individual
  #1 (permalink)  
Antiguo 13/06/2016, 12:40
Avatar de freddy31DA
freddy31DA
 
Fecha de Ingreso: junio-2012
Mensajes: 84
Antigüedad: 12 años, 5 meses
Puntos: 2
Busqueda Trigger Oracle se crea pero no Actualiza

Hola buenas gente!:
Saludos a todos.
Estoy trantando de actualizar una tabla en Oracle 11g a treavés de un trigger. El trigger se compila bien. Pero cuando realizo el update en la tabla Prestamo se salta un error que ya vengo soportando:
La tabla:
Código sql:
Ver original
  1. CREATE TABLE Prestamo(
  2.  idLector NUMERIC(10) NOT NULL,
  3.  idLibro NUMERIC(10) NOT NULL,
  4.  FechaPrestamo DATE NOT NULL,
  5.  FechaDev DATE  NULL,
  6.  FechaRealDev DATE NULL,
  7.  Mora NUMBER(19,4) NULL,
  8.  estado NUMBER(1) NULL,
  9.  CONSTRAINT idlectorPrestamo_fk FOREIGN KEY (idLector) REFERENCES Estudiante(idLector),
  10.  CONSTRAINT idLibroPrestamo_fk FOREIGN KEY (idLibro) REFERENCES Libro(idLibro)
  11. );

La cosa es así: Si un lector quiere entregar un libro y este se a pasado de la fecha se le suma 5 de Mora:
Registro 1:
Código sql:
Ver original
  1. INSERT INTO Prestamo VALUES (1,1,'9-6-2016','12-6-2016','','',0);
  2. -- 0 = prestado
  3. -- 1 entregado
  4. --Devuelve:
  5.     UPDATE Prestamo SET estado=1 WHERE idLector=1 AND idLibro=1

Este es el trigger que e creado:
Código sql:
Ver original
  1. CREATE OR REPLACE TRIGGER TR_CALCULARMORA
  2.     AFTER UPDATE
  3.      ON Prestamo
  4.      FOR EACH ROW
  5.     DECLARE
  6.         dias INTEGER;
  7.         fechaDevOriginal DATE;
  8.     BEGIN
  9.          SELECT fechaDev INTO fechaDevOriginal FROM Prestamo WHERE idLector=:OLD.idLector AND idLibro=:OLD.idLibro;
  10.          SELECT trunc(sysdate) - to_date(fechaDevOriginal, 'dd-mm-yyyy') INTO dias FROM dual;
  11.          IF dias > 3 THEN
  12.           UPDATE Prestamo SET Mora=(dias-3)*5, FechaRealDev=sysdate
  13.           WHERE idLector=:OLD.idLector AND idLibro=:OLD.idLibro;
  14.           END IF;
  15.     END;
Como veran estoy tratando de actualizar la tabla Prestamo luego de la entrega - Ahí mismo debe de disparar este trigger comprobando si hay mora o no. Le resto 3 dias por que esos no cuentan solo en adelante. Con ese artilugio estoy contando cuantos dias han pasado luego de la fecha que quedo pendiente en la devolución.

El error que obtengo es:

Código sql:
Ver original
  1. UPDATE Prestamo SET estado=1 WHERE idLector=1 AND idLibro=1
  2. Informe de error -
  3. Error SQL: ORA-04091: TABLE ADMINORACLE11G.PRESTAMO IS mutating, TRIGGER/FUNCTION may NOT see it
  4. ORA-06512: at "ADMINORACLE11G.TR_CALCULARMORA", line 5
  5. ORA-04088: error during execution OF TRIGGER 'ADMINORACLE11G.TR_CALCULARMORA'
  6. 04091. 00000 -  "table %s.%s is mutating, trigger/function may not see it"
  7. *Cause:    A TRIGGER (OR a USER defined plsql FUNCTION that IS referenced IN
  8.            this statement) attempted TO look at (OR MODIFY) a TABLE that was
  9.            IN the middle OF being modified BY the statement which fired it.
  10. *Action:   Rewrite the TRIGGER (OR FUNCTION) so it does NOT READ that TABLE.

La verdad si alguien me puede ayudar con esto etare agradecido.
Gracias
__________________
Creo en Internet.
Amén.

Última edición por freddy31DA; 13/06/2016 a las 13:03