如何让PostgreSQL在PL函数中使用查询信息?

时间:2017-08-28 08:51:54

标签: c postgresql

我是一个noob免责声明:

我对Postgres很新,我不了解PL功能的局限性和能力。我想做一些我认为最好用C完成的简单排序,但我对如何从代码块中从数据库中获取数据感到困惑。从我所看到的,似乎我需要建立从C到数据库的连接然后运行查询......我不禁想到必须有更好的方法(或者我缺少一些东西) - 连接到容器函数所属的数据库似乎是不必要的正式。

我正在尝试做什么:

我有一个包含以下字段的表template_set:template_set_id,template_set,next_template_set_id。记录组将具有相同的template_set值,表明它们属于一起。我希望能够选择这些记录,并通过仅使用next_template_set_id值使它们按顺序显示。简单的做法是创建一个堆栈并将最后一个项目(next_template_set_id = null)推送到堆栈,然后将next_template_set_id是堆栈中最后一个项目的ID推送到堆栈,直到所有项目为止筋疲力尽很简单,但为了做到这一点,我需要将sql数据的集合,数组或元组放入函数中。我可以有一个函数get并返回一个setof template_set表供ac函数进行排序但如果我这样做,那个setof函数将存在于postgres中,我不确定我是否可以将该返回传递给ac函数(是否有一个结构可以采取那种数据)?

问题:

获取postgresql c函数从其所属的数据库中获取数据的最佳方法是什么?你可以从ac函数中查询数据库而不创建连接和游标的所有开销,或者你想要c函数操作的所有数据都需要传递给函数(如果是这样的话,怎么办?你传递了多个数据记录)?

1 个答案:

答案 0 :(得分:1)

您需要连接到数据库,就像在除plpgsql之外的其他语言一样。

您无法将一组行传递给函数,但您可以将它们转换为 - 例如 - json并传递为数组。我想你甚至可以将它们转换成文本并做同样的事情。然后,您必须在函数内部进行反序列化,因此我不确定这是否比在c函数中打开连接更快。它也可能会占用更多内存。

你也可以每行调用一次你的函数,但是根据它的作用,这可能会更好,更糟或根本不工作(比如你的排序)。

SELECT my_c_func(col1, col2, col3) FROM my_table;

所以我的建议是使用SPI并连接到数据库;就像一些流行的扩展一样(例如tablefunc)。