2017-04-04 54 views
0

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

不確定這裏有什麼問題;顯然期望的功能仍然需要幾分鐘才能執行,因爲被拉的數據很大,但不會返回任何實際的數據幀。

幫助表示讚賞!

+1

只是要清楚,它聽起來像你打算在'dbSendQuery'中傳遞給Oracle的sql中使用它的參數'x'的函數?那是對的嗎?因爲如果是這樣,你還沒有表明你已經試圖在你的代碼中實際實現這種行爲。 – joran

+0

@joran是的,這是正確的。在正常腳本中,我會爲每次運行手動更改「x」,但是我打算在函數中爲該參數進行操作。 – Qaribbean

+1

然後,您需要一些將參數插入到查詢中的代碼;下面的答案是一個選項,但您始終可以使用'paste'或'gsub'。如果你徘徊,有一些選擇,我相信這將保護你免受SQL注入問題,如果這是一個問題。 – joran

回答

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) 

基本上,你需要存儲你要傳遞的參數變量名的前面放一個$

+0

試過這種方法(函數中使用的參數是一個目標名稱),但是它返回錯誤Data_Grab(倫敦):對象'倫敦'找不到' – Qaribbean

+1

你需要倫敦附近的報價嗎?像這樣:''倫敦'' – simitpatel

+0

是的!雙引號工作,謝謝。我一直在tweeking並嘗試單引號沒有奏效。 – Qaribbean