SQLite的扩展函数Carray()表值函数(三十八)

news2024/11/24 1:20:00

返回:SQLite—系列文章目录   

上一篇:SQLite如何处理CSV 虚拟表

下一篇:SQLite—系列文章目录   

1. 概述

Carray()是一个具有单列的表值函数(名为 “value”)和零行或多行。 carray() 中每一行的“值”取自 C 语言数组 由应用程序通过参数绑定提供。 这样,carray()函数提供了一种方便的机制来 将 C 语言数组绑定到 SQL 查询。

2. 可用性

默认情况下,carray()函数不会编译为 SQLite。 它可作为 ext/misc/carray.c 源文件中的可加载扩展名使用。

carray()函数在 3.14 版中首次添加到 SQLite 中(2016-08-08). sqlite3_carray_bind() 接口和 在 SQLite 版本 3.34.0 中添加了 carray()的单参数变体(2020-12-01). 在 SQLite 版本 3.41.0 中添加了绑定被解释为 BLOB 的 struct iovec 对象数组的功能 (2023-02-21).

3. 详情

carray()函数接受一个、两个或三个参数。

对于 carray()的 2 个和 3 个参数版本, 第一个参数是指向数组的指针。由于指针值不能 直接在 SQL 中指定,第一个参数必须是 使用 sqlite3_bind_pointer()接口绑定到指针值 使用指针类型“Carray”。 第二个参数是数组中的元素数。可选的 第三个参数是确定元素数据类型的字符串 在 C 语言数组中。第三个参数允许的值为:

  1. 'int32'
  2. “int64”
  3. “双倍”
  4. 'char*'
  5. 'struct iovec'

默认数据类型为“int32”。

用于 BLOB 数据的“struct iovec”类型是标准的 Posix 数据 结构,通常使用“#include < sys/uio.h>”声明。 格式为:

struct iovec {
  void  *iov_base; /* Starting address */
  size_t iov_len;  /* Number of bytes to transfer */
};

3.1. 单参数CARRAY

carray()的单参数形式需要特殊的 C 语言 名为“sqlite3_carray_bind()”的接口,以便附加值:

  int sqlite3_carray_bind(
    sqlite3_stmt *pStmt,         /* Statement containing the CARRAY */
    int idx,                     /* Parameter number for CARRAY argument */
    void *aData,                 /* Data array */
    int nData,                   /* Number of entries in the array */
    int mFlags,                  /* Datatype flag */
    void (*xDestroy)(void*)      /* Destructor for aData */
  );

sqlite3_carray_bind() 的 mFlags 参数必须是以下参数之一:

  #define CARRAY_INT32   0
  #define CARRAY_INT64   1
  #define CARRAY_DOUBLE  2
  #define CARRAY_TEXT    3
  #define CARRAY_BLOB    4

mFlags 参数的高阶位现在必须全部为零, 尽管它们可能会在将来的增强功能中使用。的定义 指定数据类型和 原型的常量 sqlite3_carray_bind()函数在辅助函数中都可用 头文件 ext/misc/carray.h

sqlite3_carray_bind()例程的 xDestroy 参数是一个指针 到释放输入数组的函数。SQLite 将调用此 函数。xDestroy 参数 可以是 “sqlite3.h”:

  • SQLITE_STATIC → 这意味着调用 sqlite3_carray_bind()维护数据数组的所有权,并且 应用程序向 SQLite 承诺它不会更改或解除分配 在预处理的语句最终化之前的数据。

  • SQLITE_TRANSIENT → 此特殊值指示 SQLite 使 它自己的数据的私有副本之前 sqlite3_carray_bind()接口返回。

4. 用法

carray()函数可用于查询的 FROM 子句。 例如,使用 rowids 从 OBJ 表中查询两个条目 取自地址 $PTR 处的 C 语言数组。

SELECT obj.* FROM obj, carray($PTR, 10) AS x
 WHERE obj.rowid=x.value;

此查询给出相同的结果:

SELECT * FROM obj WHERE rowid IN carray($PTR, 10);

5.例程 

以下是一个使用Carray()函数的简单示例:

#include <stdio.h>
#include <sqlite3.h>

/* 回调函数 */
static int callback(void * data, int argc, char ** argv, char ** colName) {
  int i;
  for (i = 0; i < argc; i++) {
    printf("%s = %s\n", colName[i], argv[i] ? argv[i] : "NULL");
  }
  printf("\n");
  return 0;
}

