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 originalCREATE TABLE Prestamo(
idLector NUMERIC(10) NOT NULL,
idLibro NUMERIC(10) NOT NULL,
FechaPrestamo DATE NOT NULL,
FechaDev DATE NULL,
FechaRealDev DATE NULL,
Mora NUMBER(19,4) NULL,
estado NUMBER(1) NULL,
CONSTRAINT idlectorPrestamo_fk FOREIGN KEY (idLector) REFERENCES Estudiante(idLector),
CONSTRAINT idLibroPrestamo_fk FOREIGN KEY (idLibro) REFERENCES Libro(idLibro)
);
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 originalINSERT INTO Prestamo VALUES (1,1,'9-6-2016','12-6-2016','','',0);
-- 0 = prestado
-- 1 entregado
--Devuelve:
UPDATE Prestamo SET estado=1 WHERE idLector=1 AND idLibro=1
Este es el trigger que e creado:
Código sql:
Ver originalCREATE OR REPLACE TRIGGER TR_CALCULARMORA
AFTER UPDATE
ON Prestamo
FOR EACH ROW
DECLARE
dias INTEGER;
fechaDevOriginal DATE;
BEGIN
SELECT fechaDev INTO fechaDevOriginal FROM Prestamo WHERE idLector=:OLD.idLector AND idLibro=:OLD.idLibro;
SELECT trunc(sysdate) - to_date(fechaDevOriginal, 'dd-mm-yyyy') INTO dias FROM dual;
IF dias > 3 THEN
UPDATE Prestamo SET Mora=(dias-3)*5, FechaRealDev=sysdate
WHERE idLector=:OLD.idLector AND idLibro=:OLD.idLibro;
END IF;
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 originalUPDATE Prestamo SET estado=1 WHERE idLector=1 AND idLibro=1
Informe de error -
Error SQL: ORA-04091: TABLE ADMINORACLE11G.PRESTAMO IS mutating, TRIGGER/FUNCTION may NOT see it
ORA-06512: at "ADMINORACLE11G.TR_CALCULARMORA", line 5
ORA-04088: error during execution OF TRIGGER 'ADMINORACLE11G.TR_CALCULARMORA'
04091. 00000 - "table %s.%s is mutating, trigger/function may not see it"
*Cause: A TRIGGER (OR a USER defined plsql FUNCTION that IS referenced IN
this statement) attempted TO look at (OR MODIFY) a TABLE that was
IN the middle OF being modified BY the statement which fired it.
*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