2011-09-26 4 views
6

Cercare un esempio per chiamare Oracle stored proc utilizzando R e restituire un set di risultati.chiama Oracle stored procedure in R - come ottenere il set di risultati?

Sto usando la libreria RJDBC, dbGetQuery per chiamare i proc di Sybase e indirizzare i risultati a una variabile, e questo funziona allo stesso modo per gli stmts di Oracle selezionati. Tuttavia, non vedo come ottenere ciò per restituire i set di risultati Oracle da un processo memorizzato Oracle (ad esempio, dal parametro sys_refcursor out). Gli unici esempi che trovo per il recupero dei dati da Oracle riguardano "seleziona colonne dalla tabella".

Ricerca in google mi è stato condotto a "dbCallProc - Chiamare una stored procedure SQL", che suona molto promettente, ma ogni ref ho trovato ad esso indica che è

"Non ancora implementato." Eventuali puntatori o esempi per l'utilizzo di procs? Molto apprezzato. Non so perché Oracle deve essere sempre una sfida per il recupero di set di risultati ....

Grazie, Mike

UPDATE: mi piacerebbe prendere un esempio che chiama semplicemente un proc memorizzato Oracle . I proc di Oracle semplicemente non sono attualmente supportati in RJDBC?

+0

Se non è ancora implementato, probabilmente sei sfortunato. Hai provato a scaricare l'output in un file e a leggere il file in R? –

+0

Semplicemente non credevo di essere l'unica persona che voleva farlo, quindi ho pensato che mi mancasse qualcosa. Il dump del file è un'opzione - stavo anche pensando che potrei chiamare il proc in java e collegarlo al mio codice R con rJava. Ho ereditato del codice che ha chiamate di proc di Sybase dirette in R, e che funziona bene. Ora ci stiamo spostando su Oracle, e volevo solo cambiare le mie chiamate, ma non così semplice, a quanto pare. – Mike

+0

Da https://www.rforge.net/RJDBC/news.html: aggiungi il supporto per la sintassi JDBC chiamata di procedura memorizzata. Attualmente sono supportati solo i parametri IN ... –

risposta

3

Non posso aiutarti specificatamente con R, ma dici che stai riscontrando problemi nel chiamare le procedure Oracle che usano i parametri OUT come sys_refcursors. Indica anche che questa abilità potrebbe non essere ancora implementata. Si dice, tuttavia, che è possibile "selezionare le colonne dalla tabella" bene.

Quindi, propongo di modificare le procedure per le chiamate di funzione pipeline e quindi di effettuare una semplice selezione per ottenere i dati da Oracle. Un piccolo esempio:

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; 

Il corpo del pacchetto:

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; 

utilizzati:

select * from table(pkg1.get_recs(3)); 

Oppure:

select num, val from table(pkg1.get_recs(3)); 

Ciò ritorno 3 righe di dati, così come una procedura restituirebbe gli stessi dati. Solo in questo modo puoi ottenerlo da un'istruzione select (che sembri essere in grado di gestire da R).

Spero che questo aiuti.