如何在 postgresql 函数中执行多个查询?

How to execute multiple queries in postgresql function?

这个问题可能有点误导。

所以我有这个 table 查询列 requests 包含字符串形式的查询。并非所有查询都在同一个字符串中。我的意思是我一行 table = 一串查询。

问题是我如何循环遍历此 request 列,以便函数执行其中的每个请求?

我知道有 FOR IN LOOPRETURN QUERY EXECUTE 这样的东西 但问题是因为每个查询都是 SELECT 一个,结果总是 table 具有不同的列名和不同数量的列,所以我无法设置 RETURNS TABLE() 正确。

是否有任何其他选项可以循环遍历此列查询以逐一执行它们?

先谢谢你!

是的。请参阅 here,“43.7.3.5. 返回游标”部分。

你的函数应该RETURNSETOF REFCURSOR。

然后,对于每个查询,该函数都会为其打开一个游标并 returns 它。请参阅上面链接部分中的最后一个示例。

请注意游标将需要命名,但没有什么能阻止您生成诸如“cur1”、“cur2”之类的名称...

然后,应用程序只需发出“FETCH ALL FROM cur1”,然后发出“FETCH ALL FROM cur2”等。

请注意,SETOF REFCURSOR 并不意味着所有游标必须具有相同的格式。它们可以是不同的查询。

这一切都需要在事务中发生,因为游标在事务结束时关闭。

我很久以前就用过这个。问题是我的搜索查询花费了一些时间,并返回了一堆记录的 ID。它们与其他 table 有很多 one-to-many 关系,因此以单个 table 的形式返回结果使行数激增,并产生大量数据重复。例如,如果搜索返回 100 个项目,每个项目属于相同的 3 个类别,为什么 select 3 个类别在结果中出现 100 次?该函数返回 SETOF REFCURSOR 以及应用程序重建对象和关系所需的所有数据,而不会浪费时间多次传输相同的数据。