【问题标题】:how to write to dynamically created table in Redshift procedure如何在 Redshift 过程中写入动态创建的表
【发布时间】: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 程序是去年推出的,我没有看到很多例子。

【问题讨论】:

    标签: stored-procedures amazon-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。我希望这是自动化的,所以不想每次都更改输入?
    猜你喜欢
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多