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 originalDELIMITER $$
v_stock
= (SELECT stock
FROM producto
WHERE producto.id_producto
= NEW.id_producto
; SIGNAL SQLSTATE
'45000' SET MESSAGE_TEXT
= 'No hay stock disponible'; UPDATE PRODUCTO
SET stock
= stock
- NEW.gramos
WHERE producto.id_producto
= NEW.id_producto
;
DELIMITER ;
Los DELIMITER son sólo si ingresas el trigger via consola.