如何在 MySQL 的“EXECUTE STATEMENT USING”语句中使用变量列表?

Posted

技术标签:

【中文标题】如何在 MySQL 的“EXECUTE STATEMENT USING”语句中使用变量列表?【英文标题】:How can I use a list of variables in the "EXECUTE STATEMENT USING" statement MySQL? 【发布时间】:2019-12-09 05:42:34 【问题描述】:

我有以下程序-

DELIMITER $$
DROP PROCEDURE IF EXISTS testInjection $$
CREATE PROCEDURE testInjection(IN groupList LONGTEXT)
BEGIN
SET @groupList = groupList;
SET @QUERY = "SELECT * FROM ben where groupid IN ? ";
PREPARE stmt FROM @QUERY;
EXECUTE stmt USING @groupList;
DEALLOCATE PREPARE stmt;
END $$

'groupList' 是一个长变量列表。调用上述过程时,我在“where groupid in '?”附近出现 mysql 语法错误。 '。

在网上看,我发现? 是一个仅用于单个变量的占位符,因此我们不能将它用于列表。即使我创建了多个? 变量,例如“?,?,?”并将其附加到 mysql 查询。我应该如何在“EXECUTE STATEMENT USING”语句中使用 @groupList 变量?

我正在调用如下程序-

CALL testInjection('(6598924, 6598928)')

【问题讨论】:

【参考方案1】:

当解析逗号分隔值作为aIN的输入时,它将被视为字符串,因此我们需要使用find_in_set

试试下面的查询

DELIMITER $$
CREATE PROCEDURE testInjection(IN groupList LONGTEXT)
BEGIN
SET @groupList = groupList;
SET @QUERY = 'select * from ben where find_in_set (groupid,?)';
PREPARE stmt FROM @QUERY;
EXECUTE stmt USING @groupList; 
DEALLOCATE PREPARE stmt;  
END $$

致电:call testInjection('6598924, 6598928');

【讨论】:

【参考方案2】:

您能否检查以下查询...

DELIMITER $$

DROP PROCEDURE

IF EXISTS testInjection $$
    CREATE PROCEDURE testInjection (IN groupList LONGTEXT)

BEGIN
    SET @groupList = groupList;
    SET @QUERY = "SELECT * FROM ben where groupid IN @groupList ";

    PREPARE stmt
    FROM @QUERY;

    EXECUTE stmt USING @groupList;

    DEALLOCATE PREPARE stmt;
END $$

【讨论】:

你为什么要使用@groupList 两次?

以上是关于如何在 MySQL 的“EXECUTE STATEMENT USING”语句中使用变量列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在mysql中查询以某个字符开头的表 如何在mysql中查询以某个字符开头的表

如何在mysql中显示中文???

如何在cmd中关闭Mysql

如何卸载mysql干净

在Mysql中如何显示所有用户?

在Mac如何启动MySQL