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
CREATE 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 original
INSERT 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:
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. Ver original
CREATE 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;
El error que obtengo es:
Código sql:
Ver original
UPDATE 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