ओजेडीबीसी की नौकरियों में से एक ओरेकल डेटा प्रकारों को जावा प्रकारों में मैप करना है।ओजेडीबीसी 7 जावा डेटा स्ट्रिंग में CHAR डेटा प्रकार क्यों नहीं डालता है?
हालांकि, हमने देखा है कि यदि हम CHAR
डेटा प्रकार देते हैं, तो यह java.lang.String
पर मैप नहीं किया गया है। इस व्यवहार को दिखा रहे संस्करण हैं: ओजेडीबीसी 7 v12.1.0.2 और ओजेडीबीसी 6 v12.1.0.1। पुराने संस्करणों ने वास्तव में CHAR
डेटा प्रकार को मानचित्र पर java.lang.String
पर मानचित्रित किया था।
गहराई से खुदाई करने पर, हमने पाया कि StructMetaData
ओजेडीबीसी के oracle.jdbc.driver
पैकेज के भीतर है जो ओरेकल डेटा प्रकार जावा टाइप मैपिंग में लागू करता है। इसमें एक विधि है: 'getColumnClassName (int arg0)' जो ध्यान देने योग्य है। हमने देखा है कि OJDBC v7 के लिए, मामलों java.lang.String
को मैप किया इस प्रकार हैं:
int arg1 = this.getColumnType(arg0);
switch (arg1) {
case -104:
return "oracle.sql.INTERVALDS";
case -103:
return "oracle.sql.INTERVALYM";
case -102:
return "oracle.sql.TIMESTAMPLTZ";
case -101:
return "oracle.sql.TIMESTAMPTZ";
case -15:
case -9:
case 12:
return "java.lang.String";
...
हालांकि, बड़े OJDBC कार्यान्वयन के भीतर, इसे इस तरह देखा:
int arg1 = this.getColumnType(arg0);
switch (arg1) {
case -104:
return "oracle.sql.INTERVALDS";
case -103:
return "oracle.sql.INTERVALYM";
case -102:
return "oracle.sql.TIMESTAMPLTZ";
case -101:
return "oracle.sql.TIMESTAMPTZ";
case -15:
case -9:
case 1:
case 12:
return "java.lang.String";
...
एक अतिरिक्त java.lang.String
को मैप किया मामला नहीं है बाद के मामले में जैसे। 'मामला एक'। यह 'केस 1' ऊपर दिखाए गए पहले कोड स्निपेट में java.lang.String
पर मैप नहीं किया गया है।
public String getColumnTypeName(int arg0) throws SQLException {
int arg1 = this.getColumnType(arg0);
int arg2 = this.getValidColumnIndex(arg0);
switch (arg1) {
case -104:
return "INTERVALDS";
case -103:
return "INTERVALYM";
case -102:
return "TIMESTAMP WITH LOCAL TIME ZONE";
case -101:
return "TIMESTAMP WITH TIME ZONE";
case -15:
return "NCHAR";
case -13:
return "BFILE";
case -9:
return "NVARCHAR";
case -2:
return "RAW";
case 1:
return "CHAR";
...
इस वजह से
, हम OJDBC 7 या OJDBC6 v12.1.0.1 का उपयोग करता है, तो:
गहरी देख पर, यह 'मामले 1' एक ही StructMetaData
वर्ग के getColumnTypeName(int arg0)
विधि के भीतर CHAR
को मैप किया है और CHAR
एक स्तंभ के लिए डेटा प्रकार के रूप में निर्दिष्ट है, तो निम्न कोड इस स्तंभ के सूचकांक के लिए मंगलाचरण पर रिटर्न null
:
for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
...
resultSetMetaData.getColumnClassName(columnIndex)
...
अगर मैं (उदाहरण के लिए OJDBC जार के एक पुराने संस्करण की जगह: 11.2.0.3), फिर एक ही कोड देता है: java.lang.String
। क्या यह एक बग है या इसे डिजाइन द्वारा हटा दिया गया है? क्या किसी को भी पहले एक ही समस्या का सामना करना पड़ा है?
क्या आपने ड्राइवर के रिलीज नोट्स की जांच की है? अगर आपको लगता है कि यह गलत है, तो मेरा ओरेकल समर्थन के साथ एक एसआर खोलें। मैं पेशकश किए गए समाधान से सबसे ज्यादा खुश था। –