是否可以将可变数量的参数传递给redshift中的存储过程?

Posted

技术标签:

【中文标题】是否可以将可变数量的参数传递给redshift中的存储过程?【英文标题】:Is it possible to pass in a variable amount of parameters to a stored procedure in redshift? 【发布时间】:2019-06-25 14:01:58 【问题描述】:

我正在尝试在 AWS Redshift SQL 中编写一个存储过程,我的一个参数需要有一个整数列表(将在 WHERE 子句中使用“IN(0,100,200,...)”)。我将如何在过程的标题中写入输入参数,以便可以(如果有的话?)

我尝试将它们作为 VARCHAR“整数列表”类型的东西传递,但不确定如何将其解析回整数。

更新:我找到了一种方法来解析字符串并使用 SPLIT_PART 函数循环遍历它并将所有这些存储到一个表中。然后只需使用带有 IN() 调用的 SELECT * FROM 表

【问题讨论】:

如果您认为这会对其他读者有所帮助,请随时添加您自己问题的答案。 主要问题是如何将整数放入调用中。例如,它是一个字符串还是真的是一个整数列表?使用 Python 将在存储过程本身中提供更大的灵活性——从逗号分隔的字符串中提取整数将是微不足道的。 在调用中获取整数的方法是使用逗号分隔的字符串完成的。一开始我只是不完全确定如何存储它们,因为我没有考虑数据库的思维方式。一旦我意识到我可以创建一个临时表,困难的部分就是试图找到一个简单的函数来计算循环的次数。我会在早上的答案中发布我的解决方案。 【参考方案1】:

我最终做的事情如下。我将我期望的整数作为逗号分隔的字符串输入。然后我在上面运行了以下内容。

CREATE OR REPLACE PROCEDURE test_string_to_int(VARCHAR)
AS $$
DECLARE
    split_me ALIAS FOR $1;
    loop_var INT;
BEGIN
    DROP TABLE IF EXISTS int_list;

    CREATE TEMPORARY TABLE int_list (
            integer_to_store INT
    );

    FOR loop_var IN 1..(REGEXP_COUNT(split_me,',') + 1) LOOP
            INSERT INTO int_list VALUES (CAST(SPLIT_PART(split_me,',',loop_var) AS INT));
    END LOOP;

END;
$$ LANGUAGE plpgsql;

所以我会用类似这样的方式调用该过程:

CALL test_string_to_int('1,2,3');

并且可以对其执行选择语句以查看存储到表中的所有值。然后在我的查询中我需要这个参数:

.........................
WHERE num_items IN(SELECT integer_to_store FROM int_list);

【讨论】:

以上是关于是否可以将可变数量的参数传递给redshift中的存储过程?的主要内容,如果未能解决你的问题,请参考以下文章

将可变数量的 bash 命令行参数传递给 MATLAB 函数

C – 将可变数量的参数传递给 main

将列名作为参数传递给 Redshift 中的“PREPARE”的问题

有条件地将任意数量的默认命名参数传递给函数

我可以将数组作为参数传递给 Java 中具有可变参数的方法吗?

怎么将可变参数的函数的参数传递给另一个可变参数的函数