मेरा मुद्दा भी ऐसा ही था। मुझे लगता है कि यह Oracle JDBC 7 ड्राइवर (ojdbc7.jar) में एक बग है। बग रेडीस्टेटमेंट.getParameterMetaData पद्धति में हो सकता है।
इस विधि का उपयोग Apache DBUtils द्वारा आंतरिक रूप से किया जाता है। तो यह DBUtils का बग नहीं होगा, बल्कि Oracle 12c के साथ वितरित Oracle JDBC ड्राइवर का एक बग होगा।
यदि आप Oracle 11g ojdbc6.jar ड्राइवर का उपयोग करते हैं तो वही क्वेरी शायद ठीक काम करेगी। इसने कम से कम मेरे लिए काम किया।
यदि आप यह देखना चाहते हैं कि कैसे Oracle ojdbc7.jar ड्राइवर द्वारा आंतरिक रूप से क्वेरी को गलत तरीके से संसाधित किया जाता है, तो आप oracle.jdbc.driver.OracleParameterMetaDataParser वर्ग में शामिल मुख्य विधि का उपयोग कर सकते हैं। इसे आजमाएं:
उदा.
आउटपुट आपका SQL वाक्य पार्स किया गया है और एक SQL क्वेरी में परिवर्तित किया गया है जिसका उपयोग ड्राइवर द्वारा पैरामीटर डेटाटाइप की पहचान करने के लिए आंतरिक रूप से किया जाता है:
लेकिन जैसा कि आप नमूने में देख सकते हैं, FIRSTNAME को गलत तरीके से "F" के रूप में पार्स किया गया है।
आपके द्वारा अपने प्रश्न में डाले गए प्रश्नों में से एक का उपयोग करके, परिणाम यह है कि पैरामीटर में से एक गायब हो जाता है ... इसलिए पार्सर "5" पैराम्स कहता है लेकिन डेटाटाइप प्राप्त करने के लिए उपयोग की जाने वाली आंतरिक क्वेरी वास्तव में केवल "4" है SELECT से चला गया)।
आउटपुट:
इसे कैसे जोड़ेंगे? पता नहीं, लेकिन जैसा कि मैंने ऊपर कहा, Oracle 11g ojdbc6.jar ड्राइवर का उपयोग करते हुए, वही क्वेरी काम करती है (यहां तक कि Oracle 12c डेटाबेस से कनेक्ट होने पर भी...)।
व्यवहार काफी यादृच्छिक है। ऐसा लगता है कि यह अद्यतन में प्रयुक्त कॉलम के पहले अक्षर पर निर्भर करता है। अगर यह एफ से शुरू होता है और एच हमेशा विफल रहता है, लेकिन मुझे नहीं पता कि कोई अन्य शर्त है या नहीं।