PL/Python 中的函数通过标准的CREATE FUNCTION语法声明:
CREATE FUNCTION funcname
(argument-list
)
RETURNS return-type
AS $$
# PL/Python 函数体
$$ LANGUAGE plpythonu;
函数体就是一个 Python 脚本。当函数被调用时,它的参数被当做列表args
的元素传递,命名参数也被作为普通变量传递给 Python 脚本。使用命名参数通常可读性更好。Python 代码会以通常的方式返回结果,即使用return
或者yield
(在结果集合语句的情况中)。如果没有提供一个返回值,Python 会返回默认的
None
。PL/Python会把 Python 的None
翻译成 SQL 空值。在一个过程中,Python代码的结果必须是None
(通常实现为结束过程时不写return
语句或者使用不带参数的return
),否则将会发生错误。
例如,一个返回两个整数中较大的整数的函数可以定义为:
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() # 错误
return x
$$ LANGUAGE plpythonu;
因为对x
的赋值让x
成为了整个代码块的一个局部变量,并且因此该赋值操作右边的x
引用的是一个还未赋值的局部变量x
,而不是 PL/Python 函数的参数。通过使用global
语句,可以让上面的代码正常工作:
CREATE FUNCTION pystrip(x text) RETURNS text AS $$ global x x = x.strip() # 现在好了 return x $$ LANGUAGE plpythonu;
但是不建议依赖于这类 PL/Python 的实现细节。最好把函数参数当作是只读。
目录46.1. 接口函数SPI_connect — 连接一个C函数到 SPI 管理器SPI_finish — 将一个C函数从 SPI 管理器断开SPI_execute — 执行...
Frameset onload Event Frameset 对象定义和用法onload 事件在页面载入完成后被触发。语法onload="JavaScriptCode"参数描述JavaS...
Audio played 属性 Audio 对象实例获得音频中以秒计的首段已播放的范围(部分):var x = document.getElementById("myAudio");d...
Style paddingLeft 属性 Style 对象定义和用法paddingLeft 属性设置或返回元素的左内边距。语法设置 paddingLeft 属性:Object.s...
Style marginTop 属性 Style 对象定义和用法marginTop 属性设置或返回元素的上外边距。语法设置 marginTop 属性:Object.style.m...
Style overflow 属性 Style 对象定义和用法overflow 属性设置或返回如何处理呈现在元素框外面的内容。语法设置 overflow 属性:O...
Style tabSize属性 Style 对象实例设置一个 pre 元素的 tabSize:document.getElementById(myPRE).style.tabSize=16;定义和用法t...
Style transitionTimingFunction属性 Style 对象实例改变过渡效果的速度曲线:document.getElementById(myDIV).style.transition...