Если вы упростите генерацию динамического c SQL, все станет проще:
CREATE OR REPLACE PROCEDURE public.matching(IN table_name text, VARIADIC column_names text[])
LANGUAGE plpgsql
AS
$BODY$
DECLARE
l_sql text;
BEGIN
l_sql := format($s$
create table temp1 as
select concat_ws(',', %s) as everything
from %I
$s$, array_to_string(column_names, ','), table_name);
raise notice 'Running %', l_sql;
EXECUTE l_sql;
END;
$BODY$;
Так что если вы, например, передадите 'some_table'
и {'one', 'two', 'three'}
, сгенерированный SQL будет выглядит так:
create table temp1 as select concat_ws(',', one,two,three) as everything from some_table
Я также использовал псевдоним столбца для нового столбца, чтобы новая таблица имела определенное имя. Обратите внимание, что способ, которым я помещаю имена столбцов в строку SQL, не будет правильно работать с идентификаторами, которые требуют двойных кавычек (но их все равно следует избегать)
Если вы хотите «вернуть table ", тогда, возможно, функция может быть лучшим решением:
CREATE OR REPLACE function matching(IN table_name text, VARIADIC column_names text[])
returns table (everything text)
LANGUAGE plpgsql
AS
$BODY$
DECLARE
l_sql text;
BEGIN
l_sql := format($s$
select concat_ws(',', %s) as everything
from %I
$s$, array_to_string(column_names, ','), table_name);
return query execute l_sql;
END;
$BODY$;
Тогда вы можете использовать это так:
select *
from matching('some_table', 'one', 'two', 'three');