【发布时间】:2021-11-09 13:40:46
【问题描述】:
我正在尝试在 plpgsql 中创建以下函数:
CREATE OR REPLACE FUNCTION pg_temp.select_all(query text)
RETURNS VOID AS $$
DECLARE
schemasT RECORD;
BEGIN
FOR schemasT IN (
SELECT schema_name
FROM information_schema.schemata
WHERE schema_name IN (
SELECT login
FROM cdu.nc_tenant
)
) LOOP
SET SEARCH PATH TO schemasT;
EXECUTE query INTO something;
END LOOP;
END; $$
LANGUAGE plpgsql;
因此,任何传入函数的查询都会运行到所有可用的模式中并返回查询结果。使用该函数将是这样的:
pg_temp.select_all('SELECT count(1) FROM sku')
会返回:
| Schema | count |
|---|---|
| Schema1 | 58 |
| Schema2 | 42 |
另一个例子是:
pg_temp.select_all('SELECT * FROM cdu.nc_tenant_variables where variable = ''theme''')
会返回:
| Schema | variable | value |
|---|---|---|
| Schema1 | theme | dark |
| Schema2 | theme | light |
为什么?
有时我需要跨架构查询事物,我正在寻找一种更好的方法来执行此操作而不是这样做:
SELECT 'schema1' AS schema, count(1) FROM schema1.sku
UNION ALL
SELECT 'schema2' AS schema, count(1) FROM schema2.sku
UNION ALL
SELECT 'schema3' AS schema, count(1) FROM schema3.sku;
【问题讨论】:
-
您可以创建报表架构模型,然后您可以从现有架构中填充此模型。然后您可以在该报告架构中进行选择。
标签: postgresql plpgsql