Как написать в динамически созданную таблицу в процедуре Redshift - PullRequest
1 голос
/ 17 марта 2020

Мне нужно написать процедуру в 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;
$$

Этот код выполняется, но он не создает новую таблицу, никаких ошибок. Если я удаляю оператор Declare, то он работает, создавая таблицу с именем "new_table". Просто не используется объявленное имя переменной.

Трудно найти хорошие примеры, потому что Redshift - это postgresql, и на всех страницах postgresql написано, что он имеет только функции, а не процедуры. Но процедуры Redshift были введены в прошлом году, и я не вижу много примеров.

1 Ответ

2 голосов
/ 17 марта 2020

Хорошо, когда вы объявляете переменную "new_table" и выполняете SELECT ..INTO "new_table", значение присваивается переменной "new_table". Вы увидите, что если вы вернете свою переменную с помощью параметра OUT.

А когда вы удалите объявление, оно просто будет работать как синтаксис SELECT INTO Redshift SQL и создаст таблицу.

Теперь к решению:

Создайте таблицу с использованием синтаксиса 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 
;

Теперь, если вы вызываете процедуру, передавая 'ab c', в схеме publi c будет создана таблица с именем "swap_ab c".

call public.ct_tab('abc');

Let я знаю, если это поможет:)

...