Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

problemas con triggers

Estas en el tema de problemas con triggers en el foro de Mysql en Foros del Web. hola, estoy intentando insertar un trigger q calcule la media de notas de alumnos en una base de datos y me da error, aqui os ...
  #1 (permalink)  
Antiguo 22/05/2009, 03:11
 
Fecha de Ingreso: mayo-2009
Mensajes: 1
Antigüedad: 14 años, 11 meses
Puntos: 0
problemas con triggers

hola, estoy intentando insertar un trigger q calcule la media de notas de alumnos en una base de datos y me da error, aqui os pongo el trigger y el error:

CREATE OR REPLACE TRIGGER prueba_media
AFTER INSERT ON alumnos
FOR EACH ROW
DECLARE
vmedia int(2);
BEGIN
SELECT AVG(notas) INTO vmedia FROM alumnos;
dbms_output.put_line('la media de notas es:'|| vmedia);
END;

Error

consulta SQL:

CREATE OR REPLACE TRIGGER prueba_media
AFTER INSERT ON alumnos
FOR EACH
ROW DECLAREvmedia int( 2 ) ;

MySQL ha dicho: Documentación
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TRIGGER prueba_media
AFTER INSERT ON alumnos
FOR EACH ROW
DECLARE
vmedia i' at line 1

la base de datos es la siguiente:

dni nombre apellido notas
72455896 paco yeste 7
78963258 jon palacio 9
77456321 isidro diez 5

uso phpMyAdmin para gestionar la base de datos
un saludo y gracias
  #2 (permalink)  
Antiguo 22/05/2009, 05:28
Avatar de 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, 4 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)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:12.