如何在 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 过程中写入动态创建的表的主要内容,如果未能解决你的问题,请参考以下文章