【问题标题】:PlPgsql function which returns result set of databasePlPgsql 函数返回数据库的结果集
【发布时间】:2012-07-26 14:16:04
【问题描述】:

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

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

【问题讨论】:

  • 我不能使用上面的查询在 pl/pgsql 中编写函数,该查询返回结果集(表)。结果将包含三列,其中第一列是 shcema 名称,第二列是表名,第三列是每个表中的行数。

标签: postgresql plpgsql


【解决方案1】:

你可以在你的函数中定义返回值,只要记住有正确的数据类型或者准备做一些类型转换。

创建或替换函数 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';

【讨论】:

    【解决方案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;
    

    【讨论】:

    • 为什么要阅读手册,因为这里提供了如此方便的示例,并且类型提示可以引导!非常感谢。
    猜你喜欢
    • 2012-12-18
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2010-10-19
    相关资源
    最近更新 更多