我在运行以下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格式。
答案 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中
等