如何使用SPI函数从DB返回数组属性

时间:2013-08-02 10:18:52

标签: postgresql user-defined-functions

我有一个带有属性的表测试,该属性是字符串数组的数组。

例如数组“ar”是 {{1,A},{A,B,C},{45}}

现在我想检查数组之间是否有值。 例如,如果{A,B,C}是数组“ar”的成员。

我在postgres的核心内部工作(postgres.c),所以我正在使用SPI函数。

SPI_connect();
SPI_exec("select * from test", 0);
if (SPI_processed > 0){
    char *s=SPI_getvalue(SPI_tuptable->vals[SPI_processed],SPI_tuptable->tupdesc,1);
}

但是SPI_getvalue返回一个字符串,我需要数组才能检查数组是否是主数组“ar”的成员。

有没有SPI功能呢?

1 个答案:

答案 0 :(得分:2)

没有任何SPI函数可以返回有关数组的信息。 SPI函数通常是类型不可知 - SPI函数列表http://www.postgresql.org/docs/current/static/spi.html

您应该使用SPI_getbinval - 它返回二进制(Datum)值

http://www.postgresql.org/docs/current/static/spi-spi-getbinval.html

接下来,您可以分析postgresql / src / backend / utils / adt / array * .c文件,如果有一些有用的功能对您有帮助的话。有一个静态的array_contain_compare,主要是arrayoverlap,arraycontains和arraycontained。你可以通过DirectFunctionCall API调用这些函数 - 看看这个很好的Greg教程http://www.pgcon.org/2010/schedule/attachments/142_HackingWithUDFs.pdf,或者你可以在SQL级别上做,然后结果将是一个布尔值 - http://www.postgresql.org/docs/current/static/functions-array.html

postgres=# select '{{1,A, 1},{A,B,C},{45,46,47}}'::text[] @> '{A,B,C}';
 ?column? 
----------
 t
(1 row)

SQL级别的处理通常比使用DirectFunctionCall API简单得多。