Кажется, это довольно распространенная проблема, но я впервые сталкиваюсь с этой проблемой и не могу найти правильное решение.
Мне нужно создать функцию для динамической ссылки на схемы, они были созданы с шаблоном, в котором у каждой таблицы одинаковые (имя и столбцы).
При этом нужно только подсчитывать записи из разных таблиц, связанных с именем схемы.
Эта функция, которую я намеревался использовать в предложении 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