【问题标题】:Using RedShift CURSOR to insert and iterate使用 RedShift CURSOR 插入和迭代
【发布时间】:2016-10-28 19:16:13
【问题描述】:
我最近发现 RedShift 支持 CURSOR,更具体地说,它支持以下命令:DECLARE & FETCH。
我设法创建了一个游标并获取它的一些行,但没有找到一种方法:
- 将获取的结果插入到表或变量中。
- 以动态方式迭代已声明游标的行(基于 while 或任何逻辑测试)
我在亚马逊上没有找到任何关于如何做到这一点的文档,有人知道这是否可能吗?谢谢。
【问题讨论】:
标签:
sql
amazon-redshift
database-cursor
【解决方案1】:
Redshift 没有变量。使用INSERT INTO ... SELECT 可以更轻松、更快地插入另一个表。
如果我了解您的第二个用例,我不知道有任何支持该行为的关系数据库。您可以在创建游标时对其进行过滤,但一旦创建,您的选项就是获取下一行或关闭游标。如果你需要过滤,那么你可以DECLARE一个新的光标。
【解决方案2】:
您可以通过创建支持变量的存储过程轻松实现这一点。您可以读取数据集并对其进行迭代并执行您的逻辑。
以下示例显示了一个带有输出参数的过程。参数有输入 (IN)、输入和输出 (INOUT) 和输出 (OUT)。
CREATE OR REPLACE PROCEDURE test_sp2(f1 IN int,
f2 INOUT varchar(256), out_var OUT varchar(256))
AS $$
DECLARE
loop_var int;
BEGIN
IF f1 is null OR f2 is null THEN
RAISE EXCEPTION 'input cannot be null';
END IF;
DROP TABLE if exists my_etl;
CREATE TEMP TABLE my_etl(a int, b varchar);
FOR loop_var IN 1..f1 LOOP
insert into my_etl values (loop_var, f2);
f2 := f2 || '+' || f2;
END LOOP;
SELECT INTO out_var count(*) from my_etl;
END;
$$ LANGUAGE plpgsql;
call test_sp2(2,'2019');
f2 | column2
---------------------+---------
2019+2019+2019+2019 | 2
(1 row)
来源 - https://docs.aws.amazon.com/redshift/latest/dg/stored-procedure-create.html