PostgreSQL:在plpython3u中设置单值返回函数
我想在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
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)