2011-09-26 70 views
6

尋找使用R調用Oracle存儲過程並返回結果集的示例。在R中調用Oracle存儲過程 - 如何獲取結果集?

我正在使用RJDBC庫,dbGetQuery來調用Sybase procs並將結果指向一個變量,並且這對於Oracle select stmts也是一樣的。但是,我不明白如何從Oracle存儲過程(即從sys_refcursor out參數)返回Oracle結果集。我發現從Oracle檢索數據的唯一示例涉及「從表中選擇列」。

在谷歌搜索是導致我「dbCallProc - 調用SQL存儲過程」,這聽起來非常有前途的,但每一個裁判,我發現這表明它是

尚未實現」。任何使用特效的指針或例子?不勝感激。不知道爲什麼總是甲骨文已經成爲檢索結果集這樣的挑戰....

謝謝, 邁克

更新:我會採取簡單地稱爲Oracle存儲過程的例子。目前在RJDBC中Oracle procs是否不受支持?

+0

如果還沒有實施,那麼你可能運氣不好。你有沒有嘗試將輸出轉儲到文件中,然後將文件讀入R? – 2011-09-27 20:24:36

+0

我只是不相信我是唯一想做這件事的人,所以我以爲我錯過了一些東西。文件轉儲是一個選項 - 我也想到我可以調用java中的proc並使用rJava將其鏈接到我的R代碼。我繼承了一些在R中有直接Sybase proc調用的代碼,並且工作正常。現在我們正在轉向甲骨文,我只是想換掉我的電話,但顯然不是那麼簡單。 – Mike

+0

從https://www.rforge.net/RJDBC/news.html:添加對存儲過程調用JDBC語法的支持。目前僅支持IN參數... –

回答

3

我無法幫助您專門與R,但您說您在調用使用OUT params作爲sys_refcursors的Oracle過程時遇到問題。你也表示這個能力可能還沒有實現。不過,你確實可以說,你可以「從表格中選擇列」就好了。因此,我建議將程序更改爲流水線函數調用,然後執行簡單的選擇以從Oracle獲取數據。一個小例子:

CREATE OR REPLACE package pkg1 as 

    type t_my_rec is record 
    (
    num my_table.num%type, 
    val my_table.val%type 
); 

    type t_my_tab is table of t_my_rec; 

    function get_recs(i_rownum in number) 
     return t_my_tab 
     pipelined; 

END pkg1; 

封裝體:

create or replace package body pkg1 as 

    function get_recs(i_rownum in number) 
     return t_my_tab 
     pipelined 
    IS 
    my_rec t_my_rec; 
    begin 

    -- get some data 
    -- implement same business logic as in procedure 
    for my_rec in (select num, val from my_table where rownum <= i_rownum) 
    loop 
     pipe row(my_rec); 
    end loop; 
    return; 

    end get_recs; 

end pkg1; 

用法:

select * from table(pkg1.get_recs(3)); 

或者:

select num, val from table(pkg1.get_recs(3)); 

這將返回3行數據,就像一個過程將返回相同的數據。只有這樣,你才能從select語句中獲得它(你似乎可以從R中處理)。

希望有所幫助。

相關問題