Как ПОДГОТОВИТЬ И ВЫПОЛНИТЬ запрос из строки, хранящейся в таблице - PullRequest
0 голосов
/ 07 февраля 2019

Эта хранимая функция возвращает запрос:

DROP FUNCTION IF EXISTS get_query (
  ctl text, scm text, tbl text, seq text);
CREATE OR REPLACE FUNCTION get_query (
  ctl text, scm text, tbl text, seq text)
RETURNS text
AS
$$
    select concat('insert into ',$2,'.',$1, ' select nextval("',$4,'") as id, ',
           string_agg(concat('NEW.', column_name), ', '), ', current_timestamp as audited_at;')
    from information_schema.columns
    where table_catalog = $1
      and table_schema = $2
      and table_name = $3
$$
LANGUAGE sql;

Как мне PREPARE запрос, который возвращает эта функция.

Я хочу вставить запись в таблицу при срабатывании триггера, но я не хочу указывать список столбцов, которые нужно вставить.Схема может постоянно меняться.Следовательно, пытаясь использовать подготовленные операторы.

Этот пример кода иллюстрирует, как я имею в виду строку запроса, которая должна быть выполнена:

DROP FUNCTION IF EXISTS fn_name (store_temporary_query text);
CREATE OR REPLACE FUNCTION fn_name (store_temporary_query text)
RETURNS table (query text)
LANGUAGE plpgsql
AS
$$
    begin

        select 'select 1 as ID' into store_temporary_query;
        return query (select store_temporary_query);

    end;
$$

select fn_name('');

Приведенный выше запрос дает следующий вывод

fn_name
select 1 as ID

Желаемый результат - запрос

ID
1

РЕДАКТИРОВАТЬ # 2

DROP FUNCTION IF EXISTS fn_name (store_temporary_query text);
CREATE OR REPLACE FUNCTION fn_name (store_temporary_query text)
RETURNS table (query text)
LANGUAGE plpgsql
AS
$$
    begin

        select 'select 1 as ID;' into store_temporary_query;
        return query execute store_temporary_query;

    end;
$$

select fn_name('');

Здесь мы получаем,

Error executing SQL statement. ERROR: syntax error at or near "select"
  Position: 254 - Connection: Aurora Legacy: 794ms

1 Ответ

0 голосов
/ 07 февраля 2019

Вам нужно EXECUTE, чтобы выполнить запрос, хранящийся в строке:

RETURN QUERY EXECUTE store_temporary_query;
...