在C++代码中处理 PL/pgSQL 函数的消息

Handling PL/pgSQL function's message in C++ code

本文关键字:pgSQL 函数 消息 PL C++ 代码 处理      更新时间:2023-10-16

我正在PL/pgSQL函数中运行一个计算,我想在C++代码中使用该计算的结果。最好的方法是什么?

我可以将结果插入到表中并从中使用,但我不确定最佳实践的效果如何。此外,我可以用RAISE NOTICEstderr发送消息,但我不知道我是否可以在代码中使用该消息。

这里的细节有点肤浅,所以很难说。

只要有可能,强烈建议直接获取函数的返回值。如果返回单个结果,则返回SELECT my_function(args);如果返回一行或一组行,则返回SELECT * FROM my_function(args);。然后像处理其他查询结果一样处理结果。这是简单SQL和PL/PgSQL函数基本使用的一部分。

其他选项包括:

  • 返回refcursor。在某些情况下,如果您希望返回一个动态结果集或多个结果集,尽管它现在主要被RETURN QUERYRETURN QUERY EXECUTE取代,但这可能很有用。然后从refcursor中FETCH来获得结果行。

  • LISTEN用于事件,并且在工作完成时具有函数NOTIFY,可能将结果作为通知有效载荷。当函数不一定与想要使用其结果的程序在同一连接上调用时,这很有用。

  • 在函数中创建一个临时表,然后从调用该函数的会话的表中创建SELECT

  • 通过RAISE发出日志消息,并设置client_min_messages以便接收它们,然后处理它们。这是一种非常丑陋的做法,真的应该不惜一切代价避免。

  • INSERT将结果放入一个现有的非临时表中,然后在事务提交并且行对其他事务可见后SELECT将其取出。

哪个更好?这完全取决于你想做什么。在几乎所有情况下,正确的做法就是调用函数并处理返回值,但在特殊情况下也有例外。