Saltar al contenido

La tabla está mutando, es posible que el disparador / función no la vea (lo que impide que una calificación promedio caiga por debajo de 2.5)

Solución:

usa esta declaración en el interior DECLARE, funcionará.

pragma autonomous_transaction;

Primero, debe leer acerca de los desencadenantes, el error de la tabla mutante y los desencadenantes compuestos: http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#LNPLS2005

Su disparador es DESPUÉS DE ACTUALIZAR O INSERTAR O ELIMINAR. Significa que si ejecuta UPDATE O INSERT O DELETE sentencias en esta tabla, el disparador se disparará. Pero está intentando actualizar la misma tabla nuevamente dentro de su disparador, lo cual es compl. incorrecto. Esta es la razón por la que recibe el error. No se puede modificar la misma mesa en la que se dispara el gatillo. El propósito del disparador es disparar automáticamente cuando la tabla se actualiza, inserta o elimina en su caso. Lo que necesita es algún procedimiento, no disparador.

Creo que puede solucionar este problema reescribiendo esto como un antes de disparador, en lugar de un después desencadenar. Sin embargo, esto puede ser un poco complicado para inserciones y eliminaciones. La idea es:

CREATE OR REPLACE TRIGGER stopChange
    BEFORE UPDATE OR INSERT OR DELETE ON taking
    REFERENCING OLD AS old
    NEW AS new
    FOR EACH ROW
DECLARE

grd_avg taking.grade%TYPE;

BEGIN
    SELECT (SUM(grade) - oldgrade + new.grade) / count(*)
    INTO grd_avg
    FROM taking
    WHERE studentnum = :new.studentnum
    AND schedulenum = :new.schedulenum
    AND semester = :new.semester;

    IF grd_avg < 2.5 THEN
        new.grade = old.grade
    END IF;
END;  
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *