支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2

44.1. PL/Python 函数 #

PL/Python 中的函数通过标准的 CREATE FUNCTION 语法声明。

CREATE FUNCTION funcname (argument-list)
  RETURNS return-type
AS $$
  # PL/Python function body
$$ LANGUAGE plpython3u;

函数的主体只是一个 Python 脚本。当调用函数时,其参数将作为列表 args 的元素传递;命名的参数也将作为普通变量传递给 Python 脚本。使用命名参数通常更具可读性。结果以通常的方式从 Python 代码中返回,使用 returnyield(在结果集语句的情况下)。如果您不提供返回值,Python 将返回默认的 NonePL/Python 将 Python 的 None 转换为 SQL null 值。在过程(procedure)中,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 的这个实现细节。最好将函数参数视为只读。

提交更正

如果您在文档中发现任何不正确的内容,与您使用特定功能的体验不符,或需要进一步澄清的内容,请使用此表格报告文档问题。