【问题标题】:Stored Procedure does not update the table for MySQL存储过程不更新 MySQL 的表
【发布时间】:2018-06-08 10:43:00
【问题描述】:

在 HeidiSQL 上运行此例程,它会在 0 行受影响的情况下运行,即使应该正好有 1 行受影响。两个 select 语句似乎在这个存储过程之外都可以正常工作。

BEGIN
    DECLARE someId INT;
    DECLARE done INT DEFAULT FALSE;
    DECLARE cur1 CURSOR FOR 
    select anotherId from tableA 
     where yetAnotherId IN(another select statement);
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;     

OPEN cur1;

    read_loop: LOOP

    IF done THEN
      LEAVE read_loop;
    END IF;

    FETCH cur1 INTO someId;

    update tableB
    set x = 'hello', y = 'world'
    where something = someId;

    END LOOP;

    CLOSE cur1;
END;

我想知道这个例程的结构可能有什么问题。在我看来,即使光标应该包含 1 个条目,它也没有。

谢谢

编辑:看起来“someId”正在匹配具有相同名称的表字段,因此出现了问题。现在已经解决了。

【问题讨论】:

  • heidisql 只是一个 GUI...您连接到哪个数据库引擎? SQL 服务器? MySQL?其他?
  • @ADyson,这是给 MySQL 的。为清晰起见更新了标题
  • 最好也更新标签,然后关注 mysql 标签的人会看到它。我为你做了。
  • 发布一些重现您的错误的内容。

标签: mysql sql stored-procedures heidisql database-cursor


【解决方案1】:

你的SP看起来不错,我已经为MySql做了修改,请尝试一下

BEGIN
DECLARE someId INT;
DECLARE done INT DEFAULT FALSE;
DECLARE cur1 CURSOR FOR 
select anotherId from tableA 
where yetAnotherId IN(another select statement);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;     

OPEN cur1;

read_loop: LOOP

FETCH cur1 INTO someId;

update tableB
set x = 'hello', y = 'world'
where something = someId;

IF done THEN

CLOSE cur1;
  LEAVE read_loop;

END IF;

END LOOP read_loop;


END;

【讨论】:

    猜你喜欢
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多