Oracle - Actualizar un campo cada vez que se inserte o se borre un dato una tabla en Oracle

 
Vista:
sin imagen de perfil

Actualizar un campo cada vez que se inserte o se borre un dato una tabla en Oracle

Publicado por Daniel (1 intervención) el 18/01/2022 18:22:02
Buenas estoy realizando un trigger en oracle que, cada vez que se inserte o se borre una tupla en la tabla empleado se actualice en la tabla jefe, el campo num_empledos_a_cargo. La tabla empleado contiene los siguientes campos:

DNI_EMPLEADO
DNI_JEFE
La tabla jefe contendrá los siguientes campos:

- DNI_JEFE
- NUM_EMPLEADOS_A_CARGO
Por lo cual me ha quedado el siguiente código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
CREATE OR REPLACE TRIGGER ACTUALIZAR_NUM_EMPLEADOS AFTER INSERT OR DELETE ON EMPLEADO FOR EACH ROW
DECLARE
   CONT JEFE.NUM_EMPLEADOS_A_CARGO%TYPE;
BEGIN
   IF INSERTING THEN
      SELECT COUNT(*) INTO CONT
      FROM EMPLEADO
      WHERE DNI_JEFE=:NEW.DNI_JEFE
      GROUP BY DNI_JEFE;
 
      UPDATE JEFE
      SET NUM_EMPLEADOS_A_CARGO=CONT
      WHERE DNI_JEFE=:NEW.DNI_JEFE;
   END IF;
 
   IF DELETING THEN
      SELECT COUNT(*) INTO CONT
      FROM EMPLEADO
      WHERE DNI_JEFE=:OLD.DNI_JEFE
      GROUP BY DNI_JEFE;
 
      UPDATE JEFE
      SET NUM_EMPLEADOS_A_CARGO=CONT
      WHERE DNI_JEFE=:OLD.DNI_JEFE;
   END IF;
END;
/

El disparador se crea sin ningún tipo de problema pero a la hora de insertar o borrar una tupla salta el error de que estoy mutando la tabla, es probable que sea porque estoy sacando algún dato de la manera equivocada, pero me estoy volviendo loco.
Cualquier ayuda se agradece. Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de gilman
Val: 117
Bronce
Ha mantenido su posición en Oracle (en relación al último mes)
Gráfica de Oracle

Actualizar un campo cada vez que se inserte o se borre un dato una tabla en Oracle

Publicado por gilman (52 intervenciones) el 19/01/2022 08:20:29
El problema es que desde los TRIGGERS no se puede acceder a la tabla, solo al registro que se inserta, modifica o borra, ya que está mutando, así que la sentencia:
1
2
3
4
SELECT COUNT(*) INTO CONT
      FROM EMPLEADO
      WHERE DNI_JEFE=:OLD.DNI_JEFE
      GROUP BY DNI_JEFE;
Provocará siempre ese error.
Para lo que tú quieres podrías usar un COMPOUND TRIGGER, en está página explican como funcionan:
https://www.viralpatel.net/compound-triggers-in-oracle-11g-tutorial-example/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar