вызов Oracle хранимых процедур в R - как получить набор результатов? - PullRequest
6 голосов
/ 27 сентября 2011

Ищем пример для вызова хранимой процедуры Oracle с использованием R и возврата набора результатов.

Я использую библиотеку RJDBC, dbGetQuery для вызова процедур Sybase и указания результатов на переменную, и это работаетто же самое для Oracle выберите stmts.Однако я не вижу, как заставить это возвращать наборы результатов Oracle из хранимого процесса Oracle (т. Е. Из параметра sys_refcursor out).Единственные примеры, которые я нахожу для извлечения данных из Oracle, включают «выбор столбцов из таблицы».

Поиск в Google привел меня к « dbCallProc - вызов хранимой процедуры SQL », что звучит очень многообещающе, но каждый найденный им указатель указывает на то, что он " еще не реализован. "

Какие-нибудь указатели или примеры использования procs?Высоко ценится.Не знаю, почему Oracle всегда должна быть такой проблемой для получения наборов результатов ....

Спасибо, Майк

ОБНОВЛЕНИЕ : я бы взял примерэто просто называется хранимой процедурой Oracle.В настоящий момент в RJDBC не поддерживаются проки Oracle?

1 Ответ

3 голосов
/ 07 февраля 2012

Я не могу помочь вам конкретно с 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).

Надеюсь, это поможет.

...