mysql - 游标上的存储过程变量赋值

标签 mysql variables stored-procedures cursor

我正在创建一个交换网站,并且确实需要进行交易。首先,进行选择并查找一些数据,然后根据给出的结果进行一些更新和插入。

我不会发布完整的查询,因为它可能非常难以阅读,因此我创建了一个新查询来指出问题所在。

表日志

    CREATE TABLE `log` (
      `num_rows` int(10) unsigned NOT NULL,
      `new_value` int(10) unsigned NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

存储过程

    DROP PROCEDURE IF EXISTS `test`//

    CREATE PROCEDURE `test` (IN var1 BIGINT) 
    BEGIN
      DECLARE result INT;
      DECLARE num_rows INT;

      DECLARE cur1 CURSOR FOR
        SELECT @var1 := @var1 +1 AS result;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

      START TRANSACTION;
        OPEN cur1;
        SELECT FOUND_ROWS() into num_rows;
        INSERT INTO log (num_rows,new_value) VALUES (num_rows,var1);

        CLOSE cur1;
      COMMIT;
    END//

当我尝试时

    CALL test(1);

我将 1 作为 var1 参数传递。所以在 cur1 中,该值应该增加。然后使用新值将新行插入到日志中。看起来 := 赋值不起作用。

我真的变了

    SELECT @var1 := @var1 +1 AS result;

为此

    SELECT var1 := var1 +1 AS result;

并在“:= var1 +1”上收到错误

最佳答案

您的测试查询混淆了您实际上正在做的任何事情,以至于实际上不可能查明根本问题。您有一个 CONTINUE HANDLER 设置一个变量(“done”),该变量不仅没有经过测试(以打破也不存在的循环),甚至没有定义,因此编写的代码太模糊(并且,社区要求代码示例有效 - 产生错误的结果不会使其根据定义无效,但不可运行则无效,并且此代码不应与未声明的变量一起使用)。

想必您知道var1是程序变量,而@var1是用户定义变量,这意味着两者完全无关。我从未见过在带有 := 赋值黑客的查询中使用程序变量,因此这可能是无效的(如果不是,则有意义,因为这两种类型变量的行为可能非常不同)。

如果问题这么简单,那么:

SET @var1 = var1;

...在过程的适当早期部分,并在查询中使用用户定义的变量@var1

虽然这似乎是一件奇怪的事情,但这并不是唯一可能需要这样的事情(将程序变量复制到用户定义的变量中)的情况......准备好的语句只能使用用户定义的变量,也是。

关于mysql - 游标上的存储过程变量赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20811146/

相关文章:

php - 我想从 mysql 数据库中获取复选框值

mysql select top users问题

java - 如何在 Java 中创建循环并递增索引以用作字符串的一部分?

ios - 从 UITableViewCell 分配变量以在主视图 Controller 中发送推文

c# - 带有链接子报表的 Crystal 报表仅适用于报表预览

php - 为同一行插入临时表多次计数

php - Laravel 4.2 多对多关系,使用其他默认 ID

python从字典条目创建变量

mysql - 通过 tressshold 时触发 (MySQL)

mysql - 无法创建 MySQL/MariaDB 存储过程