Carray()是一个表值函数,具有单列(称为“值”)和零行或更多行。carray()中每一行的“值”取自应用程序通过参数绑定提供的C语言数组。这样,carray()函数提供了一种方便的机制,可将C语言数组绑定到SQL查询。
默认情况下,carray()函数未编译到SQLite中。它可以作为ext / misc / carray.c 源文件中的可加载扩展名使用 。
carray()函数最初是在3.14版(2016-08-08)中添加到SQLite的。在SQLite版本3.34.0(2020-12-01)中添加了sqlite3_carray_bind()接口和carray()的单参数变体。
carray()函数采用一个,两个或三个参数。
对于carray()的两个和三个参数版本,第一个参数是指向数组的指针。由于指针值不能直接在SQL中指定,第一个参数必须是一个参数绑定到使用该指针值sqlite3_bind_pointer()接口使用指针型“CARRAY”的。第二个参数是数组中元素的数量。可选的第三个参数是一个字符串,用于确定C语言数组中元素的数据类型。第三个参数的允许值为:
carray()的单参数形式需要一个特殊的C语言接口,名为“ sqlite3_carray_bind()”,以便附加值:
int sqlite3_carray_bind( sqlite3_stmt * pStmt,/ *包含CARRAY的语句* / int idx,/ * CARRAY参数的参数号* / 无效* aData,/ *数据数组* / int nData,/ *数组中的条目数* / int mFlags,/ *数据类型标志* / void(* xDestroy)(void *)/ * aData的析构函数* / );
sqlite3_carray_bind()的mFlags参数必须为以下之一:
#定义CARRAY_INT32 0 #define CARRAY_INT64 1 #定义CARRAY_DOUBLE 2 #define CARRAY_TEXT 3
尽管现在可以在将来的增强中使用它们,但mFlags参数的高阶位现在必须全部为零。辅助头文件ext / misc / carray.h中都提供了用于指定数据类型的常量的定义以及sqlite3_carray_bind()函数的原型 。
sqlite3_carray_bind()例程的xDestroy参数是指向释放输入数组的函数的指针。完成数据处理后,SQLite将调用此函数。xDestroy参数可以选择是“ sqlite3.h”中定义的以下常量之一:
SQLITE_STATIC →这意味着调用sqlite3_carray_bind()的应用程序保持对数据数组的所有权,并且该应用程序向SQLite承诺,直到准备好的语句完成后,它才会更改或取消分配数据。
SQLITE_TRANSIENT →此特殊值指示SQLite在sqlite3_carray_bind()接口返回之前创建其自己的数据私有副本。
carray()函数可在查询的FROM子句中使用。例如,使用从地址$ PTR的C语言数组中获取的rowid从OBJ表中查询两个条目。
SELECT obj。* FROM obj,carray($ PTR,10)AS x 在哪里obj.rowid = x.value;
该查询给出相同的结果:
SELECT * FROM obj WHERE在carray中的rowid($ PTR,10);