无法在 R DBI 中获得完整的结果集

Posted

技术标签:

【中文标题】无法在 R DBI 中获得完整的结果集【英文标题】:Can't get full result set in R DBI 【发布时间】:2020-07-27 19:33:02 【问题描述】:

该数据库是 Oracle 12。我将 R DBI 与 RODBC 一起使用。

我有一个包含多个子查询和 WITH 语句的复杂查询。结果集只有大约 3000 行,但在 R 中只返回 800,正好每次返回 800 行。

我尝试了 dbSendQuery,然后是 dbFetch,或者只是单独使用 dbGetQuery,设置 n = 5000 和其他应该返回所有行的值,但没有任何效果。通过设置 n = 500,我可以成功获得 少于 800 行,但不能超过 800。

当我向 SELECT 语句添加列时,返回的行数会减少。这不是 JOIN 问题,完整查询在本机运行时工作正常,只是在 R 中没有。

我也尝试过以块的形式获取结果,使用如下代码,但它只会在结束循环并返回一个表示已达到完整结果的值之前获取第一个块:

while (!dbHasCompleted(rs)) 
    chunk <- dbFetch(rs, 100)
    print(nrow(chunk))

如果我保持所有 WITH 语句相同并保留所有子查询,但从每个 WITH 或子查询中减少最终 SELECT 单个列,那很好,我得到所有行。正如我所说,完整的查询在 SQL Developer 中可以正常工作。

似乎可能有一些大小/内存限制,但对于 3000 行这不应该是一个问题,而且无论如何我有大量的 RAM,以及 R 在发送和获取时使用的资源量结果可以忽略不计,并且数据集很小。复杂的只是查询。

【问题讨论】:

我不认为RODBC 使用DBI 接口。你是说odbc 包吗? 请发布一个 SQL 查询示例。需要了解内容。可能您没有在 R 或 Oracle 中运行 same 查询。 PL/SQL 的过程语义(如 IF)不能在 R dbGetQuery 调用中运行。 @r2evans:我将 RODBC 与另一个包 RODBCDBI 的包一起使用。所以我的初始化代码类似于: library(RODBC) library(DBI) library(RODBCDBI) con 啊,我忘了RODBCDBI,tx 我不知道RODBCDBI 不是问题的一部分,您能否使用(也许)odbc 重现该问题? (RODBCDBI 超过 4 年未更新。)测试可能就像 con &lt;- dbConnect(odbc::odbc(), ...) 一样简单。 【参考方案1】:

我发现了问题。

问题是返回结果中的值无效。该查询在 SQL Developer 中运行良好,因为它只返回 50 个块的结果。R DBI / RODBC 获取完整的结果集,尽管也以 100 个块(显然)的形式获取,这就是它总是获取整数记录的原因: 800+ 块的值无效,所以它只获取了前 800 个,然后才得到错误。

即使尝试从 Developer 导出查询结果也没有显示具体错误,只是失败了。我不得不翻阅所有结果以找到有问题的值并修复它。之后,一切正常。

【讨论】:

以上是关于无法在 R DBI 中获得完整的结果集的主要内容,如果未能解决你的问题,请参考以下文章

R Shiny:无法检索 vertica DB 的 JDBC 结果集

在Oracle中,想通过查询语句得出结果集,获得该结果集的表头。

为啥 WMI 不会在 ManagementObjectCollection 中返回完整的结果集?

在 EVALUATE_AGGR 中没有看到来自 LISTAGG 的完整结果集

使用 Iris 数据集使用 Python 在 R 中重现 LASSO / Logistic 回归结果

获得所需的结果集值,该值可能需要数小时才能显示在表格中