我有一个类似的存储过程(但更长)。它是从PHP(Apache上的GET请求)
调用的delimiter //
CREATE PROCEDURE dynamic(IN tbl CHAR(64), IN col CHAR(64))
BEGIN
SET @full_statement = CONCAT('SELECT ',col,' FROM ',tbl );
PREPARE stmt FROM @full_statement;
EXECUTE stmt;
END
//
delimiter ;
从我读到的内容来看,只要我的会话处于活动状态,@ s就是一个mysql会话变量。 @s的存在让我感到很恼火,因为我担心存储了2个并发请求 proc可能会玩这个“全局变量”。所以我试着像这样删除'@'
delimiter //
CREATE PROCEDURE dynamic(IN tbl CHAR(64), IN col CHAR(64))
BEGIN
DECLARE full_statement VARCHAR(300);
SET full_statement = CONCAT('SELECT ',col,' FROM ',tbl );
PREPARE stmt FROM full_statement;
EXECUTE stmt;
END
//
delimiter ;
构建准备好的语句但没有成功。
我似乎经常
错误1064(42000):您的SQL语法有错误;检查 手册,对应右边的MySQL服务器版本 在'full_statement附近使用的语法;执行stmt;
我在php会话中对2次调用的恐惧真的是一个问题吗? (如果没有,那么使用相同的200个存储过程呢 全局变量)?
我能否真正实现目标并删除'@'并让准备好的 语句是由一个简单的存储过程变量处理还是它是预准备语句的约束?
问候。
答案 0 :(得分:1)
是的,@ var是必需的。
MySQL的PREPARE语句只接受“用户变量”(前缀为@
的语句),而不接受存储例程中声明的局部变量。
这一直被认为是MySQL中的WTF:
我在php会话中对2次调用的恐惧真的是一个问题吗?
没有。它不是一个全局变量,它是一个会话变量 两个并发会话对@var有自己的价值。