【发布时间】:2013-03-09 02:50:31
【问题描述】:
我们正在尝试将选择查询中的记录插入到临时表中,临时表中缺少一些记录。 select 语句有多个连接和联合,所有这些都很少复杂的查询。 简单来说,脚本包含 2 部分 第一部分 插入临时表 第二部分 选择具有多个联接、内联子查询、联合和按类和条件分组的查询
例如。 如果我们单独执行 select 语句,它会返回一些计数,例如 => 60000 插入临时表后,临时表中的计数约为 42000 为什么不一样?
另外,我们还有一些其他的观察。它只发生在第二次执行而不是第一次运行中。希望可能有一些缓存问题
我们有一个解决方案,一旦我们清除会话缓存(检查点、刷新 shared_pool 和 buffer_cache),它就可以正常运行 Re_Run。
但是,我们不知道这个解决方案可以吗?以及如何在后台清除缓存和插入失败。如果是真的,我猜是配置设置有问题。
代码看起来像 sql = "插入到 temptable select x,y,z,.... from xxx,abc,pqr..where...."; (逻辑但不真实非常复杂,大约 700 行,包含多个连接、内联子查询、分组等) stmt = conn.createStatement(); rCount=stmt.executeUpdate(sql); 实际问题是 rCount = xxxx = Count(temptable) 为什么会有这种差异?在选择中填充了一些记录但未插入到临时表中
谁能解释一下?
提前感谢您的努力和帮助。
湿婆。
【问题讨论】:
-
你所描述的没有意义。如果查询返回 60,000 行并且您正在执行直接的
INSERT ... SELECT,则INSERT将插入 60,000 行。如果您看到不同的情况,要么查询不完全相同,要么数据不完全相同(可能其中一个或另一个正在针对一些未提交的更改运行),或者您遇到了需要修补程序的 Oracle 错误。到目前为止,Oracle 错误是最不可能的选项。 -
如果我正确理解了您的陈述,这是简单的批量插入...插入到临时表中选择 * from xxx。此外,两者之间没有提交。问题是 select 语句填充的所有记录都没有插入到临时表中。有些记录没有插入。
-
SQL 语句不可能部分成功(同样,除非您碰巧遇到严重的 Oracle 错误,这种可能性很小)。我强烈打赌,
SELECT语句在您运行它的会话中运行时返回的每一行以及在您运行它时运行时都会返回到表中。 -
甚至,我们也不相信。我们想知道。在 TOAD 中,我们进行了测试,但有时会发生这种情况。在应用程序中,在 jar 文件中,在“insert in to temp select * from xxx”之后,我们取 i。临时表的记录计数和 ii。分别记录“select * from xxx”的计数,但两者都不匹配。仅在第 1 次匹配。
-
第二次运行时,SELECT 语句(没有 INSERT)是否继续返回 60,000 行?
标签: oracle insert temp-tables