将dbSendQuery放入R中的函数中

时间:2017-04-04 14:52:52

标签: sql r function jdbc rjdbc

我在RStudio中使用RJDBC将一组数据从Oracle数据库中提取到R. 加载RJDBC包后,我有以下几行:

drv = JDBC("oracle.jdbc.OracleDriver", classPath="C:/R/ojdbc7.jar", identifier.quote = " ")

conn = dbConnect(drv,"jdbc:oracle:thin:@private_server_info", "804301", "password")

rs = dbSendQuery(conn, statement= paste("LONG SQL QUERY TO SELECT REQUIRED DATA INCLUDING REQUEST FOR VARIABLE x"))

masterdata = fetch(rs, n = -1)   # extract all rows

运行通常的脚本,它们总是执行而不会失败;它有时可能需要几分钟依赖于变量x,例如可能导致100K行或1M行被拉。 masterdata将返回数据框中的所有内容。

我现在试图将所有上述内容放入一个函数中,其中包含一个必需参数,变量x是TEXT参数(城市名称);但是,此输入也是LONG SQL QUERY的一部分。

我写的名为Data_Grab的函数如下:

Data_Grab = function(x) {
  drv = JDBC("oracle.jdbc.OracleDriver", classPath="C:/R/ojdbc7.jar", identifier.quote = " ")

  conn = dbConnect(drv,"jdbc:oracle:thin:@private_server_info", "804301", "password")

  rs = dbSendQuery(conn, statement= paste("LONG SQL QUERY TO SELECT REQUIRED DATA, 
       INCLUDING REQUEST FOR VARIABLE x"))

  masterdata = fetch(rs, n = -1)   # extract all rows

  return (masterdata)
}

我的功能似乎在几秒钟内执行(没有产生错误)但是我只获得了数据帧和行的21列标题

<0 rows> (or 0-length row.names)

不确定这里有什么问题;显然期望函数仍然需要几分钟才能执行,因为被拉的数据很大,但没有返回任何实际的数据帧。

非常感谢帮助!

1 个答案:

答案 0 :(得分:0)

如果要将查询参数化为JDBC数据库,请尝试使用gsubfn包。代码可能如下所示:

library(gsubfn)
library(RJDBC)
Data_Grab = function(x) {
rd1 = x
df <- fn$dbGetQuery(conn,"SELECT BLAH1, BLAH2
    FROM TABLENAME
    WHERE BLAH1 = '$rd1')
return(df)

基本上,您需要在存储您希望传递的参数的变量名之前放置$