Запросить переменное количество схем - PullRequest
0 голосов
/ 05 ноября 2018

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

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

Эта функция, которую я намеревался использовать в предложении FROM, когда нужно найти все схемы.

Пример вывода:

  Client  |UserName|           #post                                        |             #notification  
  schema1 | user1  |count(id) from schema1.post where post.user_id = user.id| count(id) from schema1.notif  where notif.user_id = user.id
  schema1 | user2  |count(id) from schema1.post where post.user_id = user.id| count(id) from schema1.notif  where notif.user_id = user.id
  schema2 | user3  |count(id) from schema2.post where post.user_id = user.id| count(id) from schema2.notif  where notif.user_id = user.id

До сих пор моей стратегией было создание динамической функции для установки щемы, таблицы и столбца.

CREATE OR REPLACE FUNCTION tenant( schemaName varchar, tableName varchar, attr varchar) 
RETURNS "record" AS $BODY$
DECLARE
  temp record;
BEGIN
  EXECUTE 
  'SELECT ' || attr || 
  'FROM ' || schemaName || '.' || tableName  into temp;

  RETURN temp;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

Но у меня появляется это сообщение об ошибке при выполнении ОШИБКА: не удалось определить полиморфный тип, поскольку вход имеет тип «неизвестно» Состояние SQL: 42804

Другим подходом является crate функция, которая возвращает справочную таблицу. Но столбцы и тип данных должны быть динамическими, чтобы использовать их как:

SELECT c.schema, u.name, 
(SELECT COUNT(post.id) from func(c.schema, 'post') AS count_post),
(SELECT COUNT(notification.id) from func(c.schema, notification') AS count_notification)   
FROM _global.customer AS c,  
_global.user AS u WHERE u.customer_id = c.id 
...