1

我用来从光标SPI_getbinval中拉出一列类型。double precision[]如何将其重建为double *C 中的 a 以便我可以使用这些值?

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

基本上,我需要知道从 contains 构造double数组Datum的最有效方法double precision[]

(请参阅先前的问题在使用 C 函数扩展 PostgreSQL 时实现高性能事务)。

4

1 回答 1

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]);
        }
    }
}
...

PSelog()printf()函数的 PostgreSQL 版本(带有附加功能) - 使用它。

于 2013-02-09T21:31:44.653 回答