Acabo de tener un problema con tablas mutantes en el uso de unos triggers y recordé este tema. Me ayudó bastante.
Considerando que he ganado un poco de habilidad en el manejo de PL (hace unos cuantos meses no tenía idea de que estaban hablando
) empecé a mirar detalladamente el problema y noté que la primera solución que dió jc3000 era la correcta y no era necesario dar tantas vueltas (Por cierto, muy ingeniosas)
Retomando el ejemplo de jc3000
Código SQL:
Ver originalSQL> CREATE TABLE distancias (ruta VARCHAR(10),
distancia_k INTEGER,
distancia_m INTEGER )
/
INSERT INTO distancias
VALUES
('1',2,3)
/
INSERT INTO distancias
VALUES
('2',4,5)
/
commit; 2 3 4
Tabla creada.
SQL> SQL> 2 3 4
1 fila creada.
SQL> SQL> 2 3 4
1 fila creada.
SQL> CREATE OR REPLACE TRIGGER up_km
2 BEFORE UPDATE OF distancia_k,distancia_m ON distancias
3 FOR each ROW
4 BEGIN
5 IF UPDATING ('distancia_k') THEN
6 :NEW.distancia_m := :NEW.distancia_k*2;
7 ELSIF UPDATING ('distancia_m') THEN
8 :NEW.distancia_k := :NEW.distancia_m*4;
9 END IF;
10 END;
11 /
Disparador Creado.
SQL> SELECT * FROM distancias;
RUTA DISTANCIA_K DISTANCIA_M
---------- ----------- -----------
1 2 3
2 4 5
SQL> UPDATE distancias
SET distancia_k = 6
WHERE ruta = '1'; 2 3
1 fila actualizada.
SQL> SELECT * FROM distancias;
RUTA DISTANCIA_K DISTANCIA_M
---------- ----------- -----------
1 6 12
2 4 5
Creo que el problema de manurodri189 era que en vez de asignar los valores a las variables :NEW lo hacía pero en la ejecución de una sentencia update de la misma tabla que ejecuta el trigger (Por ello el error de tablas mutantes) y no como inicialmente se lo recomendaba jc3000.
Por cierto... me ha gustado mucho el tema de AUTONOMOUS TRANSACTION que de seguro me va a ser muy util para un proyecto que tengo.
Gracias por información tan valiosa jc3000