mysql动态查询存储过程

时间:2012-05-11 09:05:12

标签: mysql

我在我的存储过程中编写了以下动态查询,

FETCH cur1 INTO a1, ldt1, b1;
    WHILE DONE = 0 DO

        SET @s=CONCAT('UPDATE ',fname , ' SET connectedDateTime = ldt1,opid = b1 
        WHERE hq_conferee_seqno=a1 AND (LoggedDateTime <=ldt1 AND connectedDateTime IS NULL)');
        FETCH cur1 INTO a1, ldt1, b1;
        PREPARE stmt FROM @s;
        EXECUTE stmt;
    END WHILE; 
    CLOSE cur1;

当我编译存储时我没有收到任何错误。但是当我运行这段代码时,我收到的错误就像你的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“NULL”附近使用正确的语法

会出现什么问题。请帮我。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

the manual中所述:

  

局部变量仅在存储程序执行期间在范围内。在预准备语句中不允许引用它们,因为它们对于当前会话是全局的,并且在执行语句时变量可能已超出范围。

您应该将光标移到 user 变量中,并从预准备语句中引用它们(它们在连接期间保持在范围内),或者(更好)将它们传递给准备好的声明作为参数:

SET @s=CONCAT('UPDATE ',fname , ' SET connectedDateTime = ?,opid = ? 
WHERE hq_conferee_seqno=? AND (LoggedDateTime <=? AND connectedDateTime IS NULL)');
FETCH cur1 INTO @a1, @ldt1, @b1;
PREPARE stmt FROM @s;
EXECUTE stmt USING @ldt1, @b1, @a1, @ldt1;