Ver Mensaje Individual
  #2 (permalink)  
Antiguo 22/05/2009, 05:28
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: problemas con triggers

Tengamos claro que un TRIGGER:
1. Es una rutina que se dispara ante un evento INSERT, UPDATE o DELETE en una tabla y sólo en su tabla.
2. No puede hacer en su tabla la misma operación que lo disparó. Se generaría una llamada recursiva infinita.
3. No puede devolver resultados de un SELECT, puede utilizarlos para la funcionalidad para la que se lo diseña.
4. No puede recibir variables que no sean las de la propia sentencia que lo disparó. Sus únicos valores de entrada son campos de su tabla.
5. Puede hacer operaciones de consulta y actualización a otra tabla, pero no a una que dispare un TRIGGER que afecte a su propia tabla.
6. Como rutina programada, debe ser ingresada con los mismos requerimientos de un Store Procedure, esto es: si se ingresará por un script, debe contener forzosamente los DELIMITER iniciales y finales en el código.

Dicho esto, en tu código hay cuatro problemas:
Por un lado, no contiene los DELIMITER que permiten cambiar el fin de sentencia momentáneamente para permitir la carga del TRIGGER.
Por otro lado, la operación de calcular una media no tiene ningún sentido en un trigger, porque se ejecutará con cada una de las inserciones , con lo que tendrás tantas medias como registros ingresen, y de todos modos no podrás recuperar el valor por ser una variable local.
Finalmente: esto:
Cita:
dbms_output.put_line('la media de notas es:'|| vmedia);
No existe en Mysql.
Y esto:
Cita:
DECLARE vmedia int(2);
debe estar dentro del BEGIN/END.
Habría que probar qué tan bien trabaja si la variable fuese global.

Para ponerle los DELIMITER, sería:
Código SQL:
Ver original
  1. DELIMITER $$
  2. CREATE OR REPLACE TRIGGER prueba_media
  3. AFTER INSERT ON alumnos
  4. FOR EACH ROW
  5. BEGIN
  6.   DECLARE vmedia INT(2);
  7.   SELECT AVG(notas) INTO vmedia FROM alumnos;
  8. END$$
  9. DELIMITER ;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)