我正在PL / pgSQL函数中运行计算,我想在我的C ++代码中使用该计算的结果。最好的方法是什么?
我可以将该结果插入到表中并从那里使用它,但我不确定这种效果与最佳实践有多好。另外,我可以使用stderr
向RAISE NOTICE
发送消息,但我不知道我可以在代码中使用该消息。
答案 0 :(得分:1)
这里的细节有点薄,所以很难肯定。
非常可取的是直接获取函数的返回值。如果它返回单个结果,则为SELECT my_function(args)
;如果返回一行或一组行,则为SELECT * FROM my_function(args);
。然后像处理任何其他查询结果一样处理结果。这是part of the basic use of simple SQL and PL/PgSQL functions。
其他选项包括:
Returning a refcursor。这在您想要返回动态结果集或多个结果集的某些情况下非常有用,尽管现在它主要被RETURN QUERY
和RETURN QUERY EXECUTE
取代。然后,您FETCH
from the refcursor获取结果行。
LISTEN
ing for an event和having the function NOTIFY
when the work is done,可能将结果作为通知有效负载。当函数不一定在与想要使用其结果的程序相同的连接上调用时,这很有用。
在函数中创建一个临时表,然后从调用该函数的会话中的表中创建SELECT
。
通过RAISE
发送日志消息并设置client_min_messages
以便您接收它们,然后处理它们。这是一种非常难看的方式,应该不惜一切代价避免这种做法。
INSERT
将结果放入现有的非临时表中,然后在事务提交后SELECT
将它们输出,并且行对其他事务可见。
哪个更好?这完全取决于你想要做什么。在几乎所有情况下,正确的做法是调用函数并处理返回值,但在特殊情况下也有例外。