【问题标题】:How can I use a list of variables in the "EXECUTE STATEMENT USING" statement MySQL?如何在 MySQL 的“EXECUTE STATEMENT USING”语句中使用变量列表?
【发布时间】: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)')

【问题讨论】:

    标签: mysql sql stored-procedures


    【解决方案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 两次?
      猜你喜欢
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 2021-09-09
      • 2021-04-15
      • 2018-04-20
      • 1970-01-01
      • 2015-01-27
      相关资源
      最近更新 更多