如何创建具有动态名称(基于 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 table
或 insert 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;
目前我每个月都要重新运行数据选择查询,其中我创建了一个基地table。此 table 的名称类似于 MyDB.MyTable_Current_Date
,因此今天使用 YYYYMM 日期格式的 MyDB.MyTable_201811
。
与其手动设置名称(使用 ctrl + h),不如自动完成。我的目标是我可以打开 SQL 和 运行 查询,其中创建的 table 是 MyTable_YYYYMM
.
注意:最终我还想每个月自动让 SQL 运行,但现在这是我理解的很好的第一步。
我做了下面的存储过程。问题是,如果我想执行 alter table
或 insert 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;