1

カーソルからSPI_getbinvalタイプの列をプルするために使用しています。値を操作できるように、これを Cdouble precision[]で a として再構築するにはどうすればよいですか?double *

ドキュメントで見た例のほとんどは、あいまいなヘルパー関数 (つまりconstruct_md_array()) を参照しており、これらの関数のリストや、状況に応じて適切に使用する方法を見つけることができません。

基本的に、含むdoubleから配列を構築する最も効率的な方法を知る必要があります。Datumdouble 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()はPostgreSQLバージョンのprintf()関数です(追加機能付き)-それを使用してください。

于 2013-02-09T21:31:44.653 に答える