Ver Mensaje Individual
  #2 (permalink)  
Antiguo 06/12/2013, 07:29
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: TRIGGER (sintaxis mysql)

Mira, lo primero que debes recordar siempre es que no existe lenguaje procedural estandarizado, por lo que cada vez que cambies de DBMS debes si o si volver al manual y olvidarte todas las cosas que aprendiste en el otro DBMS.
TODAS.

El script que propones es de Oracle, no de MySQL, y contiene cosas que sólo pueden funcionar en Oracle.
- No exsite el REPLACE en la creación de un TRIGGER en MySQL. Para reemplazar uno, debes si o si dropear el otro antes.
- RAISE_APPLICATION_ERROR no existe en MySQL. En su lugar existe el SIGNAL, pero tiene otro modo de uso.
- Las asignaciones se hacen con "=", no con ":=", si bien este segundo caso se puede usar en ciertas operaciones específicas realizadas con variables de usuario (del tipo propio de MySQL).
- DECLARE es requerido para cada una de las variables locales que se crean, pero esta se declaran dentro del mismo BEGIND/END y no fuera de él.
- Normalmente un TRIGGER en MySQL no devuelve datos de ningun tipo. Ni siquiera mensajes. El objeto de SIGNAL es administrar las excepciones de usuario, pero no emitir mensajes.
- NUMBER es un tipo de dato de Oracle, no de MySQL. Si bien MySQL lo reconoce, pero lo convierte en INT, que es el tipo nativo de MYSQL cuando se trata de numeros enteros.

Dicho esto, veamos:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP TRIGGER IF EXISTS TR_productos_stock $$
  3. CREATE TRIGGER TR_productos_stock BEFORE INSERT ON pedido
  4.  
  5.     DECLARE v_stock INT;
  6.     v_stock = (SELECT  stock FROM producto WHERE producto.id_producto = NEW.id_producto;
  7.     IF v_stock> NEW.gramos THEN
  8.         SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'No hay stock disponible';
  9.     ELSE
  10.         UPDATE PRODUCTO SET stock= stock - NEW.gramos
  11.         WHERE producto.id_producto = NEW.id_producto;
  12.     END IF;
  13.  
  14. END $$
  15. DELIMITER ;

Los DELIMITER son sólo si ingresas el trigger via consola.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)