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

[SOLUCIONADO] TRIGGER (sintaxis mysql)

Estas en el tema de TRIGGER (sintaxis mysql) en el foro de Mysql en Foros del Web. Buenas, Veréis siempre hice triggers en developer y ahora que estoy en mysql es un poco lioso para mi.. estuve mirando por inet triggers en ...
  #1 (permalink)  
Antiguo 06/12/2013, 06:41
 
Fecha de Ingreso: julio-2013
Mensajes: 12
Antigüedad: 10 años, 9 meses
Puntos: 0
TRIGGER (sintaxis mysql)

Buenas,

Veréis siempre hice triggers en developer y ahora que estoy en mysql es un poco lioso para mi.. estuve mirando por inet triggers en mysql pero no conseguí hacerlo funcionar

Seríais tan amables de decirme que debo cambiar en cuanto a la sintaxis? en ora me funciona perfectamente

Dejo el trigger (es comprobación de stock y si hay lo modifica)
Código SQL:
Ver original
  1. --------------------------------------------------
  2. CREATE OR REPLACE
  3. TRIGGER TR_productos_stock
  4. BEFORE INSERT ON pedido
  5. FOR EACH ROW
  6.  
  7.  
  8. DECLARE
  9.  
  10. v_stock NUMBER(5,0);
  11.  
  12.  
  13. BEGIN
  14.  
  15. SELECT  stock INTO ( v_stock) FROM producto
  16. WHERE producto.id_producto=:NEW.id_producto;
  17.  
  18.  
  19.  
  20. IF v_stock>:NEW.gramos
  21. THEN RAISE_APPLICATION_ERROR (-20234, 'No hay stock disponible');
  22.  
  23. ELSE
  24.  
  25. UPDATE PRODUCTO SET stock= stock-:NEW.gramos  
  26. WHERE producto.id_producto=:NEW.id_producto;
  27.  
  28. END IF;
  29.  
  30. END;
  31.  
  32. ------------------------------------------

Gracias por adelantado! A ver si alguien puede ayudarme =)

Saludos!

Última edición por gnzsoloyo; 06/12/2013 a las 07:10
  #2 (permalink)  
Antiguo 06/12/2013, 07:29
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, 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)
  #3 (permalink)  
Antiguo 06/12/2013, 08:14
 
Fecha de Ingreso: julio-2013
Mensajes: 12
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: TRIGGER (sintaxis mysql)

Muchas gracias por tu tiempo gnzsoloyo =)

La verdad que tienes toda la razón.. tengo que buscar algún manual decente y empezar por ahí.. Aunque tu mini-clase me ha venido al dedo, te lo agradezco de nuevo ^^

Respecto al código que me has dado por consola me da error tambié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 '$$ CREATE TRIGGER TR_productos_stock BEFORE INSERT ON pedido FOR EACH ROW ' at line

En cuanto tenga tiempo me miraré algún manual para empezar con la sintaxis de procedimientos por que veo que sin ayuda será imposible XD

Salu2! y gracias de nuevo =)
  #4 (permalink)  
Antiguo 06/12/2013, 08:20
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, 5 meses
Puntos: 2658
Respuesta: TRIGGER (sintaxis mysql)

El error puede ser por varios lados, a priori el mensaje que devuelve en ese caso MYSQL sólo muestra cuál es la última parte que pudo interpretar, pero no necesariamente es donde el error ocurre. Puee ser antes, o puede ser después. Por eso dice "near" (cerca de), y no "in".
La preguna principal sería: ¿Con qué interfaz estás intentando correr el script. Yo ya te aclaré que tal y como está escrito es únicamente para usar la consola de MySQL, y no una interfaz gráfica como phpMyadmin, o MySQL Workbench.
¿Cuál usaste?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 07/12/2013, 05:59
 
Fecha de Ingreso: julio-2013
Mensajes: 12
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: TRIGGER (sintaxis mysql)

Lo he probado con la consola de mysql.
La verdad que no sé que puede estar mal, he estado mirando sintaxis de mysql y algunos triggers para ver si veía que está mal pero nada no lo consigo :S

Por cierto se me olvidaba, había un paréntesis sin cerrar pero no es eso XD

EDITO:

Arreglado, era cambiar el DECLARE por SET =)

Gracias por la ayuda gnzsoloyo!!!!! :D

Última edición por dark0wolf; 07/12/2013 a las 06:17 Razón: solucion

Etiquetas: select, sintaxis, sql, trigger
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 12:12.