返回数据库结果集的PlPgsql函数

时间:2012-07-25 19:40:27

标签: postgresql plpgsql

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;

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

2 个答案:

答案 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;