如何在 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”语句中使用变量列表?的主要内容,如果未能解决你的问题,请参考以下文章