我试着用C语言来处理PG数组。有读取现有数组的示例,但我无法找到如何创建和设置新数组的示例。
到目前为止,这就是我所掌握的。我想我的意图很清楚:
PG_FUNCTION_INFO_V1(makearray);
PGMODULEEXPORT Datum makearray(PG_FUNCTION_ARGS)
{
long a = PG_GETARG_INT32(0);
ArrayType* result = new_intArrayType(a);
for (long i = 0; i < a; i++)
{
result[i] = DatumSetInt32(i);
}
PG_RETURN_ARRAYTYPE_P(result);
}如何设置每个元素的值?另外,我实际上想要一个int8[]数组。
注意事项
我不想把论点传进来。数组将完全在内部创建。如何设置元素而不获取元素?确切的情况是,有一个具有这些值的C长数组,然后将这些值复制到PG数组中。
发布于 2016-06-06 13:02:58
您应该使用函数construct_array或construct_md_array
#include "catalog/pg_type.h"
PG_FUNCTION_INFO_V1(array_four);
Datum
array_four(PG_FUNCTION_ARGS)
{
Datum elements[4];
ArrayType *array;
elements[0] = PG_GETARG_DATUM(0);
elements[1] = PG_GETARG_DATUM(1);
elements[2] = PG_GETARG_DATUM(2);
elements[3] = PG_GETARG_DATUM(3);
array = construct_array(elements, 4, INT8OID, 8, true, 'd');
PG_RETURN_POINTER(array);
}第二种备选案文:
Datum
array_four(PG_FUNCTION_ARGS)
{
Datum elements[4];
ArrayType *array;
int i;
for (i = 0; i < 4; i++)
elements[i] = Int64GetDatum(i);
array = construct_array(elements, 4, INT8OID, 8, true, 'd');
PG_RETURN_POINTER(array);
}登记:
CREATE FUNCTION array_four(int, int, int, int)
RETURNS int[]
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;测试:
postgres=# select array_four(10,20,30,40);
┌───────────────┐
│ array_four │
╞═══════════════╡
│ {10,20,30,40} │
└───────────────┘
(1 row)https://stackoverflow.com/questions/37657205
复制相似问题