我使用RJDBC在RStudio拉一组从Oracle数据库数据的成R.
加载RJDBC包后我有以下行:把dbSendQuery成一个函数中的R
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
@joran是的,这是正确的。在正常脚本中,我会为每次运行手动更改“x”,但是我打算在函数中为该参数进行操作。 – Qaribbean
然后,您需要一些将参数插入到查询中的代码;下面的答案是一个选项,但您始终可以使用'paste'或'gsub'。如果你徘徊,有一些选择,我相信这将保护你免受SQL注入问题,如果这是一个问题。 – joran