मुझे लगता है कि समस्या यह है कि आपका डेटाटाइप CHAR(9) है और "वाटरलू" में केवल 8 वर्ण हैं। मुझे लगता है कि यह अपेक्षित परिणाम (LIKE और%) लौटाएगा। या अनुपलब्ध स्थान जोड़ें।
String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo%");
ResultSet rs = prepStmt.executeQuery();
यदि आपके स्ट्रिंग्स की लचीली लंबाई है तो चार के बजाय वर्चर का उपयोग करने का सबसे अच्छा तरीका होगा। तब रेडीडस्टेटमेंट उम्मीद के मुताबिक काम करेगा।
Oracle विशिष्ट setFixedCHAR विधि का उपयोग करने के लिए एक समाधान होगा (लेकिन यदि संभव हो तो डेटाटाइप को varchar में बदलना बेहतर है)।
निम्नलिखित Oracle के रेडीडस्टेटमेंट JavaDoc से है:
डेटाबेस में CHAR डेटा को कॉलम की चौड़ाई में गद्देदार किया जाता है। यह सेलेक्ट स्टेटमेंट के WHERE क्लॉज में कैरेक्टर डेटा को बाइंड करने के लिए setCHAR () मेथड का उपयोग करने में एक सीमा की ओर जाता है - WHERE क्लॉज में कैरेक्टर डेटा को सेलेक्ट स्टेटमेंट में मैच बनाने के लिए कॉलम की चौड़ाई में भी पैड किया जाना चाहिए। यदि आप कॉलम की चौड़ाई नहीं जानते हैं तो यह विशेष रूप से परेशानी का सबब है।
setFixedCHAR() इसका समाधान करता है। यह विधि एक गैर-गद्देदार तुलना निष्पादित करती है।
नोट:
- सेटफिक्स्डचर () पद्धति का उपयोग करने के लिए अपने तैयार किए गए स्टेटमेंट ऑब्जेक्ट को OraclePreparedStatement पर डालना याद रखें।
- एक INSERT कथन के लिए setFixedCHAR() का उपयोग करने की कोई आवश्यकता नहीं है। डेटाबेस हमेशा कॉलम की चौड़ाई में डेटा को सम्मिलित करते ही स्वचालित रूप से पैड करता है।
निम्न उदाहरण setString (), setCHAR () और setFixedCHAR () विधियों के बीच अंतर को दर्शाता है।
// Schema is : create table my_table (col1 char(10));
// insert into my_table values ('JDBC');
PreparedStatement pstmt = conn.prepareStatement
("select count() from my_table where col1 = ?");
ResultSet rs;
pstmt.setString (1, "JDBC"); // Set the Bind Value
rs = pstmt.executeQuery(); // This does not match any row
// ... do something with rs
CHAR ch = new CHAR("JDBC ", null);
((OraclePreparedStatement)pstmt).setCHAR(1, ch); // Pad it to 10 bytes
rs = pstmt.executeQuery(); // This matches one row
// ... do something with rs
((OraclePreparedStatement)pstmt).setFixedCHAR(1, "JDBC");
rs = pstmt.executeQuery(); // This matches one row
// ... do something with rs