Postgresql как реализовать функцию возврата таблицы, вызывающую функцию возврата записи того же типа - PullRequest
0 голосов
/ 02 мая 2020

Я хочу запросить указанную c информацию из всех таблиц в БД:

select * 
from [pg_catalog.]pg_tables 
where schemaname = '<Schema>';

Единственный способ, которым я могу это сделать (я принимаю любые предложения) без создания временной таблицы, будет разработать функцию, выполняющую al oop для таблиц схемы (L oop для Cursor с этим запросом), а затем для каждой таблицы в схеме я бы вызвал функцию, выполняющую dynamici c pg sql, чтобы получить желаемая информация из этой таблицы в схеме. Эта вторая функция требует Dynami c sql (я полагаю), так как имя таблицы, по которой я хочу выполнить запрос, может изменяться и поэтому должно передаваться в качестве аргумента функции.

Идея заключается в том, что эта «вызываемая» функция будет возвращать тип записи, а затем основная (или «вызывающая») функция должна возвращать тип таблицы, и именно здесь я теряюсь.

Что я надеваю Не знаю, как решить (и вообще не знаю, что можно решить) будет то, как построить функцию, возвращающую тип таблицы (или некоторую структуру данных, которая может быть указана при вызове функции из sql редактора) которая внутренне вызывает функцию, возвращающую запись (та же самая структура таблицы, возвращаемой функцией «вызова»). Во всех примерах, которые я вижу о функциях, возвращающих таблицы, возвращением является выполнение выбора, но я не нашел ни одного примера функции pg sql, возвращающей табличный тип, который внутренне создает структуру таблицы. И я не знаю, возможно ли это вообще.

  • Конечно, тот же самый пример мог бы быть реализован в одной функции, но я все равно нашел бы ту же проблему с функцией, возвращающей табличный тип выполнение разных запросов, возвращающих тип записи. Заранее спасибо.

1 Ответ

0 голосов
/ 02 мая 2020

Предполагая, что все таблицы имеют одинаковую структуру, вам не нужна другая функция, все это можно сделать в одной функции.

create function get_all()
  returns table (table_name text, column_1 .., column_2 ..., column_3 ...) -- specify columns and data types
as
$$
declare 
  l_rec record;
  l_sql text;
begin
  for l_rec in select schemaname, tablename
               from pg_tables
               where schemaname = 'bla'
  loop
    l_sql := format('select %L, column_1, column_2, column_3 from %I.%I', 
                    l_rec.tablename, l_rec.schemaname, l_rec.tablename);
    return query execute l_sql;
  end loop;
end
$$
language plpgsql;

Как документировано в руководстве, RETURN QUERY не завершает функцию, оно только добавляет другой набор строк к результату

Если таблицы не имеют общих столбцов (что делает вопрос довольно странным), я бы возвратил строки в виде JSON значений:

create function get_all()
  returns table (table_name text, row_data jsonb) -- specify columns and data types
as
$$
declare 
  l_rec record;
  l_sql text;
begin
  for l_rec in select schemaname, tablename
               from pg_tables
               where schemaname = 'bla'
  loop
    l_sql := format('select %L, to_jsonb(t) from %I.%I as t', 
                    l_rec.schemaname, l_rec.schemaname, l_rec.tablename);
    return query execute l_sql;
  end loop;
end
$$
language plpgsql;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...