如何在 Redshift 过程中写入动态创建的表

Posted

技术标签:

【中文标题】如何在 Redshift 过程中写入动态创建的表【英文标题】:how to write to dynamically created table in Redshift procedure 【发布时间】:2020-03-16 21:17:09 【问题描述】:

我需要在 Redshift 中编写一个将写入表的过程,但表名来自输入字符串。然后我声明一个将表名放在一起的变量。

CREATE OR REPLACE PROCEDURE my_schema.data_test(current "varchar")
    LANGUAGE plpgsql
AS $$                                                        
declare new_table varchar(50) = 'new_tab' || '_' || current;

BEGIN 
    select 'somestring' as colname into new_table;
    commit;
END;
$$

此代码运行,但没有创建新表,没有错误。如果我删除声明语句,那么它会起作用,创建一个名为“new_table”的表。它只是不使用声明的变量名。

很难找到好的例子,因为 Redshift 是 postgresql 并且所有的 postgresql 页面都说它只有函数,没有过程。但是 Redshift 程序是去年推出的,我没有看到很多例子。

【问题讨论】:

【参考方案1】:

好吧,当您声明变量“new_table”并执行 SELECT ..INTO “new_table”时,该值将分配给变量“new_table”。如果您使用 OUT 参数返回变量,您将看到这一点。

当您删除声明时,它只是作为 Redshift SQL 的 SELECT INTO 语法工作并创建一个表。

现在解决方法:

使用 CREATE TABLE AS...语法创建表。

另外你需要传递声明变量的值,所以使用 EXECUTE 命令。

CREATE OR REPLACE PROCEDURE public.ct_tab (vname varchar)
AS $$  
DECLARE tname VARCHAR(50):='public.swap_'||vname;

BEGIN 

execute 'create table ' || tname || ' as select ''name''';

END;
$$ LANGUAGE plpgsql 
;

现在,如果您调用传递“abc”的过程,则会在公共模式中创建一个名为“swap_abc”的表。

call public.ct_tab('abc');

如果有帮助请告诉我:)

【讨论】:

如何让表名继承今天的日期,例如swap_18_05_2020,当我明天运行存储过程时,表将是swap_19_05_2020。我希望这是自动化的,所以不想每次都更改输入?

以上是关于如何在 Redshift 过程中写入动态创建的表的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 R 写入 Redshift 问题

yii migrate 数据迁移过程

在过程中动态添加的表上创建触发器

没有参数的redshift过程和参数中的动态表名

通过数据管道将错误消息存储到 Redshift

如何在写入 Redshift DW 之前从 S3 存储桶转换数据?