【问题标题】:Putting dbSendQuery into a function in R将 dbSendQuery 放入 R 中的函数中
【发布时间】:2017-04-04 14:52:52
【问题描述】:

我在 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)

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

感谢您的帮助!

【问题讨论】:

  • 为了清楚起见,听起来您打算让函数在dbSendQuery 中传递给Oracle 的sql 中使用它的参数x?那是对的吗?因为如果是这样,您根本没有表示您已经尝试在代码中实际实现该行为。
  • @joran 是的,没错。在普通脚本中,我会为每次运行手动更改“x”,但是我打算让函数中的那个参数现在这样做。
  • 然后你需要一些将参数插入查询的代码;下面的答案是一种选择,但您始终可以使用pastegsub。如果您四处寻找,我相信有一些选项可以保护您免受 sql 注入问题,如果这是一个问题。

标签: sql r function jdbc rjdbc


【解决方案1】:

如果您想将查询参数化为 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)

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

【讨论】:

  • 试过这种方法(函数中使用的参数是目标名称),但是它返回Error in Data_Grab(London) : object 'London' not found
  • 您需要伦敦周边的报价吗?像这样:"London"
  • 是的!双引号有效,谢谢。我一直在 tweeking 并尝试了不起作用的单引号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
相关资源
最近更新 更多