我正在使用SPI_getbinval
从我的光标中提取double precision[]
类型的列。如何在C中将其重建为double *
,以便我可以处理这些值?
我在文档中看到的大多数示例都引用了晦涩的辅助函数(即construct_md_array()
),我找不到这些函数的列表或如何根据我的情况适当地使用它们。
基本上,我需要知道从包含double
的{{1}}构建Datum
数组的最有效方法。
(参见先前的问题Achieving high-performance transactions when extending PostgreSQL with C-functions)。
答案 0 :(得分:2)
...
bool is_null = true;
Datum raw_array = SPI_getbinval(heap_tuple, tuple_desc, column_of_array, &is_null);
if ( !is_null ) {
ArrayType *pg_array = DatumGetArrayTypeP(raw_array);
int array_dimensionality = ARR_NDIM(pg_array);
// Not prepared for multi-dimension array
if ( array_dimensionality == 1 ) {
double *c_array = VARDATA(pg_array); // Pointer to the array data
int array_size = ARR_DIMS(pg_array)[0]; // Element count of array at [dimension]
// Cycle through a single dimension array
for (int i = 0 ; i < array_size ; ++i) {
elog(INFO, "Double value at element %d: %lf\n", i, c_array[i]);
}
}
}
...
P.S。 elog()
是printf()
函数的PostgreSQL版本(具有附加功能) - 使用它。