首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用int8 C函数创建PostgreSQL []数组

用int8 C函数创建PostgreSQL []数组
EN

Stack Overflow用户
提问于 2016-06-06 12:15:29
回答 1查看 641关注 0票数 2

我试着用C语言来处理PG数组。有读取现有数组的示例,但我无法找到如何创建和设置新数组的示例。

到目前为止,这就是我所掌握的。我想我的意图很清楚:

代码语言:javascript
复制
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数组中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-06 13:02:58

您应该使用函数construct_arrayconstruct_md_array

代码语言:javascript
复制
#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);
}

第二种备选案文:

代码语言:javascript
复制
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);
}

登记:

代码语言:javascript
复制
CREATE FUNCTION array_four(int, int, int, int)
RETURNS int[]
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;

测试:

代码语言:javascript
复制
postgres=# select array_four(10,20,30,40);
┌───────────────┐
│  array_four   │
╞═══════════════╡
│ {10,20,30,40} │
└───────────────┘
(1 row)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37657205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档