将 dbSendQuery 放入 R 中的函数中
Putting dbSendQuery into a function in R
我在 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
将 return 数据框中的所有内容。
我现在正试图将以上所有内容放入一个函数中,其中有一个必需的参数,变量 x,它是一个文本参数(城市名称);然而,此输入也是 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)
不确定这里有什么问题;显然期望函数仍然需要几分钟才能执行,因为被拉取的数据很大,但没有被 returned 任何实际数据帧。
感谢帮助!
如果您想将查询参数化为 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)
基本上,您需要在存储您要传递的参数的变量名前加上一个$
。
我在 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
将 return 数据框中的所有内容。
我现在正试图将以上所有内容放入一个函数中,其中有一个必需的参数,变量 x,它是一个文本参数(城市名称);然而,此输入也是 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)
不确定这里有什么问题;显然期望函数仍然需要几分钟才能执行,因为被拉取的数据很大,但没有被 returned 任何实际数据帧。
感谢帮助!
如果您想将查询参数化为 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)
基本上,您需要在存储您要传递的参数的变量名前加上一个$
。