首页 文章

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

提问于
浏览
1

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

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

******错误******错误:返回“record”SQL函数的函数需要列定义列表:42601

所以看起来我需要定义我想要返回的记录行的列类型 .

I found this answer您可以通过提供生成的行将匹配的表来绕过表类型声明 .

RETURNS SETOF some_existing_table

但是,在我的情况下,由于我要匹配的列类型的表被传递给函数,我不知道该表,直到我可以操作传递的变量(在 DECLARE / BEGIN 之后) .

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

1 回答

  • 2

    有没有办法在函数内动态定义基于已知表的结果行返回类型?

    如果"based on a known table"表示"exactly like a known table",那么 yes .

    SQL是一种严格类型的语言,必须使用定义良好的返回类型创建函数 . 您可以像显然那样(使用 RETURNS SETOF record )回退到 anonymous records ,但是您需要为每个调用添加列定义列表,就像错误消息告诉您的那样 . 就像是:

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

    这很难动态 .

    你的问题留下了解释的空间,但"based on a known table"表明 polymorphic function 可能会有所作为 . 返回类型可以动态地基于任何已注册的行类型,并且系统中的每个表都会自动生成一个 . 准系统代码示例:

    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);
    

    本相关答案中的详细说明(请参阅最后一章"Various complete table types"):

    • Refactor a PL/pgSQL function to return the output of various SELECT queries

相关问题