带有可变参数列表的MySQL存储过程

ami*_*gul 10 mysql

我做了一个存储过程.我希望它通过不同的参数过滤数据.如果我传递一个参数,它应该被一个过滤; 如果我通过两个,它应该被两个过滤,依此类推,但它不起作用.

有人可以帮我吗?

DROP PROCEDURE IF EXISTS medatabase.SP_rptProvince2;
CREATE PROCEDURE medatabase.`SP_rptProvince2`(
 IN e_Region VARCHAR(45)
  )
BEGIN

 DECLARE strQuery VARCHAR(1024);
 DECLARE stmtp   VARCHAR(1024);
  SET @strQuery = CONCAT('SELECT * FROM alldata where 1=1');
  IF e_region IS NOT NULL THEN
   SET @strQuery = CONCAT(@strQuery, ' AND (regionName)'=e_Region);
  END IF;

 PREPARE  stmtp FROM  @strQuery;
 EXECUTE  stmtp;
END;
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 11

AFAIK,你不能有这样的变量参数列表.你可以做以下几件事之一:

  1. 获取固定的最大参数数量,并在连接之前检查它们是否为null:

    CREATE PROCEDURE SP_rptProvince2(a1 VARCHAR(45), a2 VARCHAR(45), ...)
    
    ...
    
      IF a1 IS NOT NULL THEN
        SET @strQuery = CONCAT(@strQuery, ' AND ', a2);
      END IF;
    
    Run Code Online (Sandbox Code Playgroud)

    如果需要应用e_Region参数中的条件的预定字段(如现有代码中的参数),则适当地修改CONCAT操作.

    可能的调用:

    CALL SP_rptProvince2('''North''', 'column3 = ''South''')
    
    Run Code Online (Sandbox Code Playgroud)
  2. 获取一个比45个字符大得多的参数,只需将其附加到查询中(假设它不为空).

    显然,这会给用户带来责任,以提供正确的SQL代码.

    可能的调用:

    CALL SP_rptProvince2('RegionName = ''North'' AND column3 = ''South''')
    
    Run Code Online (Sandbox Code Playgroud)

两者之间没有太多选择.要么可以工作; 既不完全令人满意.

您可能会注意到需要使用额外的引号保护参数中的字符串; 这就是使这个问题变得棘手的事情.

  • 你应该为自己考虑.我从你的评论中不知道"南方"的来源; 我不知道你的问题,你的第二个或后续论点应与哪个栏目相关联; 我不知道你想怎么称呼它.你必须填写那种细节,并为自己*思考*. (2认同)