我使用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