在CREATE PROCEDURE中使用DECLARE和预准备语句时出现语法错误

时间:2015-03-11 11:24:21

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

我正在尝试使用存储过程中的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 ;

唯一的区别是在第一种形式中使用@variable vs DECLARE。嗯,那么DECLARE在这里出了什么问题?

1 个答案:

答案 0 :(得分:2)

原因是

  

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

在第一种情况下

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

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