0

我有一个类似的存储过程(但更长)。它是从 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 个并发请求可能会使用这个“全局变量”。所以我试着像这样删除'@'

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 ;

构建准备好的语句没有成功。

我似乎经常

ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'full_statement; 附近使用的正确语法;执行语句;

  • 我对 php 会话中的 2 个调用的恐惧真的是个问题吗?(如果没有,有 200 个使用同一个全局变量的存储过程怎么样)?

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

问候。

4

1 回答 1

1

是的,@var 是必需的。

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

这在 MySQL 中早已被公认为 WTF:

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

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

于 2013-08-19T03:12:54.617 回答