如何创建具有动态名称(基于 current_date)的 table 并在 INSERT 语句中引用它?

How can I create a table with a dynamic name (based on current_date) and reference to it in INSERT statements?

目前我每个月都要重新运行数据选择查询,其中我创建了一个基地table。此 table 的名称类似于 MyDB.MyTable_Current_Date,因此今天使用 YYYYMM 日期格式的 MyDB.MyTable_201811

与其手动设置名称(使用 ctrl + h),不如自动完成。我的目标是我可以打开 SQL 和 运行 查询,其中创建的 table 是 MyTable_YYYYMM.

注意:最终我还想每个月自动让 SQL 运行,但现在这是我理解的很好的第一步。

我做了下面的存储过程。问题是,如果我想执行 alter tableinsert into 语句,我不能(或不知道如何)引用创建的 table。

REPLACE PROCEDURE DB.table_yymm
(
IN      db_name VARCHAR(128), 
    tbl_name    VARCHAR(128)
    )
BEGIN
    DECLARE create_name VARCHAR(261) 
    ;   
    DECLARE sql_stmt    VARCHAR(600)
    ;

    SET create_name = db_name || '.' || tbl_name || CAST(
                                                    (CURRENT_DATE (FORMAT 'yymm'))
                                                    AS CHAR(4)
                                                    )
    ;
    SET sql_stmt = 'CREATE TABLE ' || create_name || ' (testvar char(1))' || ';' ;

    EXECUTE IMMEDIATE sql_stmt;         
END;

CALL prd_work_lm.table_yymm('My_DB', 'My_Table')

我应该使用 存储过程 还是使用 用户定义的函数 来执行此操作?

如果我能简单地引用一些函数就太理想了,例如: CREATE TABLE DB.My_UDF(<My_DB>, <My_Table_Name>)

你能提供一个代码示例来帮助我吗?

无需最初创建新的 table MyDB.MyTable_201811 并在整个脚本中使用它,您只需创建一个具有已知名称的 table,例如MyDB.MyTable_000000。现在这个名称被使用并重命名为最后一步。

这是现有 SP 的细微变化,将 table 从 '..._000000' 重命名为 '..._yyyymmdd'

REPLACE PROCEDURE rename_table_to_yyyymm
(
  IN db_name VARCHAR(128) CHARACTER SET Unicode,
  IN tbl_name VARCHAR(128) CHARACTER SET Unicode,
  OUT msg VARCHAR(600) CHARACTER SET Unicode
) SQL SECURITY INVOKER
BEGIN
   DECLARE old_name VARCHAR(261)  CHARACTER SET Unicode;
   DECLARE new_name VARCHAR(261)  CHARACTER SET Unicode;

   DECLARE sql_stmt VARCHAR(600)  CHARACTER SET Unicode;

   SET old_name  = '"' || Coalesce(NullIf(db_name,''), DATABASE) || '"."' 
                       || Coalesce(tbl_name, '') || '"';

   SET new_name  = '"' || Coalesce(NullIf(db_name,''),DATABASE) || '"."' 
                       || Trim(Trailing '0' FROM tbl_name)-- remove '000000' at the end of the table name
                       || '_' || To_Char(Current_Date, 'YYYYMM') || '"';

   SET sql_stmt = 'RENAME TABLE ' || old_name || ' AS ' || new_name || ';'; 

   EXECUTE IMMEDIATE sql_stmt;

   SET msg = ' Table ' || old_name || ' renamed to ' || new_name;

END;