PL/Python 中的函数通过标准的 CREATE FUNCTION 语法声明。
CREATE FUNCTIONfuncname
(argument-list
) RETURNSreturn-type
AS $$ # PL/Python function body $$ LANGUAGE plpython3u;
函数的正文就是一个 Python 脚本。当函数被调用时,它的参数会作为列表 args
的元素传递;命名参数也会作为普通变量传递给 Python 脚本。使用命名参数通常更具可读性。返回值以通常的方式从 Python 代码返回,使用 return
或 yield
(对于结果集语句)。如果您不提供返回值,Python 会返回默认的 None
。PL/Python 将 Python 的 None
翻译成 SQL 的 null 值。在过程中,Python 代码的返回值必须是 None
(通常通过在过程结束时不使用 return
语句或使用不带参数的 return
语句来实现);否则,将引发错误。
例如,一个返回两个整数中较大值的函数可以定义为
CREATE FUNCTION pymax (a integer, b integer) RETURNS integer AS $$ if a > b: return a return b $$ LANGUAGE plpython3u;
作为函数定义正文提供的 Python 代码会被转换成一个 Python 函数。例如,上面的代码会产生
def __plpython_procedure_pymax_23456(): if a > b: return a return b
假设 23456 是 PostgreSQL 分配给该函数的 OID。
参数被设置为全局变量。由于 Python 的作用域规则,这会产生一个微妙的后果:在函数内部,一个参数变量不能被重新赋值为包含该变量名本身的表达式的值,除非该变量在块中被重新声明为全局变量。例如,以下代码将无法工作:
CREATE FUNCTION pystrip(x text) RETURNS text AS $$ x = x.strip() # error return x $$ LANGUAGE plpython3u;
因为对 x
的赋值使 x
成为整个块的局部变量,所以赋值右侧的 x
指的是一个尚未赋值的局部变量 x
,而不是 PL/Python 函数参数。使用 global
语句,可以使其工作:
CREATE FUNCTION pystrip(x text) RETURNS text AS $$ global x x = x.strip() # ok now return x $$ LANGUAGE plpython3u;
但最好不要依赖 PL/Python 的此实现细节。最好将函数参数视为只读。
如果您在文档中看到任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。