c++内部的sqlite3(带有TABLE及其INDEX的存储过程或复杂sql)

sqlite3 inside C++ (stored procedure or complex sql with TABLE and its INDEX)

本文关键字:存储过程 复杂 sql INDEX TABLE sqlite3 内部 带有 c++ 及其      更新时间:2023-10-16

我正在尝试在我的c++应用程序sqlite3。我已经做了:

  • sqlite3 my.db
  • sqlite>创建表链接(UrlAsID VARCHAR(255)主键,所有者VARCHAR(255), ......
  • sqlite> CREATE INDEX linkIDs ON links(UrlAsID, creatationtime ASC);

然后我打开了一个从c++代码到数据库的连接。

在代码中我有一个Url对象。现在我要做的是:

// check if url is in index (and in table as well)
string urlID = sqlite3_exec("SELECT UrlAsID FROM linkIDs WHERE UrlAsID = " + Url.id + ";");
if (urlID.empty()) {
    sqlite3_exec("INSERT INTO links VALUES (" + Url.properties + ");");
    sqlite3_exec("INSERT INTO linkIDs VALUES (" + Url.id + "," + int(Url.creationTime) + ");");
} else {
    sqlite3_exec("UPDATE links SET (CreationTime = " + int(Url.creationTime) + "," + ... + ") WHERE UrlAsID = " + Url.id + ";");
    sqlite3_exec("UPDATE linkIDs SET (CreationTime = " + int(Url.creationTime) + ") WHERE UrlAsID = " + Url.id + ";");
}

我想创建一个存储过程或使用一个复杂的SQL语句来封装上面的逻辑。你能提供给我更精确的代码来完成这个吗?

提前感谢!

为了安全性和速度,您的语句应该包装在事务中。此外,您应该使用带参数的预处理语句,同样是为了安全性和速度(不同类型的安全性,但即使如此)。您应该使用合适的COALESCE来使用INSERT或REPLACE。所有这些都与你嵌入的语言无关,但这些链接都指向相关的语法。

SQLite不支持存储过程:http://www.sqlite.org/whentouse.html

如果SQL代码很复杂,我会尝试放入一个。SQL文件,然后加载到一个变量并执行。

SQLite不支持存储过程。你最多能做的就是使用预处理语句。您还应该使用SQLite绑定方法来设置参数,而不是使用字符串连接。阅读这里的介绍:http://sqlite.org/cintro.html