2013-11-25 55 views
0
DROP TRIGGER IF EXISTS `ACTUALIZAR_LOTE_DETALLE`; 
DELIMITER // 
CREATE TRIGGER `ACTUALIZAR_LOTE_DETALLE` AFTER INSERT ON `detalle_envio` 
FOR EACH ROW BEGIN 
DECLARE ID_INVENTARIO_IN INT; 
DECLARE ID_LOTE_DETALLE_MIN INT; 
DECLARE CANTIDAD_A_COMPARAR INT; 
DECLARE CANTIDAD_A_RESTAR INT; 
SET CANTIDAD_A_RESTAR = new.cantidad_enviado; 
SET ID_INVENTARIO_IN = (Select id_inventario from detalle_requisicion WHERE id_detalle_requisicion = new.id_detalle_requisicion); 
DECLARE cur_id CURSOR FOR SELECT id_lote_detalle from lote_detalle WHERE id_inventario = ID_INVENTARIO_IN AND cantidad > 0; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET DONE = 1; 
OPEN cur_id;  
read_loop: LOOP 
FETCH cur_id INTO LOTE_DETALLE_IDS; 
SET CANTIDAD_A_COMPARAR = select cantidad from lote_detalle where id_lote_detalle = LOTE_DETALLE_IDS; 
IF CANTIDAD_A_RESTAR > CANTIDAD_A_COMPARAR THEN 
UPDATE `lote_detalle` SET cantidad=cantidad-CANTIDAD_A_COMPARAR WHERE id_lote_detalle = LOTE_DETALLE_IDS; 
SET CANTIDAD_A_RESTAR = CANTIDAD_A_RESTAR - CANTIDAD_A_COMPARAR; 
ELSE 
UPDATE `lote_detalle` SET cantidad=cantidad-CANTIDAD_A_RESTAR WHERE id_lote_detalle = LOTE_DETALLE_IDS; 
LEAVE read_loop; 
END IF; 
IF DONE = 1 THEN 
LEAVE read_loop; 
END IF; 
END LOOP read_loop; 
CLOSE cur_id; 
END 
// 
DELIMITER ; 

光标中有什么? 查询什么的? 语法中有什么? 因为我已经根据从MySQL论坛 这的语法这种触发的错误:MySQL:解决我的MySQL光标错误:1064

#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 'DECLARE cur_id CURSOR FOR SELECT id_lote_detalle from lote_detalle WHERE id_inve' at line 9

+0

ID_INVENTARIO_IN确实来自哪里? –

+0

来自一个变量: DECLARE ID_INVENTARIO_IN INT; SET ID_INVENTARIO_IN =(从detalle_requisicion WHERE id_detalle_requisicion = new.id_detalle_requisicion选择id_inventario); –

+0

也发布确切的错误消息 – peterm

回答

0

至少有下面与您的代码的问题:

  1. 所有声明应该来的任何语句之前(您的情况为SET)。 这就是导致你的直接错误。
  2. 你没有申报DONE变量
  3. 你没有申报LOTE_DETALLE_IDS变量,但声明ID_LOTE_DETALLE_MIN你没有使用。也许你应该将ID_LOTE_DETALLE_MIN重命名为LOTE_DETALLE_IDS
  4. 由于声明先走了,你必须重新写你的光标定义(例如使用子查询),因为ID_INVENTARIO_IN变量尚未初始化

你整个的声明部分可被重新编写以下列方式

-- declaration of variables of the same type can be combined 
DECLARE ID_INVENTARIO_IN, 
     LOTE_DETALLE_IDS, 
     CANTIDAD_A_COMPARARINT, 
     CANTIDAD_A_RESTAR, 
     DONE INT; 
DECLARE cur_id CURSOR FOR ... 
DECLARE CONTINUE HANDLER ... 

-- initialize variables 
SET ... 

现在,我认为您的触发器很可能只需更新声明即可重新编写。如果你用简单的语言解释你想要达到的目标,并提供精确的表格模式和样本数据,你可以获得帮助。

+0

附近使用正确的语法。谢谢你,我做了你所说的并且工作得很好:) –