gpt4 book ai didi

mysql准备: session variables vs parameters & local variables

转载 作者:行者123 更新时间:2023-11-29 00:27:31 25 4
gpt4 key购买 nike

我正在使用存储过程和准备语句。我想发送参数来定义从 select 语句返回的列。如果我使用 session 变量并且不替换变量,这将起作用。我可以解决这个问题,但我想了解这个问题。以下是示例:

这个有效:

DELIMITER $$
DROP PROCEDURE IF EXISTS `pnlByTheme` $$
CREATE PROCEDURE `pnlByTheme`(IN param VARCHAR(50))
BEGIN
set @sqlStmt = concat("select ",param," from pnl_aggregate");
prepare stmt from @sqlStmt;
execute stmt;
deallocate prepare stmt;
END $$
DELIMITER ;

当我调用 pnlByTheme('label') 时,我从 pnl_aggregate 中得到了选择标签的结果,就像我从命令行中得到的一样。如果我将 set 语句更改为:

set @sqlStmt = "select ? from pnl_aggregate";

然后我将执行语句更改为:

execute stmt using param;

mysql 不喜欢这样,不会创建过程。如果我改为:

DELIMITER $$

DROP PROCEDURE IF EXISTS `pnlByTheme` $$
CREATE PROCEDURE `pnlByTheme`(IN param VARCHAR(50))
BEGIN
set @p = param;
set @sqlStmt = "select ? from pnl_aggregate";
prepare stmt from @sqlStmt;
execute stmt using @p;
deallocate prepare stmt;
END $$

DELIMITER ;

这将创建程序。为什么?奇怪的是(无论如何对我来说)是调用的结果

call pnlbytheme('label');

只是每一行的字面“标签”,而不是我正在寻找的实际数据。我可以使用 concat 轻松解决此问题,但我想了解一下。请帮忙。

最佳答案

好的,谢谢那些看过的人。当发布后出现相关问题时,我找到了答案。有时我们(或者至少我)并不总是知道如何搜索我们想要的东西。无论如何,这里有两个答案:

1) 准备好的语句是 session 全局的。参见 Dynamic MySQL with local variableshttp://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html (寻找“准备好的声明对于 session 也是全局的。”)。虽然我不是 100% 清楚这一点,但结果是需要 session 变量。贾斯汀·格兰特给出了答案。

2) “参数标记只能用于数据值应该出现的地方,不能用于 SQL 关键字、标识符等。”来自 http://dev.mysql.com/doc/refman/5.7/en/prepare.html ,在这里得到了回答 mysql stored procedure oddity由 Devart 提供。

我还找到了MySQL: @variable vs. variable. Whats the difference?有帮助。谢谢,夸斯诺伊。

关于mysql准备: session variables vs parameters & local variables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18277682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com