首先发布在这里!该网站对大量先前的技术问题提供了至关重要的帮助。 感谢您的辛勤工作,集体使用。
现在我的问题出现了。
我想编写一个C sqlite3 UDF(用户定义函数)。 假设函数名称为“myFunc”。
我在Raspberry PI 3B上工作 - Raspbian默认(发布最新)。
test_table具有以下架构:
create table test_table (
a integer,
b integer
);
迷你程序(测试方法)打开数据库并安装该功能。 然后无限期地等待触发事件。
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <signal.h>
#include <stdbool.h>
#include <unistd.h>
#include <sys/stat.h>
static void myFuncBody(sqlite3_context *context, int argc, sqlite3_value **argv)
{
printf("myFunc fired!\n");
fflush(stdout);
}
int main(int argc, char** argv)
{
sqlite3 *db_handler;
char *errMsg;
int error;
error = sqlite3_open("test.db", &db_handler);
if (error)
{
printf("Error opening the DB.\n");
exit(-2);
}
error = sqlite3_create_function(
db_handler,
"myFunc",
0,
SQLITE_UTF8,
NULL,
myFuncBody,
NULL,
NULL
);
if (error != SQLITE_OK)
{
printf("Error creating the function.\n");
}
for (;;);
return 0;
}
然后我在sqlite3控制台上单独打开test.db:
$ sqlite3 test.db
$ sqlite> select myFunc();
Error: no such function: myFunc
我认为myFunc应该是可见的,但似乎并非如此。
我也可以创建一个触发器,但结果显然不会改变。
$ sqlite> create trigger trigger1 after insert on test_table begin select myFunc(); end;
$ sqlite> insert into test_table values(-100, -150);
Error: no such function: myFunc
我的目标只是通知test_table上的插入。
我的做法基本上是错误的吗?
任何帮助都会得到很好的解决。
此致 mopyot
答案 0 :(得分:2)
这里有一个误解:
新定义的C函数仅在句柄(在您的情况下为db_handler
)的上下文中定义。它不是数据库文件test.db
的未来部分。
所以如果你做了
sqlite3_exec(db_handler, "select myFunc()", ...);
致电sqlite3_create_function()
后,它应该按照您的预期运作。