我正在尝试在 PostgreSQL 中用 C 创建自定义函数。
该函数应该接受一个表作为参数,并在访问传入的表中的数据后返回一个表作为输出。
我见过的例子都涉及传入整数和其他基本类型。我的请求可以在 PostgreSQL 中实现吗?我该如何去做呢?
最佳答案
是的,这是可能的。
输出端很简单,您只需使用 RETURNS TABLE (...)
或 RETURNS SETOF record
,具体取决于结果集是否具有动态列。源代码中有很多示例,文档中有一些 IIRC。
输入端不太简单。您需要将refcursor传递给函数,传递表架构和名称,或者传递regclass
oid,它是pg_class
中表的ID 。选择哪个取决于您需要如何使用该功能。如果您希望它能够使用另一个函数的输出,那么只有引用游标可用。如果您不需要(或者不介意通过临时表执行此操作),则使用 regclass oid 会更方便,因为您不必为表创建游标并将光标传递给函数,只需直接传递表名或 oid 即可。
PostgreSQL 中的一些函数将表读取为 regclass
并处理它们。源代码中的 table_to_xml
函数是执行此操作的一个很好的起点。
您不太可能找到很多关于如何获取引用并处理它的示例。最好的起点是 PostgreSQL 源代码。 cursor_to_xml
和 cursor_to_xmlschema
函数使用引用游标。
这些函数都在src/backend/utils/adt/xml.c
中定义。您可以看到,table_to_xml
版本仅执行 select * from the_table
并将光标传递给 query_to_xml_internal
进行处理。这展示了如何读取和使用行。
关于sql - 在 postgres 中实现用户定义的 c 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23959709/