0

我在 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;

此查询派生表中已打开行的数据库统计信息。但是我们的数据库有大量的模式。我必须编写函数,使用该查询遍历所有方案,获取每个方案中表中打开的行数。我试图用谷歌搜索这个问题,但我找不到任何相关的例子。

4

2 回答 2

3

使用武力,阅读......错误......手册!

但是,在这种情况下,不需要花哨的逻辑,只需将单个 SQL 查询包装在一个函数中,这样一个普通的SQL 函数就可以了。

这里使用的唯一额外功能是复制类型

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;
于 2012-07-26T06:16:04.670 回答
3

您可以在函数中定义返回值,只需记住具有正确的数据类型或准备进行一些类型转换。

创建或替换函数 get_my_database_status()
返回 TABLE(schemaname name, relname name, reltuples real)AS
$$
开始
   返回查询(SELECT N.nspname AS schemaname,C.relname,C.reltuples
       FROM pg_class C
       左连接 pg_namespace N ON (N.oid = C.relnamespace)
       WHERE N.nspname NOT IN ('pg_catalog', 'information_schema')
       AND C.relkind='r' - 这里可能有一些过滤
       按 relname 排序);
结尾
$$
语言'plpgsql';

于 2012-07-25T20:41:10.143 回答