PostgreSQL:在plpython3u中设置单值返回函数

PostgreSQL:在plpython3u中设置单值返回函数,python,postgresql,plpython,Python,Postgresql,Plpython,我想在PostgreSQL中编写一个plpython3u函数,返回一组文本。我偶然发现了一个对我来说很奇怪的难题。根据手册,我可以执行以下操作: drop schema if exists X cascade; create schema X; create type X.greeting AS ( who text ); create function X.greet( how text ) returns setof X.greeting language plpython3

我想在PostgreSQL中编写一个plpython3u函数,返回一组文本。我偶然发现了一个对我来说很奇怪的难题。根据手册,我可以执行以下操作:

drop schema if exists X cascade;
create schema X;

create type X.greeting AS (
  who text
  );

create function X.greet( how text )
  returns setof X.greeting language plpython3u as $$
  for who in [ 'World', 'PostgreSQL', 'PL/Python' ]:
    yield ( who, )
  $$;
这是一个Python函数,返回一组包含单个文本的行;这么多的工作,我确实得到了预期的输出:

select X.greet( 'helo' );

    greet     
--------------
 (World)
 (PostgreSQL)
 (PL/Python)
(3 rows)

select * from X.greet( 'helo' );

    who     
------------
 World
 PostgreSQL
 PL/Python
(3 rows)
到目前为止还不错。但是,我不想为此编写表定义,我希望使用
setof record
,如本例所示(碰巧使用整数,但仍然):

现在我们来看有趣的部分。综上所述,下面的一个或多个公式应该是正确的:要返回一组单值,请返回Python元组列表、Python数字列表,或者在具有单值的元组上或在单值上迭代:

create function X.single_integers_A( out integer )
  returns setof record language plpython3u as $$
  return [ ( 12, ), ( 36, ), ( 60, ), ]
  $$;

create function X.single_integers_B( out integer )
  returns setof record language plpython3u as $$
  return [ 12, 36, 60, ]
  $$;

create function X.single_integers_C( out integer )
  returns setof record language plpython3u as $$
  for n in [ ( 12, ), ( 36, ), ( 60, ), ]
    yield n
  $$;

create function X.single_integers_D( out integer )
  returns setof record language plpython3u as $$
  for n in [ 12, 36, 60, ]
    yield n
  $$;
结果是上面的任何一个甚至都不编译,它们都会导致SQL解析器抛出函数,因为没有参数,所以结果类型必须是整数。由于我认为SQL解析器不会查看Python函数内部,因此我怀疑-

在PostgreSQL中,不可能同时使用
返回记录集
和单个
输出
参数来定义函数;相反,输出类型必须始终定义为表(或通过类似方式)


有人能纠正我吗?如果这是真的,那真的很烦人。我肯定在什么地方出错了?

您应该只返回一组整数:

create or replace function x.single_integers()
returns setof integer language plpython3u as $$
    return [ 12, 36, 60 ]
$$;

select * from x.single_integers();

 single_integers 
-----------------
              12
              36
              60
(3 rows)    
Per(增加重点):

这里的关键点是,您必须编写RETURNS set of record,以指示函数返回多行而不是一行如果只有一个输出参数,则写入该参数的类型而不是记录。


是-函数要么有out参数并返回void,要么返回一些东西但没有out参数,我想1)感谢评论2)相关链接是3)文档说,“也支持设置带out参数的返回函数(使用returns SETOF record)。-所以是,out parameters+returns set of record是一件事。我很欣慰我在对SQL的理解中发现了一个漏洞,而不是SQL中的错误/疏忽/不一致。
create or replace function x.single_integers()
returns setof integer language plpython3u as $$
    return [ 12, 36, 60 ]
$$;

select * from x.single_integers();

 single_integers 
-----------------
              12
              36
              60
(3 rows)