gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:34:02 25 4
gpt4 key购买 nike

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

谁能帮帮我?

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;

最佳答案

据我所知,你不能有这样的可变参数列表。您可以执行以下几项操作之一:

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

    CREATE PROCEDURE SP_rptProvince2(a1 VARCHAR(45), a2 VARCHAR(45), ...)

    ...

    IF a1 IS NOT NULL THEN
    SET @strQuery = CONCAT(@strQuery, ' AND ', a2);
    END IF;

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

    可能的调用:

    CALL SP_rptProvince2('''North''', 'column3 = ''South''')
  2. 采用一个比 45 个字符大得多的参数,并将其简单地附加到查询中(假设它不为空)。

    显然,这让用户有责任提供正确的 SQL 代码。

    可能的调用:

    CALL SP_rptProvince2('RegionName = ''North'' AND column3 = ''South''')

两者之间没有太多选择。两者都可以工作;两者都不完全令人满意。

您可能会注意到需要用额外的引号来保护参数中的字符串;这就是造成问题的原因。

关于具有可变参数列表的 MySQL 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10369574/

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