将特定结果集从Oracle数据库复制到C ++中的SQLite数据库的最佳方法

时间:2014-03-13 16:12:47

标签: c++ oracle sqlite

我需要将从Oracle数据库获得的结果集的行插入到SQLite数据库中的新表中。目前,我从结果集中的每一行创建一个insert语句,并在SQLite数据库上执行它。但在我看来,必须有一个更直接的方式。或者这样走的路?

1 个答案:

答案 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语句,然后使用它来创建一个INSERTCREATE 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。这将确保插入所有行或不插入任何行。