2011-09-26 68 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中处理)。

希望有所帮助。

相关问题