2011-09-26 6 views
6

आर का उपयोग करके ओरेकल संग्रहित प्रो को कॉल करने और परिणाम सेट को वापस करने के लिए एक उदाहरण की तलाश में है।आर में ओरेकल संग्रहीत प्रक्रियाओं को कॉल करना - परिणाम सेट कैसे प्राप्त करें?

मैं आरजेडीबीसी लाइब्रेरी का उपयोग कर रहा हूं, डीबीजीटीक्वियर सिबेज प्रोसेस को कॉल करने के लिए और परिणामों को एक चर पर इंगित करता हूं, और यह ओरेकल चुनिंदा स्टैम के लिए भी काम करता है। हालांकि, मैं नहीं देखता कि ओरेकल परिणाम सेट से ओरेकल परिणाम सेट को वापस करने के लिए इसे कैसे प्राप्त किया जाए (यानी, sys_refcursor out param से)। ओरेकल से डेटा पुनर्प्राप्त करने के लिए मुझे मिलने वाले एकमात्र उदाहरण "तालिका से कॉलम का चयन करें" शामिल हैं।

गूगल में सर्च कर रहे हैं मुझे नेतृत्व किया था करने के लिए - जो बहुत आशाजनक लगता है "dbCallProc एक SQL संग्रहित प्रक्रिया कॉल करें", लेकिन हर रेफरी मैं इसे करने के लिए मिला इंगित करता है कि यह है

"अभी तक लागू नहीं।" Procs का उपयोग करने के लिए कोई संकेतक या उदाहरण? अत्यधिक सराहनीय। पता नहीं क्यों ओरेकल हमेशा पुन: प्राप्त करने के लिए परिणाम सेट इस तरह के एक चुनौती हो गया है ....

धन्यवाद, माइक

अद्यतन: मैं एक उदाहरण है कि बस एक Oracle संग्रहीत proc बुलाया काफ़ी होगा । क्या ओरेकल प्रोसेस वर्तमान में आरजेडीबीसी में समर्थित नहीं हैं?

+0

यदि यह अभी तक लागू नहीं किया गया है, तो आप शायद भाग्य से बाहर हैं। क्या आपने आउटपुट को फ़ाइल में डंप करने का प्रयास किया है और फिर फ़ाइल को आर में पढ़ा है? –

+0

मुझे विश्वास नहीं था कि मैं अकेला व्यक्ति था जो ऐसा करना चाहता था, इसलिए सोचा कि मुझे कुछ याद आ रहा था। फ़ाइल डंप एक विकल्प है - मैं यह भी सोच रहा था कि मैं जावा में प्रो को कॉल कर सकता हूं और इसे आरजेवा के साथ अपने आर कोड से जोड़ सकता हूं। मुझे कुछ कोड विरासत में मिला है जिसमें आर में प्रत्यक्ष साइबेस प्रो कॉल है, और यह ठीक काम करता है। अब हम ओरेकल में जा रहे हैं, और मैं सिर्फ अपनी कॉल को स्वैप करना चाहता था, लेकिन जाहिर है कि इतना आसान नहीं। – Mike

+0

https://www.rforge.net/RJDBC/news.html से: संग्रहीत प्रक्रिया कॉल जेडीबीसी सिंटैक्स के लिए समर्थन जोड़ें। वर्तमान में केवल पैरामीटर समर्थित हैं ... –

उत्तर

3

मैं विशेष रूप से आर के साथ आपकी मदद नहीं कर सकता, लेकिन आप कहते हैं कि आपको ओरेकल प्रक्रियाओं को कॉल करने में समस्याएं हैं जो OUT पैरा को sys_refcursors के रूप में उपयोग करते हैं। आप यह भी संकेत देते हैं कि यह क्षमता अभी तक लागू नहीं की जा सकती है। हालांकि, आप कहते हैं कि आप "तालिका से कॉलम का चयन कर सकते हैं" ठीक है।

तो, मैं पाइपलाइन फ़ंक्शन कॉल की प्रक्रियाओं को बदलने का प्रस्ताव करता हूं, और फिर ओरेकल से अपना डेटा प्राप्त करने के लिए एक सरल चयन कर रहा हूं। एक छोटा सा उदाहरण:

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 पंक्तियों को वापस, बस के रूप में होगा एक प्रक्रिया एक ही डेटा वापस कर देगा। केवल इस तरह से आप इसे एक चुनिंदा कथन से प्राप्त कर सकते हैं (जिसे आप आर से संभालने में सक्षम हैं)।

उम्मीद है कि मदद करता है।

संबंधित मुद्दे

 संबंधित मुद्दे