2014-01-27 57 views
2

我運行R的以下版本存儲在Oracle數據庫的PL/SQL程序的Windows 7如何調用來自R

R version 3.0.1 (2013-05-16) -- "Good Sport" 
Copyright (C) 2013 The R Foundation for Statistical Computing 
Platform: x86_64-w64-mingw32/x64 (64-bit) 

下使用庫(RODBC),

channel <- odbcConnect(dsn = "database") 

ProcExec <- "execute LENGTHCOMP(2004)" 
# the procedure returns nothing, but creates a series of Oracle tables needed later in the R function 
sqlQuery(channel = channel, query = ProcExec, believeNRows = FALSE) 

odbcClose(channel) 

返回錯誤:

[1] "42000 0 [Oracle][ODBC]Syntax error or access violation."    
[2] "[RODBC] ERROR: Could not SQLExecDirect 'execute LENGTHCOMP(2004)'" . 

圖書館ROracle(2013年8月)表示

dbCallProc的方法 調用SQL存儲過程 說明 尚未實現。

他們的其他R包是否提供了在Oracle上調用存儲的PL/SQL過程的功能?或者有沒有辦法讓sqlQuery從RODBC包中完成它?

+0

我有同樣的問題。有沒有人找到答案或解決方法? – user3242449

回答

3

使用ROracle,我已經通過創建PLSQL函數成功包裹過程調用:

create or replace function Wrapper_func (Sql_in in varchar2) 
    return number 
    authid current_user 
as 
    pragma autonomous_transaction; 
begin 
    execute immediate Sql_in; 
    return 0; 
exception 
    when others then 
    return sqlcode; 
end Wrapper_func; 

此予選自R撥打:

sqldata<-dbGetQuery(con, "select wrapper_func ('begin proc_t(137); end;') from dual") 

如果procedurecall成功,該函數返回0 ,如果程序調用失敗,則返回錯誤代碼。該過程需要以current_user身份運行,因爲它將執行給它的任何sql。

正確的方法可能是用包裹的procedurecall的簽名相匹配的特定functioncalls所有procedurecall。這些函數不必是current_user,因爲它們只傳遞參數。

1

我試過上述方法從R調用過程,但是不能運行涉及函數的DML和DDL操作的過程。

我發現另一種方式來執行程序作爲sql語句,而不使用包裝函數。

語句< - 糊( 「開始PROC(1:1,:2,:3); END;」)

dbSendQuery(CON,語句,DF)或oracleProc(CON,語句,DF )

我在這裏使用了ROracle庫。

df是包含要在過程過程中傳遞的參數的數據幀。

希望它有幫助!