# 46.2.PL/Python函数

PL/Python中的函数是通过标准创建函数语法:

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

函数体只是一个Python脚本。调用函数时,其参数作为列表元素传递阿格斯; 命名参数也作为普通变量传递给Python脚本。使用命名参数通常更具可读性。结果以通常的方式从Python代码中返回,带有回来产量(对于结果集语句)。如果不提供返回值,Python将返回默认值没有一个.PL/Python翻译Python的没有一个输入SQL空值。在过程中,Python代码的结果必须是没有一个(通常通过在不使用回来声明或使用回来陈述(无论据);否则,将引发错误。

例如,返回两个整数中较大者的函数可以定义为:

CREATE FUNCTION pymax (a integer, b integer)
  RETURNS integer
AS $$
  if a > b:
    return a
  return b
$$ LANGUAGE plpythonu;

作为函数定义主体给出的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 plpythonu;

因为分配给十、使十、整个块的局部变量,因此十、赋值的右边指的是尚未赋值的局部变量十、,而不是PL/Python函数参数。使用全球的声明中,可以这样做:

CREATE FUNCTION pystrip(x text)
  RETURNS text
AS $$
  global x
  x = x.strip()  # ok now
  return x
$$ LANGUAGE plpythonu;

但建议不要依赖PL/Python的这个实现细节。最好将函数参数视为只读。