我正在尝试在PostgreSQL中用C创建一个自定义函数。
该函数应该将一个表作为参数,并在从传入的表中访问数据后返回一个表作为输出。
我看到的例子都涉及传入整数和其他基本类型。我的请求可以在PostgreSQL中使用吗?我该怎么做呢?
答案 0 :(得分:1)
是的,这是可能的。
输出端很简单,只需使用RETURNS TABLE (...)
或RETURNS SETOF record
,具体取决于结果集是否具有动态列。源代码中存在大量示例,而文档中有一些示例。
输入方面不那么简单。您需要将 refcursor 传递给函数,传递表架构和名称,或者传递regclass
oid,其中包含{{1}中的表格ID }}。选择哪个取决于您需要如何使用该功能。如果您希望它能够使用另一个函数的输出,那么只有一个refcursor可用。如果您不需要(或者不介意通过临时表进行操作),使用pg_class
oid则更方便,因为您不必创建游标对于表并将光标传递给函数,您只需直接传递表名或oid。
PostgreSQL中的一些函数将表读作regclass
并处理它们。源中的regclass
函数是如何执行此操作的良好起点。
您不太可能找到很多关于如何使用refcursor并对其进行处理的示例。您最好的起点是PostgreSQL源代码。 table_to_xml
和cursor_to_xml
函数使用了refcursors。
这些功能都在cursor_to_xmlschema
中定义。您可以看到src/backend/utils/adt/xml.c
版本只执行table_to_xml
并将光标传递给select * from the_table
进行处理。这显示了如何读取和使用行。