查询可变数量的模式

时间:2018-11-05 18:38:12

标签: function schema plpgsql postgresql-9.6

这似乎是很普遍的问题,但这是我第一次遇到这个问题,找不到合适的解决方案。

我需要创建一个函数来动态引用模式,它们是用一种模式创建的,每个模式都有相同的表(名称和列)。 以前,只需要对与架构名称关联的不同表中的记录进行计数。

当需要查找所有模式时,我打算在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 

0 个答案:

没有答案