是否可以将可变数量的参数传递给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 函数
将列名作为参数传递给 Redshift 中的“PREPARE”的问题