2008-11-10 8 views
14

ऑरैक टेबल में एक पंक्ति डालने का प्रयास करते समय मुझे अपवाद मिल रहा है। मैं ओरेकल 11 इस के लिए ojdbc5.jar उपयोग कर रहा हूँ एसक्यूएल मैंजेडीबीसी - ओरेकल ऐरेइंडेक्सऑटऑफबाउंड्स एक्सेप्शन

INSERT INTO rule_definitions(RULE_DEFINITION_SYS,rule_definition_type, 
rule_name,rule_text,rule_comment,rule_message,rule_condition,rule_active, 
rule_type,current_value,last_modified_by,last_modified_dttm, 
rule_category_sys,recheck_unit,recheck_period,trackable) 
VALUES(RULE_DEFINITIONS_SEQ.NEXTVAL,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) 

कोशिश कर रहा हूँ और मैं अपवाद निम्न मिलता है। किसी भी तरह की सहायता को आभार समझेंगे।

 
java.ljava.lang.ArrayIndexOutOfBoundsException: 15 
at oracle.jdbc.driver.OracleSql.computeBasicInfo(OracleSql.java:950) 
    at oracle.jdbc.driver.OracleSql.getSqlKind(OracleSql.java:623) 
    at oracle.jdbc.driver.OraclePreparedStatement.(OraclePreparedStatement.java:1212) 
    at oracle.jdbc.driver.T4CPreparedStatement.(T4CPreparedStatement.java:28) 
    at oracle.jdbc.driver.T4CDriverExtension.allocatePreparedStatement(T4CDriverExtension.java:68) 
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:3059) 
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:2961) 
    at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:5874) 
    at org.jboss.resource.adapter.jdbc.WrappedConnection.prepareStatement(WrappedConnection.java:232) 
    at com.gehcit.platform.cds.common.util.db.DBWrapper.executeInsertOracleReturnPK(DBWrapper.java:605) 
+0

मुझे लगता है कि आपको उस कोड को पेस्ट करना चाहिए जिसके साथ आप इस SQL ​​को निष्पादित कर रहे हैं। –

उत्तर

25

ओरेकल Metalink (Oracle की सहायता साइट - नोट आईडी 736273.1) में मैंने पाया कि इस JDBC अनुकूलक में एक बग (संस्करण 10.2 है .0.0.0 से 11.1.0.7.0) जब आप 7 से अधिक पोजीशनल पैरामीटर के साथ तैयार स्टेटमेंट को कॉल करते हैं तो जेडीबीसी इस त्रुटि को फेंक देगा।

यदि आपके पास ओरेकल मेटलिंक तक पहुंच है तो एक विकल्प वहां जाना और पैच डाउनलोड करना है।

अन्य समाधान समाधान नहीं है - उपयोग नामित बजाय मापदंडों स्थितीय पैरामीटर:

INSERT INTO rule_definitions(RULE_DEFINITION_SYS,rule_definition_type, 
rule_name,rule_text,rule_comment,rule_message,rule_condition,rule_active, 
rule_type,current_value,last_modified_by,last_modified_dttm, 
rule_category_sys,recheck_unit,recheck_period,trackable) 
VALUES(RULE_DEFINITIONS_SEQ.NEXTVAL,:rule_definition_type, 
:rule_name,:rule_text,:rule_comment,:rule_message,:rule_condition,:rule_active, 
:rule_type,:current_value,:last_modified_by,:last_modified_dttm, 
:rule_category_sys,:recheck_unit,:recheck_period,:trackable) 

और फिर

preparedStatement.setStringAtName("rule_definition_type", ...) 

आदि का उपयोग इस प्रश्न के लिए नामित किया गया बाँध चर सेट करने के लिए।

+3

यह ठीक काम करता है जब तक कि जेनरेट की जाने वाली कुंजियों को वापस करने की आवश्यकता नहीं होती है। कम से कम मुझे अभी भी यह त्रुटि मिलती है। मैं वसंत के टेम्पलेट का उपयोग कर रहा हूं: कीहोल्डर कुंजीहोल्डर = नया जेनरेटेड केहोल्डर(); एसक्लपैमरेटर स्रोत paramSource = नया बीनप्रॉपर्टीस्कल पैरामीटर स्रोत (आइटम); simpleJdbcTemplate.getNamedParameterJdbcOperations() अद्यतन (एसक्यूएल, paramSource, keyHolder, नया स्ट्रिंग [] {"id"}); कोई विचार? –

