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;