我需要将从Oracle数据库获得的结果集的行插入到SQLite数据库中的新表中。目前,我从结果集中的每一行创建一个insert语句,并在SQLite数据库上执行它。但在我看来,必须有一个更直接的方式。或者这样走的路?
答案 0 :(得分:0)
首先,我不认为 C ++ 在这里发挥重要作用。您很可能在Java,PHP,C或任何其他客户端语言中遇到完全相同的问题。
其次,一个好的解决方案会考虑数据有多大。我们是在谈论1000行,还是几百万行?对于“小”数据,整个转换完全发生在内存中的解决方案可能就足够了。对于“较大”的数据,您可能不得不求助于在磁盘上写入中间数据。
第三,数据完整性如何?在我们将源数据库传输到目标数据库时,源数据库是否可能已更改?如果没有,那么一切都会更容易。
所有这些都说,这是一种可行的方法:使用INSERT INTO ... SELECT
语法(如果插入现有表)或CREATE TABLE ... AS SELECT
(如果要创建新表) )。查看INSERT
的SQLite文档:
INSERT语句的第二种形式包含SELECT语句 而不是VALUES条款。将新条目插入表中 通过执行SELECT语句返回的每一行数据。
...或CREATE TABLE
:
“CREATE TABLE ... AS SELECT”语句创建并填充a 数据库表基于SELECT语句的结果。
在这两种情况下,诀窍都是创建一个SELECT
语句,该语句返回实际来自源数据库的固定值。
这意味着在您的C ++客户端应用程序中,首先在源数据库中创建一个SELECT
语句,然后使用它来创建一个INSERT
或CREATE TABLE
查询字符串像这样:
INSERT INTO my_table SELECT 1, "abc", 2 UNION SELECT 123, "def", 456 UNION SELECT 1000, "foo", 2000
...其中所有值如1,“abc”,2,123,“def”等来自源数据库,用于在C ++应用程序中构建查询。
问题在于,由于许多UNION
s,这不能很好地扩展,并且使得使用预准备语句(代码方式)变得更加困难。但至少这是一种单一陈述的方法。
考虑到所有因素,您可以考虑保留当前的解决方案,但对所有个人INSERT
使用transaction。这将确保插入所有行或不插入任何行。