Tôi không thể giúp bạn cụ thể với R, nhưng bạn nói rằng bạn đang gặp sự cố khi gọi các thủ tục Oracle sử dụng tham số OUT làm sys_refcursors. Bạn cũng cho biết khả năng này có thể chưa được thực hiện. Tuy nhiên, bạn nói rằng bạn có thể "chọn các cột từ bảng".
Vì vậy, tôi đề xuất thay đổi các thủ tục thành các lệnh gọi hàm pipelined, và sau đó thực hiện một lựa chọn đơn giản để lấy dữ liệu của bạn từ Oracle. Một ví dụ nhỏ:
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;
Nội dung gói:
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;
Cách sử dụng:
select * from table(pkg1.get_recs(3));
Hoặc:
select num, val from table(pkg1.get_recs(3));
Điều này sẽ trả về 3 hàng dữ liệu, giống như một thủ tục sẽ trả về cùng một dữ liệu. Chỉ bằng cách này, bạn có thể lấy nó từ một câu lệnh chọn (mà bạn dường như có thể xử lý từ R).
Hy vọng điều đó sẽ hữu ích.