【问题标题】:Best way to copy specific result set from an Oracle database to an SQLite database in C++将特定结果集从 Oracle 数据库复制到 C++ 中的 SQLite 数据库的最佳方法
【发布时间】:2014-03-13 16:12:47
【问题描述】:

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

【问题讨论】:

  • 您是指总共插入一次还是每行插入一次?在您的情况下,IMO 应该首选前者,因为它只需要一笔交易。
  • 我的意思是每行插入一个。但这不是我的观点。我是 SQL 的菜鸟。我想知道是否有一种没有插入语句的方法。比如:“这是我的结果集,请把它作为table123放到数据库中”
  • 我认为这就是重点!我会写一个可能对你有帮助的答案... :)

标签: c++ oracle sqlite


【解决方案1】:

首先,我不认为 C++ 在这里起任何重要作用。在 Java、PHP、C 或任何其他客户端语言中,您很可能会遇到完全相同的问题。

其次,一个好的解决方案会考虑到有多大数据。我们是在谈论 1000 行还是几百万行?对于“小”数据,整个转换完全在内存中发生的解决方案可能就足够了。对于“更大”的数据,您可能不得不求助于在磁盘上写入中间数据。

第三,数据完整性如何?当我们将源数据库传输到目标数据库时,是否有可能更改?如果没有,那么一切都会变得更容易。

说了这么多,这里有一个可行的方法:使用INSERT INTO ... SELECT 语法(如果您插入到现有表中)或CREATE TABLE ... AS SELECT(如果您想创建一个新表)。查看INSERT 的 SQLite 文档:

INSERT 语句的第二种形式包含一个 SELECT 语句 而不是 VALUES 子句。一个新条目被插入到表中 执行SELECT语句返回的每一行数据。

...或CREATE TABLE:

“CREATE TABLE ... AS SELECT”语句创建并填充一个 基于 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++ 应用程序中构建查询。

问题在于,由于UNIONs 很多,这不能很好地扩展,并且它使得使用准备好的语句变得更加困难(代码方面)。但至少这是一种单一陈述的方法。

考虑到所有因素,您可以考虑只保留当前的解决方案,但对所有个人 INSERTs 使用 transaction。这将确保插入所有行或不插入任何行。

【讨论】:

  • 就我而言,数据不大,完整性也不是问题。因此,如果我理解正确,关键是您无论如何都需要创建文本语句,并且没有语句就没有“直接”的方式,对吧?我在想象一些可以在源数据库(SQLite)上执行语句,获取一些指向实际数据的指针并以某种方式(可能通过一些转换器库)将该指针传递给目标数据库(Oracle)的东西,然后它被集成.
  • 如果有这样的直接方式存在,那我当然不知道。不同的数据库管理系统可能使用截然不同的实现技术。事实上,即使是同一个系统,在不同的情况下也可能使用不同的存储机制。通常,即使是他们理解的 SQL(即接口)也不是 100% 兼容的,更不用说后端了!数据库不仅包含表,还包含视图、触发器和其他高级机制。尽管如此......无论如何,使用文本语句有什么不好,它比使用一些“转换器库”更难吗?
  • 你说的没错,这并不难。将数据转换为文本并返回数据似乎是不必要的开销。你知道一些数据库抽象 API,比如 ODBC,是否有像传递游标这样的直接机制?
  • 我不知道,但我绝不是 ODBC 专家。但是,IMO,这只是一种不同的开销。
猜你喜欢
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 2010-11-13
  • 2012-03-18
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 2010-09-22
相关资源
最近更新 更多