使用RedShift CURSOR插入和迭代

时间:2016-06-26 20:05:10

标签: sql cursor amazon-redshift

我最近发现RedShift支持CURSOR,更具体地说它支持命令:DECLARE& FETCH。 我设法创建了一个游标并获取了一些行,但没有找到方法:

  1. 将获取的结果插入表或变量中。
  2. 以动态方式迭代声明游标的行(基于while或任何逻辑测试)
  3. 我没有在亚马逊上找到关于如何做到这一点的任何文档,是否有人知道这是否可能?感谢。

2 个答案:

答案 0 :(得分:1)

您可以通过创建支持变量的存储过程来轻松实现此目的。您可以读取遍历它的数据集并执行逻辑。

以下示例显示了带有输出参数的过程。参数是输入(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

答案 1 :(得分:0)

Redshift没有变量。使用INSERT INTO ... SELECT更轻松,更快地插入另一个表。

如果我了解您的第二个用例,那么我不知道任何支持该行为的关系数据库。您可以在创建游标时对其进行过滤,但是一旦创建,您的选择就是获取下一行或关闭游标。如果您需要过滤,则可以DECLARE新建一个光标。