gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:00:23 26 4
gpt4 key购买 nike

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 论坛的语法来创建此触发器的这是错误:

#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

最佳答案

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

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

现在,我相信您的触发器很可能只需使用更新语句即可重写。如果您用简单的语言解释您想要实现的目标并提供准确的表架构和示例数据,您可以获得帮助。

关于MySQL:解决我的 MySQL 光标错误:1064,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20183401/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com