sqlite3_value_xxx这组函数是用于SQL函数或聚合函数内来获取SQLite传入回调函数的参数的。(详见sqlite3_create_function函数或sqlite3_create_function_v2函数)
SQLite允许注册具有相同名称的函数,这些相同名称的函数之间的参数个数或文本编码不能相同。SQLite会根据参数个数或文本编码来调用最合适的回调函数。
非负的nArg参数的回调函数比具有负nArg的函数实现更好的匹配。
其中首选文本编码匹配数据库编码的功能是比编码不同的功能更好的匹配。
其中编码差异在UTF16LE和UTF16BE之间的函数是比编码差异在UTF8和UTF16之间的函数更接近的匹配。
SQLite的内置函数可能会被新的应用程序定义的函数重载。
自定义的SQL函数或聚合函数允许调用SQLite的API函数。但是在自定义的SQL函数或聚合函数内不能调用sqlite3_open、sqlite3_open16、sqlite3_open_v2、sqlite3_step、sqlite3_reset等函数。
下面的例子是自定义一个SQL函数将小写字符串转换成大写的。
第一步、实现SQL函数(提供给SQLite的回调函数)
void test_upper(sqlite3_context *ctxtext,int argc,sqlite3_value **argv){ int nInput
char *zInput,*zOutput,*q /* 获取SQLite传递进回调函数中的数据 */
zInput = (char *)sqlite3_value_text(argv[0]) /* 获取SQLite传递进回调函数中数据的长度 */
nInput = sqlite3_value_bytes(argv[0]) /* 根据数据长度来开辟临时内存 */
zOutput = q = (char *)sqlite3_malloc(nInput) /* 循环将小写的字符转换成大写 */
for(*zInput != '\0'zInput++,q++)
{ if(*zInput >= 'a' && *zInput <= 'z')
{
*q = *zInput & 0xdf //将小写转换成大写
} else
{
*q = *zInput
}
} /* 执行结果放在zOutput 中使用sqlite3_result_text 函数传递回SQLite */
sqlite3_result_text(ctxtext,zOutput,-1,sqlite3_free) //重点}
注:这里的argc与argv参数与main(int argc,char ** argv)中的参数功能是一样的。
第二步、注册SQL函数
sqlite3_create_function(db,"TEST_UPPER",1,
SQLITE_UTF8,NULL,&test_upper,NULL,NULL)
第三步、使用SQL函数
SELECT TEST_UPPER(name) FROM table WHERE id = 1
你说的 自定义函数, 指的是 自己在数据库里面编写的 函数么?
如果是的话, 那完全可以的啊。
下面是 SQL Server 数据库的例子
1>
2>
3> CREATE FUNCTION HelloWorld4()
4> RETURNS VARCHAR(20)
5> AS
6> BEGIN
7> RETURN 'Hello World!'
8> END
9> go
1> SELECT dbo.HelloWorld4()
2> go
--------------------
Hello World!
(1 行受影响)
CREATE FUNCTION GetChinese(@inputVal VARCHAR(20))
RETURNS VARCHAR(20)
AS
BEGIN
DECLARE
@index AS int,
@result AS VARCHAR(20)
-- 处理的索引
SET @index = LEN(@inputVal)
-- 预期返回值.
SET @result = ''
-- 循环遍历每一个字符.
WHILE @index > 0
BEGIN
IF(DATALENGTH(SUBSTRING(@inputVal, @index, 1)) = 2)
BEGIN
-- 当前字符占2字节, 加入结果列表.
SET @result = SUBSTRING(@inputVal, @index, 1) + @result
END
-- 递减处理索引.
SET @index = @index - 1
END
-- 返回.
RETURN @result
END
go
1> SELECT
2> dbo.GetChinese('123abc汉字') A,
3> dbo.GetChinese('123汉字abc') B,
4> dbo.GetChinese('汉字123abc') C
5> go
A B C
-------------------- -------------------- --------------------
汉字 汉字 汉字
(1 行受影响)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)