2011-09-26 12 views
6

Buscando un ejemplo para llamar a Oracle almacenado proc usando R, y devolviendo un conjunto de resultados.llamando procedimientos almacenados de Oracle en R - ¿cómo obtener el conjunto de resultados?

Estoy usando la biblioteca RJDBC, dbGetQuery para llamar a los procesos de Sybase y apuntar los resultados a una variable, y esto funciona igual para los stmts de selección de Oracle. Sin embargo, no veo cómo hacer para devolver conjuntos de resultados de Oracle desde un proceso almacenado de Oracle (es decir, desde el parámetro sys_refcursor out). Los únicos ejemplos que encuentro para recuperar datos de Oracle implican "seleccionar columnas de la tabla".

Buscando en google me fue dirigido a "dbCallProc - Llamar a un procedimiento almacenado de SQL", que suena muy prometedor, pero cada ref encontré a ella indica que es

"aún no implementadas." ¿Alguna sugerencia o ejemplos para usar procs? Apreciado enormemente. No sé por qué Oracle siempre tiene que ser un reto para recuperar conjuntos de resultados ....

Gracias, Mike

ACTUALIZACIÓN: Me gustaría tener un ejemplo que llama simplemente un proc almacenado de Oracle . ¿Los procesos de Oracle simplemente no son compatibles actualmente en RJDBC?

+0

Si aún no está implementado, entonces probablemente no tenga suerte. ¿Has intentado volcar la salida a un archivo y luego leer el archivo en R? –

+0

Simplemente no creía que fuera la única persona que quería hacer esto, así que pensé que me estaba perdiendo algo. El volcado de archivos es una opción; también pensaba que podía llamar al proceso en Java y vincularlo a mi código R con rJava. Heredé un código que tiene llamadas de procuración directas de Sybase en R, y eso funciona bien. Ahora nos estamos moviendo a Oracle, y solo quería cambiar mis llamadas, pero no tan simple, al parecer. – Mike

+0

desde https://www.rforge.net/RJDBC/news.html: agregue compatibilidad con la sintaxis de JDBC de llamadas a procedimientos almacenados. Actualmente, solo los parámetros IN son compatibles ... –

Respuesta

3

No puedo ayudarte específicamente con R, pero dices que tienes problemas para invocar procedimientos de Oracle que usan parámetros OUT como sys_refcursors. También indica que esta habilidad aún no puede implementarse. Sin embargo, dices que puedes "seleccionar columnas de la tabla" bien.

Por lo tanto, propongo cambiar los procedimientos a las llamadas a funciones segmentadas, y luego hacer una simple selección para obtener sus datos de Oracle. Un pequeño ejemplo:

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; 

El cuerpo del paquete:

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; 

Uso:

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

O:

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

Esto volvería 3 filas de datos, al igual que un procedimiento devolvería los mismos datos. Solo así puede obtenerlo a partir de una declaración seleccionada (que parece ser capaz de manejar desde R).

Espero que ayude.

Cuestiones relacionadas