首页 > 解决方案 > 如何获取表元组并将其转换为 C 中的数组以用于 postgres?

问题描述

我正在关注 Postgres 文档https://www.postgresql.org/docs/8.2/xfunc-c.html来编写 C 函数并创建扩展(用于层次聚类),我很困惑。

  1. 所以我可以通过使用得到一个元组HeapTupleHeader t = PG_GETARG_HEAPTUPLEHEADER(0);
  2. 如何获取此元组中的属性值?我们有GET_ARGUMENT_BY_NUM,我可以为每一列获取一个值并将其放入一个数组中吗?(出于某种原因,我想从表中获取数据,例如,将其聚类)。
  3. 有一个使用特定表作为函数的示例(emp 表)。如何为我的函数使用随机表(我找不到示例)?
  4. (在文档中)是c_overpaid(emp, limit)为 emp 表调用一次,还是与表中的行一样多地调用它?
  5. 对于层次聚类:我可以从 postgres 获取表数据,将其写入临时文件,读取该文件,将其放入数组,对其进行聚类并将结果放入数据库吗?(比如创建或更改表并进行分区?像这样:集线器 - 是整个表,part_1 是一个集群,part_2 是第二个集群,等等)

标签: cpostgresqlalgorithmhierarchical-clustering

解决方案


您应该阅读当前版本的文档

  1. 是的。

  2. 如示例所示,with GetAttributeByName, 但也有一个GetAttributeByNum函数。我假设您在谈论 C 数组而不是 PostgreSQL 数组。当然,如果它们具有相同的数据类型,您可以将所有值填充到一个数组中。

  3. 那么你将不得不使用特殊类型record。有关代码示例,请查看函数record_to_jsoncomposite_to_json.src/backend/utils/adt/json.c

  4. 为找到的每一行调用它,因为它出现在SELECT列表中。

  5. 这有点模糊,但可以肯定。我不明白你为什么要从表中提取它。为什么不编写自己的表访问方法,因为看起来您想定义一种存储表的​​新方法。

    但请注意,这绝对不是微不足道的,你最好先用更平凡的东西弄湿你的脚。


推荐阅读