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

MySQL:解决我的MySQL游标错误:1064,mysql,triggers,database-administration,Mysql,Triggers,Database Administration,光标里有什么东西吗? 询问还是什么? 语法有什么问题吗? 因为我根据MySQL论坛的语法创建了这个触发器 这就是错误: 1064-您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以了解在第9行的“DECLARE cur\u id CURSOR for SELECT id\u lote\u detalle from lote\u detalle WHERE id\u inve”附近使用的正确语法 您的代码至少存在以下问题: 所有声明都应该放在案例中设置的任何语句之前。这就是导致您

光标里有什么东西吗? 询问还是什么? 语法有什么问题吗? 因为我根据MySQL论坛的语法创建了这个触发器 这就是错误:


1064-您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以了解在第9行的“DECLARE cur\u id CURSOR for SELECT id\u lote\u detalle from lote\u detalle WHERE id\u inve”附近使用的正确语法


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

所有声明都应该放在案例中设置的任何语句之前。这就是导致您立即出错的原因。 您没有声明DONE变量 您没有声明LOTE_DETALLE_ID变量,但是您声明了未使用的ID_LOTE_DETALLE_MIN。也许您应该将ID_LOTE_DETALLE_MIN重命名为LOTE_DETALLE_ID。 由于先声明,您必须重新编写游标定义,例如使用子查询,因为变量中的ID\u INVENTARIO\u尚未初始化 您的整个声明部分可以按照以下方式重新编写

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 ;

现在,我相信你的触发器很可能只需要更新语句就可以重写。如果您用简单的语言解释您试图实现的目标,并提供精确的表模式和示例数据,您就可以得到帮助

ID\u INVENTARIO\u IN来自何处?来自一个变量:声明ID\u INVENTARIO\u IN INT;SET ID\u INVENTARIO\u IN=从详细需求中选择ID\u INVENTARIO,其中ID\u详细需求=new.ID\u详细需求;同时发布准确的错误消息1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解在第9行的“选择id的DECLARE cur_id CURSOR for SELECT id_lote_detalle from lote_detalle WHERE id_inve”附近使用的正确语法。谢谢,我照您说的做了,效果很好:
-- 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 ...