PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 43. PL/Python - Python 过程语言 | 下一页

# 43.2. PL/Python 函数

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

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

函数体是一个简单的Python脚本，当函数被调用的时候，它的参数作为列表`args` 的元素传递；命名参数也会被当做普通的变量传递到Python脚本中。命名参数的使用通常更易读。 结果将使用`return`或`yield`（结果集语句的情况） 照常从Python代码中返回。如果没有提供返回值，Python返回缺省的`None`。 PL/Python翻译Python的`None`为SQL空值。

比如，返回两个整数中较大者的函数可以定义为：

    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;

因为分配到的`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 plpythonu;

但最好不要依赖PL/Python的执行细节。最好是把函数参数作为只读的。

上一页 | 起始页 | 下一页
Python 2 vs. Python 3 | 上一级 | 数据值