/* 主函数 */
int main(int argc, char ** argv) {
  sqlite3 * db;
  char *errmsg = 0;
  int ret;
  char * select = "SELECT * FROM Company;";
  char * data[10][3];   // 用于存储SQLite的查询结果(Company表)

  /* 打开SQLite数据库 */
  ret = sqlite3_open("Test.db", &db);
  if (ret) {
    fprintf(stderr, "无法打开数据库:%s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    return 1;
  }

  /* 执行SQLite查询语句并将结果存储在已分配的内存空间中 */
  ret = sqlite3_exec(db, select, callback, data, &errmsg);
  if (ret != SQLITE_OK) {
    fprintf(stderr, "SQL语句执行失败:%s\n", errmsg);
    sqlite3_free(errmsg);
    sqlite3_close(db);
    return 1;
  }

  /* 打印查询结果 */
  int i;
  for(i=0; i<10; i++) {
    printf("%s %s %s\n", data[i][0], data[i][1], data[i][2]);
  }

  /* 关闭SQLite数据库 */
  sqlite3_close(db);
  return 0;
}

在这个示例中,我们使用Carray()函数将SQLite表(Company表)的结果读取到预分配好的容器数组(包含3个字段和10个记录)data中。回调函数callback被频繁调用,用于将结果集中的字段和值复制到容器数据中。最后,我们打印了结果以确认它已成功地读取到了容器数组中。

这个示例可以帮助你更好地理解Carray()函数和回调函数的用法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1634297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【yolov8目标检测部署】TensorRT int8量化

原作者github&#xff1a;https://github.com/xuanandsix/Tensorrt-int8-quantization-pipline/tree/main 改进&#xff1a; 源代码支持的TensorRT版本为7.许多属性已经弃用&#xff1b; 在原有的代码上将支持的TensorRT版本从7改到8. &#xff01;&#xff01;不知道如何安装T…

工具链工具——映射与调度、模拟与验证、开发与测试工具

本篇文章将重点介绍工具链的工具相关知识&#xff0c;我们将从工具链的基本概念出发&#xff0c;重点介绍工具链中的映射和调度工具、模拟与验证工具、开发和测试工具&#xff0c;最后提出对工具链发展的展望&#xff0c;从而对工具链的工具进行一个较为系统的讲解。 工具链的…

万兴PDF专家 PDFelement Pro v10.3.8 破姐版!

&#x1f9d1;‍&#x1f4bb;万兴PDF专家 PDFelement Pro v10.3.8 破姐版 (https://docs.qq.com/sheet/DRVVxTHJ3RXJFVHVr)

WebSocket 全面解析

&#x1f31f; 引言 WebSocket&#xff0c;一个让实时通信变得轻而易举的神器&#xff0c;它打破了传统HTTP协议的限制&#xff0c;实现了浏览器与服务器间的全双工通信。想象一下&#xff0c;即时消息、在线游戏、实时股票报价…这一切都离不开WebSocket的魔力&#x1f4ab;。…

利用word2vec包将中文转变为词向量

代码展示&#xff1a; import jieba import re import json import logging import sys import gensim.models as word2vec from gensim.models.word2vec import LineSentence, loggerpattern u[\\s\\d,.<>/?:;\\"[\\]{}()\\|~!\t"#$%^&*\\-_a-zA-Z&…

网页使用之如何返回json/xml

后端返回json数据给前端进行渲染的方式比较熟悉&#xff0c;至于返回html页面&#xff0c;返回xml的方式接触逐渐减少&#xff0c;来在项目中熟悉这一点。 返回文本数据 json姿势的返回实属最简单的方式&#xff0c;在SpringBoot应用中&#xff0c;有两种简单的方式 1.直接在…

【docker 】Windows10安装 Docker

安装 Hyper-V Hyper-V 是微软开发的虚拟机&#xff0c;仅适用于 Windows 10。 按键&#xff1a; win键X &#xff0c;选着程序和功能 在查找设置中输入&#xff1a;启用或关闭Windows功能 选中Hyper-V 点击确定 安装 Docker Desktop for Windows Docker Desktop 官方下载…

LeetCode46:全排列

题目描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案 解题思想 使用used记录元素是否使用过&#xff0c;排列是有序的&#xff0c;要注意与组合的区别。 代码 class Solution { public:vector<vector<int>…

在线教程|零门槛部署 Llama 3,70B 版本只占 1.07G 存储空间,新用户免费体验 8B 版本

4 月 18 日&#xff0c;Meta 宣布开源 Llama 3&#xff0c;这个号称「迄今为止最好的开源大模型」一经发布&#xff0c;立刻引爆科技圈&#xff01; 发布当天恰逢斯坦福大学教授、AI 顶尖专家吴恩达的生日&#xff0c;作为 AI 开源倡导者&#xff0c;他激动地发文表示&#xff…

Llama 3 ——开源大模型Llama 3从概念到使用

概述 Meta公司自豪地宣布推出其最新的开源大型语言模型——Llama 3&#xff0c;这是一款专为未来AI挑战而设计的先进工具。Llama 3包含两个不同参数规模的版本&#xff0c;以满足多样化的计算需求&#xff1a; 8B版本&#xff1a;优化了在消费级GPU上的部署和开发流程&#xf…

二、VLAN原理和配置

vlan不是协议&#xff0c;是一个技术&#xff0c;虚拟局域网技术&#xff0c;基于802.1q协议。 vlan&#xff08;虚拟局域网&#xff09;&#xff0c;将一个物理的局域网在逻辑上划分成多个广播域的技术。 目录 1.冲突域和广播域 概念 范围 2.以太网帧格式 3.以太网帧封装…

自动驾驶中的深度学习和计算机视觉

书籍&#xff1a;Applied Deep Learning and Computer Vision for Self-Driving Cars: Build autonomous vehicles using deep neural networks and behavior-cloning techniques 作者&#xff1a;Sumit Ranjan&#xff0c;Dr. S. Senthamilarasu 出版&#xff1a;Packt 书籍…

使用LocalGPT+cpolar打造可远程访问的本地私有类chatgpt服务

文章目录 前言环境准备1. localGPT部署2. 启动和使用3. 安装cpolar 内网穿透4. 创建公网地址5. 公网地址访问6. 固定公网地址 前言 本文主要介绍如何本地部署LocalGPT并实现远程访问&#xff0c;由于localGPT只能通过本地局域网IP地址端口号的形式访问&#xff0c;实现远程访问…

电子式汽车机油压力传感器的接线方法及特点

电子式机油压力传感器由厚膜压力传感器芯片、信号处理电路、外壳、固定电路板装置和两根引线&#xff08;信号线和报警线&#xff09;组成。信号处理电路由电源电路、传感器补偿电路、调零电路、电压放大电路、电流放大电路、滤波电路和报警电路组成。 厚膜压力传感器是20世纪…

杰发科技AC7840——SPI通信简介(1)_跑通Demo

0. 简介 一些配置项&#xff1a; CPHA&#xff1a;相序 CPLO&#xff1a;极性 看着demo需要按键&#xff0c;于是去掉按键&#xff0c;去掉打印&#xff0c;直接输出波形看逻辑分析仪的信号。 其实现在做这些demo测试应该都有逻辑分析仪&#xff0c;直接看波形更直观一点。…

git误操作版本回退的方法

场景&#xff1a;在使用git进行代码提交的时候不小心执行了git reset 命令进行了版本回退但是在这之前进行了git add . git commit -m "提交"等命令&#xff0c;正常情况下就可以直接使用 git reset 版本号 进行代码的回退&#xff0c;但是发现自己不能找打上一个提…

搭建MongoDB副本集

文章目录 一、什么是MongoDB的副本集二、副本集的架构三、副本集的成员四、部署副本集1、节点划分2、安装MongoDB2.1、下载解压安装包 3、创建主节点3.1、创建存储数据和日志的目录3.2、新建配置文件3.3、启动节点服务 4、创建副本节点4.1、创建存储数据和日志的目录4.2、新建配…

场景文本检测识别学习 day06(Vi-Transformer论文精读)

Vi-Transformer论文精读 在NLP领域&#xff0c;基于注意力的Transformer模型使用的非常广泛&#xff0c;但是在计算机视觉领域&#xff0c;注意力更多是和CNN一起使用&#xff0c;或者是单纯将CNN的卷积替换成注意力&#xff0c;但是整体的CNN 架构没有发生改变VIT说明&#x…

面试笔记——线程池

线程池的核心参数&#xff08;原理&#xff09; public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)corePoolSize …

2024年 Java 面试八股文——Redis篇

目录 1、介绍下Redis Redis有哪些数据类型 难度系数&#xff1a;⭐ 2、Redis提供了哪几种持久化方式 难度系数&#xff1a;⭐ 3、Redis为什么快 难度系数&#xff1a;⭐ 4、Redis为什么是单线程的 难度系数&#xff1a;⭐ 5、Redis服务器的的内存是多大…