【问题标题】:ROracle Errors When Trying to Use Bound Parameters尝试使用绑定参数时的 ROracle 错误
【发布时间】:2014-11-06 18:02:03
【问题描述】:

我在运行以下 R 版本的 Win7 机器上使用 ROracle:

平台 x86_64-w64-mingw32
拱 x86_64
操作系统 mingw32
系统 x86_64、mingw32
状态
专业 3
次要 1.1
2014 年
07月
第 10 天
svn 版本 66115
语言 R
version.string R 版本 3.1.1 (2014-07-10) 昵称 Sock it to Me

最后,我要将脚本移动到 *nix 机器上,对其进行 cron 运行,然后使用 RScript 运行它。

我想做类似的事情:
select * from tablename where 'thingy' in ('string1','string2')

这将返回包含 SQLDeveloper(或 Toad 等)中所有列的两行。

(最终,我想将结果从一个 DB 提取到 data.frame 中的单个列中,然后使用这些结果循环 并从第二个数据库中提取结果,但我也需要能够执行此功能。)

我正在关注the documentation for RORacle from here.
我也看过这个(没有得到答案):
Bound parameters in ROracle SELECT statements

当我尝试从 ROracle 进行查询时,我会收到两个不同的错误,具体取决于我尝试的是 dbGetQuery() 还是 dbSendQuery()。

作为背景,以下是我正在使用的版本、查询和数据:

驱动程序名称:Oracle (OCI)
驱动版本:1.1-11
客户端版本:11.2.0.3.0

连接信息是标准的:

库(ROracle)
ora dbcon

这两个查询返回预期结果:
rs_send
rs_get

也就是说,1000 行来自 tablename,其中 'thingy' 存在于 columnname_A 中。

我有一个 data.frame 一列,两行。

my.data = data.frame(RANDOM_STRING = as.character(c('string1', 'string2')))

并且 str(my.data) 返回这个:

str(my.data)
'data.frame':2 obs。 1 个变量:
$ RANDOM_STRING: chr "string1" "string2"

我尝试的查询是:

这给了我一个错误:
.oci.SendQuery(conn, statement, data = data, prefetch = prefetch, 中的错误: 绑定数据与绑定规范不匹配

not_this_either

这给了我一个错误:
.oci.GetQuery(conn, statement, data = data, prefetch = prefetch, 中的错误: 绑定数据行数过多

我猜我的问题出在查询的 data=(widget_name=my.data$RANDOM_STRING) 部分,但我无法通过rubber duck 解决它。

另外,我很好奇为什么我会收到两个不同且不同的错误,具体取决于查询是使用发送(并稍后获取)格式还是获取格式。

【问题讨论】:

    标签: sql r oracle


    【解决方案1】:

    想通了。
    这不是 Oracle 或 ROracle 的问题(我怀疑这一点),而是我的 R 代码。
    我偶然发现了试图解决另一个问题的答案。
    This answer about "dynamic strings" 是让我走向解决方案的原因。
    它不完全适合,但足够接近,可以让我从那里得到答案。

    诀窍是将整个东西包装在一个函数中并在其上运行 ldply:

    library(ROracle)
    ora <- dbDriver("Oracle")
    con <- dbConnect(ora, username = "username", password = "password", dbname = "yourdbnamefromTNSlist")
    
    yourdatalist <- c(12345, 23456, 34567)
    
    thisfinallyworks <- function(x) {
        dbGetQuery(con, "select * from YourTableNameHere where YOURCOLUMNNAME = :d", data = x)
    }
    
    ldply(yourdatalist, thisfinallyworks)
    

    第 1 行结果,其中 YOURCOLUMNNAME 中的数据点 = 12345
    第 2 行结果,其中 YOURCOLUMNNAME 中的数据点 = 23456
    第 3 行结果,其中 YOURCOLUMNNAME 中的数据点 = 34567
    等等

    【讨论】:

      【解决方案2】:

      如果你喜欢 tidyverse,还有一种更紧凑的方法可以使用 purrr 实现上述目标

      library(ROracle)
      library(purrr)
      ora <- dbDriver("Oracle")
      con <- dbConnect(ora, username = "username", password = "password", dbname = "yourdbnamefromTNSlist")
      
      yourdatalist <- c(12345, 23456, 34567)
      
      output <- map_df(yourdatalist, ~ dbGetQuery(con, "select * from YourTableNameHere where YOURCOLUMNNAME = :d", .x))
      
      

      【讨论】:

        猜你喜欢
        • 2018-09-30
        • 1970-01-01
        • 2017-07-22
        • 1970-01-01
        • 2015-12-27
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        • 2017-05-08
        相关资源
        最近更新 更多