+0

मेटलिंक पैच अभी भी कुछ विशिष्ट मामलों में बग को ठीक नहीं करता है। उदाहरण के लिए यह क्वेरी न तो ocheddbc के साथ काम नहीं करती है और न ही हाल ही में ojdbc संस्करण (11.2.0.1.0): दो में से 1 का चयन करें जहां 1 (?,?,?,?,?,?,? ,?) और 1 =: foo हालांकि यह क्वेरी ठीक काम करती है: दो में से 1 चुनें (?,?,?,?,?,?,?) और 1 =: foo निष्कर्ष: डॉन इस विशेष समस्या से बचने के लिए स्थितित्मक और नामित पैरामीटर मिश्रण नहीं करें। – Misha

+0

@Raimonds क्या आप ओरेकल मेटलिंक यूआरएल प्रदान कर सकते हैं जहां से मैं पैच डाउनलोड कर सकता हूं? उस पैच को कैसे उगाया जाए? ऊपर वर्णित से एक और समाधान है –

0

कोड देखकर बिना, केवल एक चीज मैं के बारे में सोच सकते हैं यह देखना होगा कि प्रत्येक कनेक्शन एक धागा सुरक्षित तरीके से पहुँचा जा रहा है। ओरेकल ड्राइवर आमतौर पर काफी ठोस होते हैं। एकमात्र बार मैंने अजीब आंतरिक त्रुटियों को देखा है, जब आप एक ही कनेक्शन के उदाहरण तक पहुंचने वाले एक से अधिक थ्रेड प्राप्त कर चुके हैं और इसके साथ अजीब सामान कर रहे हैं। वे धागे सुरक्षित नहीं हैं, और एक धागे पर रखा जाना चाहिए।

0

यदि आप सही समझते हैं, तो आप 15 प्लेसहोल्डर्स के साथ एक तैयार कथन बनाते हैं। तो आपको कॉल में 15 पैरामीटर मानों के साथ एक सरणी पारित करने की आवश्यकता है। हो सकता है कि आप एक चूक गए हों या एक अधिशेष जोड़ा?

+0

या शायद एक अतिरिक्त ... – Elie

+0

मुझे लगता है कि यह भी एक अतिरिक्त है। – Fred

0

ऐसा लगता है कि आप पैरामीटर की गलत संख्या में गुजर रहे हैं। आपको 15 में गुजरना चाहिए, लेकिन आप या तो 16 या 14.

0

हाँ जब तक मेरा माउस-कर्सर-गिनती बंद न हो, आप 16 मानों को 16 कॉलम में डालने का प्रयास कर रहे हैं।

प्रयास करें एक ही बात sqlplus *, आप मिलना चाहिए ORA-00913: बहुत अधिक मान

+0

कथन में मूल्यों और कॉलमों की संख्या मेरी गिनती से मेल खाती है। –

0

जब आपके पास oracle.jdbc.PreparedStatement क्लास तक पहुंच नहीं है (और java.sql.PreparedStatement का उपयोग करने के लिए मजबूर किया जाता है, जो विधियों #setXXXAtName()) का समर्थन नहीं करता है, नामित पैरामीटर का उपयोग करने के लिए प्रस्तावित समाधान एक विकल्प नहीं है।

मैंने अनिवार्य मानों को पारित करने के लिए तैयार किए गए स्टेटमेंट और जेनरेटेड केहोल्डर दृष्टिकोण का उपयोग किया है (सौभाग्य से 7 से कम), और शेष मूल्यों के लिए एक सरल SQL अद्यतन जारी करने के लिए जेनरेट की गई प्राथमिक कुंजी का उपयोग किया गया।

0

मैं mybatis + oracle + spring + maven का उपयोग कर रहा हूं। पैरामीटर के ऊपर 8 (या) होने पर, "arrayindexoutofboundsexception" में एक ही त्रुटि है।

पोम में ojdbc14 के संस्करण ojdbc6 बदल गया है,

<dependency> 
     <groupId>com.oracle</groupId> 
     <artifactId>ojdbc14</artifactId> 
     <version>10.2.0.3.0</version> 
    </dependency> 

यह काम किया।