【问题标题】:Syntax Error on using DECLARE and prepared statement inside CREATE PROCEDURE在 CREATE PROCEDURE 中使用 DECLARE 和准备好的语句时出现语法错误
【发布时间】:2015-03-11 11:24:21
【问题描述】:

我正在尝试在存储过程中使用 MySQL 准备好的语句。我已经尝试调试这个 CREATE 代码几个小时了,现在很沮丧。

DELIMITER //
DROP PROCEDURE IF EXISTS doSomething//
CREATE PROCEDURE doSomething(IN tblname CHAR(32))
BEGIN
    DECLARE str1 TEXT DEFAULT '';
    SET str1 = CONCAT("SELECT * FROM ", tblname);
    PREPARE stmt1 FROM str1;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;
END//
DELIMITER ;

它抛出了各种“语法”错误。更糟糕的是,确切的错误消息似乎在 phpMyAdmin 和 MySQL 控制台之间有所不同。

请有人帮我查明语法错误。

谢谢。

PS:经过进一步测试...

这似乎有效:

DELIMITER //
DROP PROCEDURE IF EXISTS doSomething//
CREATE PROCEDURE doSomething(IN tblname CHAR(32))
BEGIN
    SET @str1 = CONCAT("SELECT * FROM ", tblname);
    PREPARE stmt1 FROM @str1;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;
END//
DELIMITER ;

唯一的区别是@variableDECLARE 在第一种形式中的使用。嗯,DECLARE 这里有什么问题?

【问题讨论】:

    标签: mysql stored-procedures syntax-error prepared-statement


    【解决方案1】:

    原因是

    在存储程序上下文中准备的语句不能引用存储 过程或函数参数或局部变量,因为它们去 程序结束时超出范围并且将不可用 稍后在程序外执行的语句。作为一种解决方法, 而是引用用户定义的变量,这些变量也有会话 范围;

    在第一种情况下

    DECLARE str1 TEXT DEFAULT '';
    SET str1 = CONCAT("SELECT * FROM ", tblname);
    

    str1 的范围是本地的。所以 mysql 抛出错误,你需要使用 User-Defined Variables ,这是你在会话范围的第二种情况下所做的。

    【讨论】:

    • 感谢@AbhikChakraborty 的回答。它看起来一点也不直观,但如果手册这么说,那么它就是官方的!下一步,我遇到了另一个障碍。你能好心看看吗? stackoverflow.com/questions/28987944/…
    • 是的,我在问题检查中添加了一些注释。
    猜你喜欢
    • 1970-01-01
    • 2014-06-18
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多