寻找使用R调用Oracle存储过程并返回结果集的示例
我使用RJDBC库,dbGetQuery调用Sybase进程,并将结果指向一个变量,这对于Oracle select stmts也是一样的。然而,我不知道如何从Oracle存储过程(即sys_refcursor out参数)中返回Oracle结果集。我发现从Oracle中检索数据的唯一示例包括"select columns from table"。
在谷歌搜索导致我"dbCallProc -调用一个SQL存储过程"这听起来很有前途,但每一个参考我发现它表明它是"尚未实现。"
有使用过程的指针或例子吗?大大赞赏。不知道为什么在检索结果集时Oracle总是这么难....
谢谢,迈克
UPDATE:我举一个简单地称为Oracle存储过程的例子,Oracle进程是否在RJDBC中不被支持?
我不能帮助你具体与R,但你说你有问题在调用Oracle过程使用OUT参数作为sys_refcursors。您还指出此能力可能尚未实现。但是,您确实说过,您可以"从表中选择列"。
所以,我建议将过程更改为流水线函数调用,然后做一个简单的选择来从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中处理)。
希望对你有帮助。