我需要查询多个模式。例如,事先不知道模式:
我需要从这些模式中的每个模式中的特定表中选择这三个模式。我可以将这个查询放在这三个模式中吗?如果是这样,我如何查询它们?请记住,我不会提前知道模式名称,因此需要动态构建它们。
答案 0 :(得分:0)
如果需要动态构建查询,则有两个选项:预处理语句和函数。
预准备语句仅在会话期间有效,在您注销时会丢失。使用PREPARE
语句创建一个准备好的语句,然后为EXECUTE
提供一个参数,例如模式名称,为每个要运行它的模式提供一次。
数据库中仍有一个功能可供将来使用。如果需要将来自不同模式的数据组合到一个结果集中,这是您唯一的选择,您应该定义函数以返回SETOF tablename
。它或多或少都是这样的:
CREATE FUNCTION query_tablename_schemas (schemas name[]) RETURNS SETOF tablename AS $$
DECLARE
sch name;
BEGIN
FOREACH sch IN ARRAY schemas LOOP
RETURN QUERY 'SELECT * FROM ' || quote_ident(sch) || '.tablename WHERE ...';
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql STRICT;
以上假设您可以在数组中传递模式。如果您有一些查询可以检索模式名称,那么您可以更改循环并执行以下操作:
FOR sch IN
SELECT schema_name FROM ...
LOOP
qry := ...
RETURN QUERY qry;
END LOOP;
在这两种情况下,所有模式中名称为tablename
的所有表中的记录都将作为一个表返回,然后您可以在其他查询中使用该表:
SELECT *
FROM query_tablename_schemas ('{"U111", "U222", "U333"}')
WHERE ...;