postgresql - 根据 plpgsql 中传递的给定表动态定义返回行类型?

标签 postgresql types polymorphism plpgsql dynamic-sql

我在接受源表作为传入变量的 plpgsql 函数中动态构建查询。我想返回构建的 SELECT 语句的结果,该语句对给定表执行聚合,并返回该表的结果。

但是,目前我收到以下错误:

********** Error **********

ERROR: a column definition list is required for functions returning "record" SQL state: 42601

看来我需要定义要返回的记录行的列类型。

I found this answer您可以通过提供结果行将匹配的表来绕过表类型声明。

RETURNS SETOF some_existing_table

但是,在我的例子中,由于我要匹配其列类型的表被传递给函数,所以我不知道该表,直到我可以操作传递的变量(在 DECLARE/开始)。

理想情况下,我想返回我在函数内构建的聚合查询的查询结果(多行)。有没有办法根据函数内的已知表动态定义结果行返回类型?

最佳答案

Is there a way to define result row return types based on a known table dynamically within the function?

如果“基于已知表”是指“完全像已知表”,那么

SQL 是一种严格类型化的语言,必须使用明确定义的返回类型创建函数。您可以像显然那样回退到匿名记录(使用RETURNS SETOF record),但是您需要为每次调用添加列定义列表,例如错误消息告诉你。像这样的东西:

SELECT *
FROM   my_function('foo') AS foo (
          colum_name1 integer  -- name and data type for every column
        , colum_name2 text
        , colum_name3 real);

这几乎不是动态的。

您的问题留有解释的余地​​,但是“基于已知表” 表示多态函数 可能会解决问题。返回类型可以动态地基于任何注册的行类型,系统中的每个表自动有一个。准系统代码示例:

CREATE OR REPLACE FUNCTION my_function(_rowtype anyelement)
  RETURNS SETOF anyelement AS
$func$
BEGIN
   RETURN QUERY EXECUTE format(
     'SELECT * FROM %s LIMIT 10'
    , pg_typeof(_rowtype)  -- pg_typeof() returns regtype, quoted where necessary
      );
END
$func$ LANGUAGE plpgsql;

调用:

SELECT * FROM my_function(NULL::my_table);

这个相关答案中的详细说明(看最后一章“各种完整的表格类型”):

关于postgresql - 根据 plpgsql 中传递的给定表动态定义返回行类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36668165/

相关文章:

ruby-on-rails - 如何在heroku上使用rails设置pgbouncer?

python - 如何在Python中实现泛型? Java 或 C++ 之类的东西提供

c++ - QVector 和 std::vector 的大小方法

types - 什么是 Isabelle/HOL 亚型?哪些 Isar 命令产生子类型?

c++ - 模板多态性

java - 从子类对象使用父类(super class)的 getClass 方法

json - 错误的散列填充到 JSON,Perl

sql - 如何在 Rails 中编写以下查询?

sql - 使用计算的时间戳设置 "VALID UNTIL"值

java - 有人可以解释为什么我在运行程序时会得到这个吗? (简单的Java多态性)