MySQL:解决我的MySQL游标错误:1064

时间:2013-11-25 01:21:24

标签: mysql triggers database-administration

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论坛的语法基于此Trigger 这是错误:

  

#1064 - 您的SQL语法出错;查看与您的MySQL服务器版本相对应的手册,以便在lote_detalle WHERE id_inve'附近使用正确的语法来使用#DEC; DECLARE cur_id CURSOR FOR SELECT id_lote_detalle在第9行

1 个答案:

答案 0 :(得分:0)

您的代码至少存在以下问题:

  1. 所有声明都应在任何声明(SET之前)之前发出。 这就是造成您的即时错误的原因。
  2. 您没有声明DONE变量
  3. 您没有声明LOTE_DETALLE_IDS变量,但您声明了ID_LOTE_DETALLE_MIN您没有使用的变量。也许您应该将ID_LOTE_DETALLE_MIN重命名为LOTE_DETALLE_IDS
  4. 由于声明首先需要重新编写游标定义(例如使用子查询),因为ID_INVENTARIO_IN变量尚未初始化
  5. 您的整个声明部分可以通过以下方式重写

    -- 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 ...
    

    现在,我相信你的触发器最有可能只用更新语句重写。如果您用简单的词语解释您想要实现的目标并提供准确的表格模式和样本数据,您可以获得帮助。