Как получить возвращаемое значение из модуля python, вызванного из функции pl / python? - PullRequest
2 голосов
/ 21 сентября 2011

Есть ли причина, по которой этот вызов функции не будет возвращать 'результат'?

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 голос
/ 22 сентября 2011

@ ред.На самом деле не требовался синтаксис 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;
1 голос
/ 21 сентября 2011

Я не знаком с plpython, но если он выдаст ошибку, которая не будет распечатана или передана дальше по цепочке, вы никогда не узнаете.

Я не знаю, тестируете ли вы с командной строкой или нет, но попробуйте поместить оператор print в блоки кроме, чтобы посмотреть, не происходит ли просто ошибка вместо возврата.

...