我正在尝试使用存储过程中的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
在这里出了什么问题?
答案 0 :(得分:2)
原因是
在存储程序上下文中准备的语句不能引用存储 程序或功能参数或局部变量,因为它们会去 当程序结束并且不可用时,范围超出范围 稍后在程序外执行的语句。作为一种解决方法, 而是指用户定义的变量,它们也有会话 范围;
在第一种情况下
DECLARE str1 TEXT DEFAULT '';
SET str1 = CONCAT("SELECT * FROM ", tblname);
str1
的范围是本地的。因此,mysql会抛出错误,您需要使用 User-Defined Variables ,这是您在会话范围的第二种情况下所做的。