【问题标题】:Using RedShift CURSOR to insert and iterate使用 RedShift CURSOR 插入和迭代
【发布时间】:2016-10-28 19:16:13
【问题描述】:

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

  1. 将获取的结果插入到表或变量中。
  2. 以动态方式迭代已声明游标的行(基于 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

      【讨论】:

        猜你喜欢
        • 2018-07-17
        • 2020-10-20
        • 1970-01-01
        • 2012-01-13
        • 2013-05-13
        • 1970-01-01
        • 1970-01-01
        • 2012-01-05
        • 1970-01-01
        相关资源
        最近更新 更多