2014-10-01 17 views
5

मैं एक संग्रहीत प्रक्रिया है जिससे की तरह लग रहा है:जावा से संग्रहित प्रक्रिया% ROWTYPE एक्सेस करना

PROCEDURE get_curx( p_buf  IN ni_imsi%ROWTYPE, 
         p_bufx IN ni_imsi%ROWTYPE, 
         p_cur  OUT CurTyp, 
         p_where IN VARCHAR2 DEFAULT '', 
         p_orderby IN VARCHAR2 DEFAULT '', 
         p_max  IN NUMBER DEFAULT 0, 
         p_lock IN NUMBER DEFAULT 0, 
         p_hint IN VARCHAR2 DEFAULT 'NONE', 
         p_debug IN NUMBER DEFAULT 0, 
         p_count IN BOOLEAN DEFAULT FALSE); 

मैं इस की तरह एक जावा प्रोग्राम से इस प्रक्रिया बोल रहा हूँ:

CallableStatement cs = connection.prepareCall("{call ni_imsi_pkg.get_curx(?,?,?,?,?,?)}"); 

      cs.setObject(1, ?); // i have no clue what to mention here 
      cs.setObject(2, ?); //i have no clue what to mention here 

      cs.registerOutParameter(3, OracleTypes.CURSOR); 
      cs.setString(4, " WHERE current_state = 60000 AND rownum <= 2 "); 
      cs.setString(5, " ORDER BY imsi_number"); 
      cs.setInt(6, 5); 

लेकिन मुझे नहीं पता कि पहले दो पैरामीटर कैसे सेट करें। कृपया मेरी मदद करें। धन्यवाद

+0

आप उन चरों में क्या रखना चाहते हैं, या वे कहां से आ रहे हैं और जावा पक्ष पर किस प्रकार की वस्तुएं हैं? –

+0

मुझे संदेह है कि आप इसे जेडीबीसी से कॉल कर सकते हैं। रोटाइप पीएल/एसक्यूएल विशिष्ट है। यह शायद कहीं पैकेज में परिभाषित किया गया था। आपको शायद पीएल/एसक्यूएल में एक सहायक प्रक्रिया बनाने/कॉल करने की आवश्यकता होगी जिसे उचित कक्षाओं के साथ आपके लिए इस कक्षा कहा जाता है। – Mike

उत्तर

4

जैसा कि माइक ने कहा था, आप सीधे जेडीबीसी कॉल में एक पंक्ति प्रकार का संदर्भ नहीं दे सकते हैं, क्योंकि पंक्ति प्रकार केवल पीएल/एसक्यूएल के भीतर मान्य हैं और ड्राइवर द्वारा उपयोग किए जाने वाले सभी प्रकारों को एसक्यूएल स्तर पर परिभाषित किया जाना है।

आप अपने स्वयं के एसक्यूएल ऑब्जेक्ट प्रकार को परिभाषित कर सकते हैं जो आपकी टेबल संरचना को छायांकित करता है (जिसे आपको तालिका में बदल दिया गया है, तो अपडेट करने के लिए आपको याद रखना होगा), और एक रैपर प्रक्रिया जो उस प्रकार को लेती है और इसे आपके कॉल में परिवर्तित करती है वास्तविक प्रक्रिया यह एक डेमो दोहरी पर आधारित है, के बाद से मैं अपने वास्तविक तालिका संरचना पता नहीं है:

// Object array containing the values corresponding to your row type 
Object[] rowObj = { "X" }; 
// Struct based on the SQL type you created 
StructDescriptor structDesc = StructDescriptor.createDescriptor("NI_IMSI_ROWTYPE", conn); 
STRUCT rowStruct = new STRUCT(structDesc, conn, rowObj); 

// Call wrapper function instead of real one 
cs = conn.prepareCall("{ call ni_imsi_pkg.get_curx_wrapper(?,?) }"); 
// Pass the struct defined earlier 
cs.setObject(1, rowStruct); 
cs.registerOutParameter(2, OracleTypes.CURSOR); 
// and other arguments for your real calll 

आप हैं:

create type ni_imsi_rowtype as object (dummy varchar2(1)) -- use your real table's columns/types 
/

create package ni_imsi_pkg as 
    procedure get_curx(p_buf dual%rowtype, p_cur out sys_refcursor); 
    procedure get_curx_wrapper(p_buf ni_imsi_rowtype, p_cur out sys_refcursor); 
end ni_imsi_pkg; 
/

create package body ni_imsi_pkg as 
    -- original procedure, simplified for demo 
    procedure get_curx(p_buf dual%rowtype, p_cur out sys_refcursor) is 
    begin 
    open p_cur for select * from dual where dummy = p_buf.dummy; 
    end; 

    -- wrapper procedure taking new type instead of rowtype 
    procedure get_curx_wrapper(p_buf ni_imsi_rowtype, p_cur out sys_refcursor) is 
    l_buf dual%rowtype; 
    begin 
    l_buf.dummy := p_buf.dummy; 
    get_curx(l_buf, p_cur); 
    end; 
end ni_imsi_pkg; 
/
फिर जावा ओर आप पॉप्युलेट और एक struct के रूप में इस पर भेज सकते हैं

अपने असली पैकेज को संशोधित नहीं कर सकता है तो आप रैपर, या एक साधारण प्रक्रिया के लिए एक नया बना सकते हैं; या आप भी, एक गुमनाम ब्लॉक में रूपांतरण कर सकता है कि हालांकि जावा कोड और अधिक जटिल बना देता है:

cs = (OracleCallableStatement) conn.prepareCall(
    "declare l_typ ni_imsi_rowtype; l_buf dual%rowtype; " 
     + "begin l_typ := ?; l_buf.dummy := l_typ.dummy; ni_imsi_pkg.get_curx(l_buf, ?); " 
     + "end;" 
); 

... अब भी वही struct बंधन इतना एसक्यूएल प्रकार अभी भी आवश्यक है। केवल कथन बदलता है, लेकिन अब यह एक रैपर के बिना मूल प्रक्रिया को कॉल कर सकता है।

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