Postgresql SPI:操作类型“Datum”以创建双数组

时间:2013-01-19 01:06:51

标签: c postgresql

我正在使用SPI_getbinval从我的光标中提取double precision[]类型的列。如何在C中将其重建为double *,以便我可以处理这些值?

我在文档中看到的大多数示例都引用了晦涩的辅助函数(即construct_md_array()),我找不到这些函数的列表或如何根据我的情况适当地使用它们。

基本上,我需要知道从包含double的{​​{1}}构建Datum数组的最有效方法。

(参见先前的问题Achieving high-performance transactions when extending PostgreSQL with C-functions)。

1 个答案:

答案 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版本(具有附加功能) - 使用它。