在mysql动态存储过程中,@var是否需要构建一个准备好的语句?

时间:2013-08-19 03:01:47

标签: mysql stored-procedures prepared-statement

我有一个类似的存储过程(但更长)。它是从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个存储过程呢 全局变量)?

  • 我能否真正实现目标并删除'@'并让准备好的 语句是由一个简单的存储过程变量处理还是它是预准备语句的约束?

问候。

1 个答案:

答案 0 :(得分:1)

是的,@ var是必需的。

MySQL的PREPARE语句只接受“用户变量”(前缀为@的语句),而不接受存储例程中声明的局部变量。

这一直被认为是MySQL中的WTF:

  

我在php会话中对2次调用的恐惧真的是一个问题吗?

没有。它不是一个全局变量,它是一个会话变量 两个并发会话对@var有自己的价值。