2012-11-13 9 views
8

में डबल मान डालने का प्रयास करते समय SQLException मुझे एक छोटा प्रोग्राम विकसित करना है जो कुछ डेटा को ओरेकल डेटाबेस में सम्मिलित करता है। दुर्भाग्यवश मुझे SQL Statement और इसके निष्पादन के साथ कुछ परेशानी है। इस कोड मैं का उपयोग कर रहा है:OQcle डेटाबेस

db.execute(
    String.format("INSERT INTO tops VALUES (%d, '%s', %d, %f.00, '%s', TO_TIMESTAMP('%s', 'YYYY-MM-DD HH24:MI:SS.FF'))", 
     item.getID(), 
     item.getTitle(), 
     this.elements, 
     item.getSize(), 
     item.getEntity(), 
     timestamp.toString())); 

यह हिस्सा जहां निष्पादन काम करना चाहिए है, लेकिन मैं निम्नलिखित त्रुटि मिलती है:

java.sql.SQLException: ORA-00913: Zu viele Werte 

Google Translate अपवाद के लिए है:

java.sql.SQLException: ORA-00913: Too many values 
+0

मुझे लगता है कि आप स्ट्रिंग मानों से उद्धरण छोड़ सकते हैं। –

+3

उन मानों की तरह लगता है जिन्हें आप सम्मिलित करना चाहते हैं, तालिका स्कीमा से मेल नहीं खाते हैं। (बहुत अधिक मान) – MicSim

+11

उपयोग विवरण तैयार, स्ट्रिंग परिवर्तन एक बहुत बुरा विचार – Guillaume

उत्तर

5

के किसी भी था आप इस तरह से तैयार बयान के रूप में उपयोग कर सकते हैं ने सुझाव दिया टिप्पणी पर Guallaume;

PreparedStatement pstmt = null; 
Connection conn = null; 

try{ 
    //if you have a method that creates a connection for you. 
    conn = getConnection(); 
    pstmt = conn.prepareStatement("INSERT INTO tops(id, title, elements, size, entity, timeStamp) VALUES(?,?,?,?,?,?)"); 
    pstmt.setInt(1,item.getID()); 

    //Assuming that title is a String data type 
    pstmt.setString(2,item.getTitle()); 
    pstmt.setString(3,this.elements); 
    pstmt.setDouble(4,item.getSize()); // <--- JDBC will make sure this works 

    //assuming Entity data type is String 
    pstmt.setString(5,item.getEntity()); 

    //if your timestamp's string format is 
    //well formed, you may insert as a string. 
    pstmt.setString(6,timestamp.toString()); 
    pstmt.executeUpdate(); 
}catch(Exception e){ 
    e.printStackTrace(); 
}finally{ 
    try{ 
     pstmt.close(); 
    }catch(Exception e){} 

    try{ 
     conn.close(); 
    }catch(Exception e){} 
} 
+0

मुझे उम्मीद है कि गठन थोड़ा बेहतर होगा। जैसा कि आप देख सकते हैं, आपको अपने तैयार कथन क्वेरी में मान डालने के लिए कॉलम नामों को जानना होगा। जैसे 'सम्मिलित सबसे ऊपर (आईडी, शीर्षक, तत्वों, आकार, इकाई, टाइमस्टैम्प) मूल्यों (?,?,?,?,?,?)" 'कॉलम यहाँ मैं मान लिया आईडी, शीर्षक, elemets, आकार, इकाई और कर रहे हैं जांच टाइमस्टैम्प। और 'मूल्य (?,?,?,?,?,?)' जावा बताता है कि मूल्य वहां होंगे। 'pstmt.setInt (1, item.getID());' पहला मान सेट करता है, 'pstmt.setString (2, item.getTitle());' दूसरा मान, 'pstmt.setString (3, this.elements) बनाया;' 3 मूल्य सेट और इतने पर ... – mwangi

+0

अपने जवाब के लिए धन्यवाद। यह काम करता है graet –

+0

में आपका स्वागत है पैट्रिक :) – mwangi

3

इस वाक्यविन्यास का उपयोग न करें

INSERT INTO table VALUES (val1, val2, ...) 

उपयोग इस एक के बजाय

INSERT INTO table (col1, col2, ...) VALUES (val1, val2, ...) 

टेबल्स बदल सकते हैं। फ़ील्ड को जोड़ा/हटाया/पुन: व्यवस्थित किया जा सकता है - जिसके मामले में आपका INSERT कथन फिर से टूट जाएगा।

बेशक, के रूप में अन्य सुझाव है, तो आप तैयार बयान का उपयोग करना चाहिए एसक्यूएल इंजेक्शन और वाक्यविन्यास त्रुटियों से बचने के लिए ... कल्पना कीजिए, item.getTitle() इन

"a', 'b"; 
"a'); DROP TABLE tops;' ..."; 
1

आप वास्तव में PreparedStatements का उपयोग करना चाहिए, हमें ...

मानना ​​है कि इस मामले में, हालांकि, समस्या बहुत संभव है, आपके क्षेत्र दशमलव बिंदु के लिए अल्पविराम (,) चरित्र का उपयोग करता है ..

तो 1/4 बन जाता है: 0,25, 0.25 नहीं, क्योंकि डीबी चाहेंगे!

यह समस्या क्यों है? इस पर

देखो:

INSERT INTO SOMETABLE VALUES (0,25); 
INSERT INTO SOMETABLE VALUES (0, 25); 

दोनों मूल्यों होने के रूप में इलाज कर रहे हैं, बस पहले एक हमारे लिए स्पष्ट है, जो एक दशमलव बिंदु के रूप में अल्पविराम का उपयोग नहीं है ... तो तुम करने के लिए है कॉमा को एक बिंदु में बदलें, या लोकेल को यूएस में बदलें।

सही:

INSERT INTO SOMETABLE VALUES (0.25); 

आप स्ट्रिंग एक उपयुक्त स्थान की आपूर्ति करके String.format(Locale l, String format, Object... args) का उपयोग कर स्वरूपण की भाषा निर्दिष्ट कर सकते हैं।

+0

+1:।! अच्छा यह सोच कर कि यह संभव है ... –

+0

@LukasEder मैं एक प्रतिभाशाली नहीं कर रहा हूँ - मैं सिर्फ अजीब मुद्दों की एक बहुत कुछ के साथ :) यहाँ हंगरी में सामना करना पड़ा, हम अल्पविराम को दशमलव बिंदु के रूप में भी उपयोग करते हैं ... (मैंने अपने सबसे सम्मानित सहकर्मियों के सामने भी कुछ _non-राजनीतिक रूप से सही अभिव्यक्तियों को जोर से कहा था, जब मुझे पहली बार पता चला कि यह स्थिति परेशानियों का कारण बन सकती है ...) – ppeterka

+0

हां थीस कीड़े के ई प्रकार बनाने के "WTF-स्थितियों" ... –

0

इस प्रारूप स्ट्रिंग को सही किया गया।

"INSERT INTO tops VALUES (%f, '%s', %f, %.2f, '%s', TO_TIMESTAMP('%s', 'YYYY-MM-DD HH24:MI:SS.FF'))" 

प्रत्येक तर्क के लिए कई मानों का उपयोग न करें, प्रत्येक के लिए बिल्कुल एक का उपयोग करें, कुल छह मान।