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

标签 sql c postgresql

我正在尝试在 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_xmlcursor_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/

相关文章:

java - JPQL 按子列计算多个多对一和组计数

c# - Entity Framework ——底层SQL语句

sql - 如何根据不同的 WHERE 选择一列并生成两个不同的列

sql - Oracle Forms 11g - 将文件作为 PDF 而不是 TXT 通过电子邮件发送

postgresql - float 的 postgresql to_char 格式化

postgresql - 当没有与当前用户同名的数据库时,列出 PostgreSQL 中的所有数据库

sql - 如何根据阈值删除除部分记录之外的所有记录?

c - 为什么循环顺序会影响二维数组迭代时的性能?

c - 如何使用C按字典顺序比较2个文件

c++ - 如何使用着色器在 opengl es 中渲染四边形内的部分纹理