2010-01-28 7 views
15

मैं वसंत के जेडीबीसी टेम्पलेट और स्टोर्डप्रोसेडर कक्षाओं का उपयोग कर रहा हूं। मुझे संग्रहीत प्रक्रिया वर्ग को मेरे लिए काम करने में परेशानी हो रही है।वसंत की संग्रहीत प्रक्रिया - प्रक्रिया से वापस आने वाले परिणाम हमेशा खाली

मेरे पास ऑरैकल डेटाबेस पर संग्रहीत प्रक्रिया है। उसके हस्ताक्षर

CREATE OR REPLACE PROCEDURE PRC_GET_USERS_BY_SECTION 
(user_cursor OUT Pkg_Types.cursor_type 
, section_option_in IN Varchar2 
, section_in IN Varchar2) AS .... 

वह जगह है जहाँ

TYPE cursor_type IS REF CURSOR; 

मैं ओरेकल प्रक्रिया

private class MyStoredProcedure extends StoredProcedure 
{ 
    public MyStoredProcedure(JdbcTemplate argJdbcTemplate) 
    { 
     super(argJdbcTemplate, "PRC_GET_USERS_BY_SECTION"); 
     declareParameter(new SqlOutParameter("output", OracleTypes.CURSOR)); 
     declareParameter(new SqlParameter("input1", Types.VARCHAR)); 
     declareParameter(new SqlParameter("input2", Types.VARCHAR)); 
     compile();   
    } 


    public Map<String, Object> execute() { 

     Map<String, Object> inParams = new HashMap<String, Object>(); 
     inParams.put("input1", "BG"); 
     inParams.put("input2", "FE"); 
     Map output = execute(inParams); 
     return output; 
    } 
} 

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

public List<String> getUserListFromProcedure() throws BatchManagerException 
{ 
    MyStoredProcedure sp = new MyStoredProcedure(this.jdbcTemplate); 
    Map<String, Object> result = new HashMap<String, Object>(); 
    try 
    { 
     result = sp.execute(); 
    } 

    catch(DataAccessException dae) 
    { 

    } 
    System.out.println(result.size()); 
    return null; 
} 

हालांकि मानचित्र का आकार हमेशा 0 है, इसलिए कुछ भी वापस नहीं आता है। मुझे पता है कि डेटाबेस पर पंक्तियां हैं जो मेरे इनपुट मानदंड से मेल खाते हैं। इसके अलावा मेरे पास कोड काम था जो ऑरैकल संग्रहित प्रो के साथ बातचीत करने के लिए java.sql.CallableStatement का उपयोग करता था - इसलिए proc अच्छी है। क्या स्प्रिंग की संग्रहीत प्रक्रिया के साथ OraceleTypes.CURSOR मिश्रण करना गलत है? मैं और क्या उपयोग कर सकता हूँ? मैंने SqlReturnResultSet भी कोशिश की और यह भी काम नहीं किया।

उत्तर

7

समस्या यह है कि ओरेकल का संग्रहित प्रक्रिया करने का तरीका जेडीबीसी का अनुपालन नहीं है। ओरेकल के एसपीएस आउटपुट डेटा को आउटपुट पैरामीटर या कर्सर वाले रिटर्न वैल्यू के माध्यम से लौटाते हैं, और उन्हें विशेष रूप से संभालना होगा। इसका मतलब है कि आप किसी भी वसंत की जेडीबीसी सामग्री का उपयोग नहीं कर सकते जो जेडीबीसी के अनुपालन को मानता है, आपको इसे स्वयं करना है।

व्यवहार में, यह आपके JdbcTemplate और CallableStatementCallback, जो आप आदर्श था की तरह तुलना में बहुत अधिक मैनुअल JDBC कोडिंग का मतलब का उपयोग करने के का मतलब है, लेकिन मैं अभी तक एक तरह से इस से बचने के लिए खोजने के लिए है।

थोड़ा सा तरफ, मुझे संदेह है कि जेडीबीसी स्पेक को सिब्स (और, एसोसिएशन, एसक्यूएल सर्वर द्वारा) चीजों को करने के तरीके के अनुरूप मिलकर लिखा गया था, क्योंकि जेडीबीसी में संग्रहित प्रक्रियाओं को संभालने का तरीका उल्लेखनीय है उन प्रणालियों के लिए अच्छा फिट (और ओरेकल के लिए एक गरीब फिट)।

+7

हाय, आपकी प्रतिक्रिया के लिए धन्यवाद। मुझे यह मेरी ओरेकल संग्रहीत प्रक्रिया के साथ काम कर रहा है। समस्या मेरे द्वारा घोषित आउटपुट पैरामीटर के साथ थी। निम्नलिखित काम करता है declareParameter (नई SqlOutParameter ("उत्पादन", oracle.jdbc.OracleTypes.CURSOR, नई RowMapper() {सार्वजनिक स्ट्रिंग mapRow (ResultSet argResults इंट argRowNum) फेंकता SQLException {वापसी argResults.getString (1);}})); यह अब मेरे लिए काम कर रहा है। धन्यवाद – aos

+2

आपको अपने प्रश्न का उत्तर देना चाहिए था और इसे स्वीकृत उत्तर के रूप में चुना जाना चाहिए था। वैसे भी पोस्ट करने के लिए धन्यवाद। –

4

समस्या सरल है यदि आप एक रोडर्सपर को पास नहीं करते हैं, जबकि एक सर्सर है। वसंत {} लौटने जा रहा है Ie खाली कर्सर।

declareParameter(new SqlOutParameter("output", OracleTypes.CURSOR)); - returns empty {} 
declareParameter(new SqlOutParameter("output", OracleTypes.CURSOR, new ApplicationMapper()); - returns result 

जहां एप्लिकेशनमैपर मेरा कस्टम मैपर है जो रोमैपर लागू करता है।

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