Как я могу создать таблицу с динамическим именем (на основе current_date) и ссылаться на нее в инструкциях INSERT? - PullRequest
0 голосов
/ 14 ноября 2018

В настоящий момент мне приходится каждый месяц перезапускать запрос на выборку, где я создаю одну базовую таблицу.Эта таблица названа примерно как MyDB.MyTable_Current_Date, поэтому на сегодня это будет MyDB.MyTable_201811 с использованием формата даты ГГГГММ.

Вместо того, чтобы устанавливать имя вручную (используя ctrl + h), я бы хотел, чтобы это делалось автоматически.Моя цель состоит в том, чтобы я мог открыть SQL-запрос и выполнить запрос, для которого создается таблица MyTable_YYYYMM.

Примечание. В конечном итоге я также хочу, чтобы SQL-сервер запускался автоматически каждый месяц, но сейчасхороший первый шаг для моего понимания.

Я сделал следующую хранимую процедуру .Проблема в том, что если я хочу сделать оператор alter table или insert into, я не могу (или не знаю, как) ссылаться на созданную таблицу.

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>)

Не могли бы вы помочь, предоставив пример примера кода?

1 Ответ

0 голосов
/ 14 ноября 2018

Вместо того, чтобы изначально создавать новую таблицу MyDB.MyTable_201811 и использовать ее по всему сценарию, вы можете просто создать таблицу с известным именем, например, MyDB.MyTable_000000.Теперь это имя используется и переименовывается в качестве последнего шага.

Это небольшое изменение существующего SP для переименования таблицы с '..._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;
...