尝试使用绑定参数时的ROracle错误

时间:2014-09-12 14:11:37

标签: sql r oracle

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

平台x86_64-w64-mingw32
拱x86_64
os mingw32
system x86_64,mingw32
状态
专业3 小1.1 2014年 月07日 第10天 svn rev 66115
语言R
version.string R版本3.1.1(2014-07-10) 昵称袜子给我

最后,我要将脚本移动到* nix机器,cron它,并使用RScript运行它。

我想做类似的事情:
    从表格中选择*其中' thingy' in(' string1',' string2')

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

(最终,我想将一个数据库中的结果拉入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< - dbDriver(" Oracle")
  dbcon< - dbConnect(ora,username =" username",password =" password",dbname =" dbnamefromTNS")

这两个查询返回预期结果:
rs_send< - dbSendQuery(dbcon," select * from tablename,其中columname_A =' thingy'和rownum< = 1000")
rs_get< - dbGetQuery(dbcon," select * from tablename,其中columname_A =' thingy'和rownum< = 1000")

也就是说,来自tablename的1000行' 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" "字符串2"

我尝试的查询是:

  

nope< - dbSendQuery(dbcon," select * from tablename,其中column_A =' thingy' and widget_name =:1",data = data.frame(widget_name = my.data $ RANDOM_STRING))

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

  

not_this_either< - dbGetQuery(dbcon," select * from tablename,其中column_A =' thingy' and widget_name =:1",data = data.frame(widget_name = my.data $ RANDOM_STRING))

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

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

另外,我非常好奇为什么我会得到两个不同的错误,具体取决于查询是使用send(和稍后获取)格式还是get格式。

2 个答案:

答案 0 :(得分:1)

如果您喜欢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))

答案 1 :(得分:0)

想出来。
这不是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中 等