【问题标题】:CURSOR LOOP within TRANSACTION交易中的光标循环
【发布时间】:2012-05-29 02:52:13
【问题描述】:

我什至无法让这个基本的 CURSOR LOOP 在我的 TRANSACTION 中运行。

请帮忙。提前致谢!

CREATE PROCEDURE ClearItems(IN itemName CHAR)
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE bID INT(255);
    DECLARE bIDs CURSOR FOR SELECT id FROM table1 WHERE column1 = itemName AND column2 = 'b' ORDER BY column3 DESC, date ASC;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    START TRANSACTION;
        OPEN bIDs;
        clear_loop: LOOP
        FETCH bIDs INTO bID;
        IF done THEN
            LEAVE clear_loop;
            END IF;
        INSERT INTO table2 (column1) SELECT bID;
        END LOOP;
        CLOSE bIDs;
    COMMIT; 
END //
DELIMITER ;

【问题讨论】:

  • 检查语法错误。
  • 没有报告。一切都会过去。当你尝试时,你会得到它们吗?
  • 这一行会抛出一些错误——'WHERE 1column1 = itemName AND 1column2 = 'b' ORDER BY 1column3 DESC'。 1column1 和其他字段必须正确引用或命名。
  • 我不明白。列是否引用? itemName 是 IN 过程值。不能用 IN 值在 WHERE 中搜索列吗?或者这样做时语法是否必须改变?非常感谢。
  • 我只是在没有 LOOP 的情况下尝试过,它插入了一个空值。使用 WHERE 时是否必须对 CURSOR 使用特殊语法?

标签: mysql loops transactions cursor


【解决方案1】:

解决问题 - 重命名声明的 ID 变量。字段名和变量不能相同。


另外,如果您想填充另一个表,请尝试使用INSERT ... SELECT 语句。它将帮助您避免使用游标。比如——

INSERT INTO table2(`2column1`)
  SELECT id
    FROM table1
    WHERE `1column1` = itemName AND `1column2` = 'b'
    ORDER BY `1column3` DESC, date ASC;

【讨论】:

  • 再次抱歉。这也不是声明变量的真实名称。我会把它改成更接近原来的样子。
  • 我有一整套代码放在事务中,所以我不想做 INSERT。我只是想把它剥离到裸露的骨头上,这样我就可以弄清楚出了什么问题。我认为这是我声明或打开或获取 CURSOR 的方式,但我不知道。
  • 它仍然是 INSERTing 0(NULL,我猜)。当我尝试它时,循环甚至不会触发。我的语法一定有问题。
  • 我注释掉了“item = itemName”部分,光标工作了。如何使用我的 IN 变量?再次感谢。
  • 正确使用了“itemName”参数。检查它是否插入任何东西,写这样的东西 - INSERT INTO table2 (column1) VALUES(1)。还要检查 SELECT 查询是否返回数据集,只需执行不带光标的 SELECT 查询。
猜你喜欢
  • 1970-01-01
  • 2018-09-25
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
相关资源
最近更新 更多