如何从pl/python函数调用的python模块中获取返回值?

2 投票
2 回答
2191 浏览
提问于 2025-04-17 02:46

有没有什么原因导致这个函数调用不会返回'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;

撰写回答