PL / PGSQL中存在功能问题。 基本上,我有一个问题:
SELECT nspname AS schemaname,relname,reltuples
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE
nspname NOT IN ('pg_catalog', 'information_schema') AND
relkind='r' and nspname='1'
ORDER BY relname;
此查询派生表中已打开行的数据库统计信息。但是我们的数据库有大量的模式。我必须编写使用该查询迭代所有方案的函数,获取每个方案中表中打开的行数。我试图谷歌问题,但我找不到任何相关的例子。
答案 0 :(得分:3)
您可以在函数中定义返回值,只需记住具有正确的数据类型或准备进行类型转换。
create or replace function get_my_database_status() returns TABLE(schemaname name, relname name, reltuples real)AS $$ BEGIN return Query (SELECT N.nspname AS schemaname, C.relname , C.reltuples FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE N.nspname NOT IN ('pg_catalog', 'information_schema') AND C.relkind='r' -- here maybe some filtering ORDER BY relname); END $$ language 'plpgsql';
答案 1 :(得分:2)
使用武力,阅读......错误...手册!
然而,在这种情况下,不需要花哨的逻辑,但只有一个SQL查询被包装在一个函数中,因此普通的SQL function会这样做。
此处使用的唯一额外功能是Copying Types。
create or replace function get_my_database_status2()
returns table(schemaname pg_namespace.nspname%type,
relname pg_class.relname%type,
reltuples pg_class.reltuples%type)
as $$
SELECT N.nspname, C.relname, C.reltuples
FROM pg_class C
LEFT JOIN pg_namespace N ON N.oid = C.relnamespace
WHERE N.nspname NOT IN ('pg_catalog', 'information_schema')
AND C.relkind = 'r' -- here maybe some filtering
ORDER BY relname;
$$ language sql;