【问题标题】:MySQL: Solve my MySQL Cursor Error:1064MySQL:解决我的 MySQL 光标错误:1064
【发布时间】:2013-11-25 01:21:24
【问题描述】:
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 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 9 行的“DECLARE cur_id CURSOR FOR SELECT id_lote_detalle from lote_detalle WHERE id_inve”附近使用正确的语法

【问题讨论】:

  • ID_INVENTARIO_IN 是从哪里来的?
  • 来自一个变量:DECLARE ID_INVENTARIO_IN INT; SET ID_INVENTARIO_IN =(从 detalle_requisicion 中选择 id_inventario,其中 id_detalle_requisicion = new.id_detalle_requisicion);
  • 同时发布确切的错误信息
  • #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 9 行的“DECLARE cur_id CURSOR FOR SELECT id_lote_detalle from lote_detalle WHERE id_inve”附近使用正确的语法

标签: mysql triggers database-administration


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢你,我照你说的做了,效果很好:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 2015-07-03
  • 1970-01-01
  • 2012-01-27
  • 2011-04-17
  • 2014-02-20
相关资源
最近更新 更多