这似乎是很普遍的问题,但这是我第一次遇到这个问题,找不到合适的解决方案。
我需要创建一个函数来动态引用模式,它们是用一种模式创建的,每个模式都有相同的表(名称和列)。 以前,只需要对与架构名称关联的不同表中的记录进行计数。
当需要查找所有模式时,我打算在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
另一种方法是创建一个返回引用表的函数。但是列和数据类型应该是动态的,使用方式如下:
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