在R中调用Oracle存储过程 - 如何获取结果集?
问题描述:
寻找使用R调用Oracle存储过程并返回结果集的示例。在R中调用Oracle存储过程 - 如何获取结果集?
我正在使用RJDBC库,dbGetQuery来调用Sybase procs并将结果指向一个变量,并且这对于Oracle select stmts也是一样的。但是,我不明白如何从Oracle存储过程(即从sys_refcursor out参数)返回Oracle结果集。我发现从Oracle检索数据的唯一示例涉及“从表中选择列”。
在谷歌搜索是导致我“dbCallProc - 调用SQL存储过程”,这听起来非常有前途的,但每一个裁判,我发现这表明它是
“尚未实现”。任何使用特效的指针或例子?不胜感激。不知道为什么总是甲骨文已经成为检索结果集这样的挑战....
谢谢, 迈克
更新:我会采取简单地称为Oracle存储过程的例子。目前在RJDBC中Oracle procs是否不受支持?
答
我无法帮助您专门与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中处理)。
希望有所帮助。
如果还没有实施,那么你可能运气不好。你有没有尝试将输出转储到文件中,然后将文件读入R? – 2011-09-27 20:24:36
我只是不相信我是唯一想做这件事的人,所以我以为我错过了一些东西。文件转储是一个选项 - 我也想到我可以调用java中的proc并使用rJava将其链接到我的R代码。我继承了一些在R中有直接Sybase proc调用的代码,并且工作正常。现在我们正在转向甲骨文,我只是想换掉我的电话,但显然不是那么简单。 – Mike
从https://www.rforge.net/RJDBC/news.html:添加对存储过程调用JDBC语法的支持。目前仅支持IN参数... –