在postgres中实现用户定义的c函数

时间:2014-05-30 16:54:22

标签: sql c postgresql

我正在尝试在PostgreSQL中用C创建一个自定义函数。

该函数应该将一个表作为参数,并在从传入的表中访问数据后返回一个表作为输出。

我看到的例子都涉及传入整数和其他基本类型。我的请求可以在PostgreSQL中使用吗?我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

是的,这是可能的。

输出端很简单,只需使用RETURNS TABLE (...)RETURNS SETOF record,具体取决于结果集是否具有动态列。源代码中存在大量示例,而文档中有一些示例。

输入方面不那么简单。您需要将 refcursor 传递给函数,传递表架构和名称,或者传递regclass oid,其中包含{{1}中的表格ID }}。选择哪个取决于您需要如何使用该功能。如果您希望它能够使用另一个函数的输出,那么只有一个refcursor可用。如果您不需要(或者不介意通过临时表进行操作),使用pg_class oid则更方便,因为您不必创建游标对于表并将光标传递给函数,您只需直接传递表名或oid。

PostgreSQL中的一些函数将表读作regclass并处理它们。源中的regclass函数是如何执行此操作的良好起点。

您不太可能找到很多关于如何使用refcursor并对其进行处理的示例。您最好的起点是PostgreSQL源代码。 table_to_xmlcursor_to_xml函数使用了refcursors。

这些功能都在cursor_to_xmlschema中定义。您可以看到src/backend/utils/adt/xml.c版本只执行table_to_xml并将光标传递给select * from the_table进行处理。这显示了如何读取和使用行。