如何从pl/python函数调用的python模块中获取返回值?
有没有什么原因导致这个函数调用不会返回'result'?
CREATE OR REPLACE FUNCTION myfunction (input int, OUT result int) AS $$
result = mymodule.object(input,plpy)
plpy.info(" ========= EXTRA-module result: ===",result)
$$ LANGUAGE plpythonu;
=== mymodule的内容 ============
def object(input,plpy):
import StringIO
try:
plan = plpy.prepare("INSERT INTO file VALUES (nextval('primary_sequence'),$1) RETURNING primary_key", ["integer"] )
except:
plpy.error(traceback.format_exc())
try:
rv = plpy.execute(plan, [ input ])
result = rv[0]["primary_key"]
plpy.info(" ========= INTRA-module result: ===",result)
return result
except:
plpy.error(traceback.format_exc())
2 个回答
1
我对plpython不是很熟悉,但如果它出现错误而没有打印出来或者没有传递到上一级,你就永远也不知道发生了什么。
我不知道你是在命令行测试还是别的什么,但可以试着在你的异常处理块里加一个打印语句,看看是不是只是出错了而没有返回结果。
1
@ed。其实我并不需要用RETURNS语法来代替OUT,但你的建议让我找到了答案。是的,我觉得自己真是个傻瓜。这就是让别人帮忙检查自己工作的好处。
加上返回结果后,一切都顺利了。我之前的一个关键假设是,result = 语法并没有在调用函数的范围内完成返回。哎呀!
CREATE OR REPLACE FUNCTION myfunction (input int, OUT result int) AS $$
result = mymodule.object(input,plpy)
plpy.info(" ========= EXTRA-module result: ===",result)
# This was the key bit:
return result
$$ LANGUAGE plpythonu;