使用SQLite扩展函数来定义自己的函数

数据库 其他数据库
sqlite有个不方便的地方就是不能在sql中定义枚举量和常量。但我们可以这样解决:因为sqlite可以让用户自己扩展sql函数,所以我们可以根据自己的需要写出适合自己程序的函数。本文主要介绍了这一过程,希望能对您有所帮助。

使用C/C++操作sqlite数据库进行GIS数据转换时,sqlite不能在sql中定义枚举量和常量。当程序设计中需要很多枚举量的时候,比如道路表中道路类型列就是枚举量:0表示高速,1表示国道,2表示省道,3表示县道等,又不能在sql中定义这些枚举量,我们该怎么解决呢?

通过搜索引擎知道sqlite可以让用户自己扩展sql函数,感觉可以使用sqlite扩展函数来解决这个问题。sqlite扩展sql函数的方法和步骤:首先按sqlite扩展函数的原型定义自己的函数,然后使用sqlite3_create_function注册到sqlite中,然后就可以在sql中使用自己定义的函数了,就跟使用预定义好的sqlite核心函数一样。

例如,我们可以把高速类型定义成一个扩展函数,这个函数返回0:

  1. static void fun_ROAD_TYPE_HIGHWAY( sqlite3_context * context, int argc, sqlite3_value ** value ) { sqlite3_result_int64( context, 0 ); }; 

然后把它注册到sqlite中,注册名为ROAD_TYPE_HIGHWAY:

  1. sqlite3_create_function( db, "ROAD_TYPE_HIGHWAY", 0, SQLITE_ANY, 0, fun_ROAD_TYPE_HIGHWAY, 0, 0 ) 

注册完后我们就可以在sql语句中通过注册名ROAD_TYPE_HIGHWAY来使用这个函数了,如:选出所有高速的sql可以写成select * from road_table where road_type = ROAD_TYPE_HIGHWAY(),这样是不是好多了。

由于GIS数据库中的枚举量居多,如果每个都要手工写个函数并注册,这肯定是一个超级体力活,所以用perl写了一个根据c/c++头文件生成sqlite扩展函数的小程序:http://files.cnblogs.com/adgnat/sqlitefungen.7z

程序使用方法:

1.确保安装了perl5和vc。

2.下载程序并解压。

3.打开cmd.exe,并进入程序(sqlitefungen)目录。

4.运行vcvars32.bat初始化VC编译环境。

使用SQLite扩展函数来定义自己的函数

5.执行自动生成脚本:perl sqlitefungen.perl mydb.h,mydb.h可以换成自己定义的头文件。

使用SQLite扩展函数来定义自己的函数

6.执行完后头文件目录下将生成一个同名的dll文件,你可以在sqlite3.exe中使用.load命令或sql中使用load_extension函数来加载该dll,加载后就可以使用dll中定义的扩展函数了。

关于SQLite扩展函数的知识就介绍到这里,希望看完之后您能有所收获,因为您的收获就是我***的快乐!

【编辑推荐】

  1. SQLite 基本控制台命令简介
  2. SQLite数据库简介之对表的操作
  3. 利用Sql Server将Excel中的数据导入Oracle
  4. 利用mysql的audit审计功能记录用户操作信息
  5. 忘记sa密码,又删除了administrators帐号的解决方法
责任编辑:赵鹏 来源: 博客园
相关推荐

2010-10-25 16:05:07

oracle自定义函数

2009-09-14 09:49:08

Linq扩展函数

2010-03-26 18:21:29

PythonC API

2010-02-02 17:33:35

Python函数编译

2017-03-16 14:37:05

LinuxShell函数

2010-05-24 15:53:44

MySQL内置函数

2009-12-07 17:33:44

PHP SQlite数

2023-09-12 07:38:36

C++getline函数

2021-07-15 16:41:21

Swift查询函数

2010-09-09 09:31:19

SQL函数left

2010-01-05 16:07:46

jQuery.prot

2011-04-18 10:49:49

SQL Server扩展函数

2009-07-21 17:21:57

Scala定义函数

2010-10-09 16:18:43

MYSQL IFNUL

2010-10-11 16:23:35

MYSQL BENCH

2010-10-11 15:08:44

MySQL conca

2010-11-11 16:17:07

SQL内嵌用户定义函数

2010-07-09 10:08:53

SQL Server函

2010-09-24 19:28:12

SQL CHARIND

2010-10-25 17:08:34

oracle聚合函数
点赞
收藏

51CTO技术栈公众号