Ver Mensaje Individual
  #23 (permalink)  
Antiguo 27/07/2010, 13:12
Avatar de huesos52
huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Echadme una mano con triggers, estoy aprendiendo

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 original
  1. SQL> CREATE TABLE distancias (ruta VARCHAR(10),
  2. distancia_k INTEGER,
  3. distancia_m INTEGER )
  4. /
  5.  
  6. INSERT INTO distancias
  7. VALUES
  8. ('1',2,3)
  9. /
  10.  
  11. INSERT INTO distancias
  12. VALUES
  13. ('2',4,5)
  14. /
  15. commit;  2    3    4
  16. Tabla creada.
  17.  
  18. SQL> SQL>   2    3    4
  19. 1 fila creada.
  20.  
  21. SQL> SQL>   2    3    4
  22. 1 fila creada.
  23.  
  24. SQL> CREATE OR REPLACE TRIGGER up_km
  25.   2  BEFORE UPDATE OF distancia_k,distancia_m ON distancias
  26.   3  FOR each ROW
  27.   4  BEGIN
  28.   5  IF UPDATING ('distancia_k') THEN
  29.   6  :NEW.distancia_m := :NEW.distancia_k*2;
  30.   7  ELSIF UPDATING ('distancia_m') THEN
  31.   8  :NEW.distancia_k := :NEW.distancia_m*4;
  32.   9  END IF;
  33.  10  END;
  34.  11  /
  35.  
  36. Disparador Creado.
  37.  
  38. SQL> SELECT * FROM distancias;
  39.  
  40. RUTA       DISTANCIA_K DISTANCIA_M
  41. ---------- ----------- -----------
  42. 1                    2           3
  43. 2                    4           5
  44.  
  45. SQL> UPDATE distancias
  46. SET distancia_k = 6
  47. WHERE ruta = '1';  2    3
  48.  
  49. 1 fila actualizada.
  50.  
  51. SQL> SELECT * FROM distancias;
  52.  
  53. RUTA       DISTANCIA_K DISTANCIA_M
  54. ---------- ----------- -----------
  55. 1                    6          12
  56. 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
__________________
Without data, You are another person with an opinion.
W. Edwads Deming