मैं अपनी गर्दन बाहर रखने जा रहा हूं और कहता हूं कि वर्चर (30) इंडेक्स द्वारा VARCHAR(30)
के रूप में घोषित डेटाटाइप तक पहुंचने का कोई सीधा तरीका नहीं है। JDBC से।
Oracle JDBC दस्तावेज़
सहयोगी सरणी के तत्व प्रकार का उल्लेख करता है (यानी पहला varchar(30)
आपके प्रकार में) विभिन्न स्थानों पर, लेकिन जहां तक मैं देख सकता हूं यह कुंजी डेटाटाइप के बारे में कुछ नहीं कहता है। इसके अलावा, प्रलेखन में उल्लेख किया गया है कि सहयोगी सरणियों को जावा सरणियों के रूप में पारित किया जाता है और वापस किया जाता है। इससे मुझे संदेह होता है कि Oracle JDBC केवल BINARY_INTEGER
के साथ सहयोगी सरणियों का समर्थन करता है कुंजी डेटाटाइप के रूप में।
इसलिए, यदि आप VARCHAR2
के साथ PL/SQL सहयोगी सरणी में डेटा एक्सेस करना चाहते हैं JDBC की कुंजियाँ, मैं पहले डेटा को किसी अन्य डेटाटाइप में बदलने की अनुशंसा करता हूँ।
हालांकि, मुझे उम्मीद है कि आपके द्वारा लिखा गया जेडीबीसी कोड आपके सहयोगी सरणी को BINARY_INTEGER
के साथ संभाल लेगा। कुंजियाँ, एक बार जब आप OracleTypes.VARCHAR
change बदलते हैं OracleTypes.NUMERIC
. के लिए आपके कॉल में registerIndexTableOutParameter
. ध्यान रखें कि लौटाए गए जावा सरणी में सबसे बड़े कुंजी मान के रूप में कई तत्व होंगे, इसलिए सुनिश्चित करें कि तत्वों की अधिकतम संख्या (दूसरा पैरामीटर registerIndexTableOutParameter
है) ) इसके लिए काफी बड़ा है। यह भी सुनिश्चित करें कि साहचर्य सरणी में कोई नकारात्मक या शून्य कुंजियाँ नहीं हैं क्योंकि JDBC ड्राइवर इनका समर्थन नहीं करता है।
संदर्भ के लिए, यहां वह कोड है जिसका उपयोग मैं साहचर्य सरणियों के रूप में घोषित करने के लिए करता था INDEX BYNARY_INTEGER
कार्यरत। सबसे पहले, PL/SQL पैकेज और बॉडी:
पैकेज टेस्टलुकएसाइड को इस प्रकार बनाएं या बदलें कि AsocArry बाइनरी_इन्टेगर द्वारा INDEX नंबर की तालिका है; फंक्शन लुकअपमास्टरडेटा रिटर्न AssocArry;एंड टेस्टलुकएसाइड;/पैकेज बॉडी टेस्टलुकएसाइड को फंक्शन लुकअप के रूप में बनाएं या बदलेंMasterData रिटर्न AssocArry को retval AssocArry के रूप में; रिटवल शुरू करें(2) :=1; रिटवल(4) :=2; रिटवल(7) :=3; रिटवल(1) :=4; वापसी वापसी; एंड लुकअपमास्टरडेटा;एंड टेस्टलुकएसाइड;/
दूसरा, जावा वर्ग:
आयात करें स्ट्रिंग [] args) अपवाद फेंकता है {कनेक्शन c =DriverManager.getConnection ("url", "उपयोगकर्ता", "पासवर्ड"); OracleCallableStatement s =(OracleCallableStatement)c.prepareCall("{? =कॉल testLookAside.lookupMasterData}"); s.registerIndexTableOutParameter(1, 30, OracleTypes.NUMERIC, 0); s.execute (); BigDecimal [] डेटा =(बिगडेसिमल []) s.getPlsqlIndexTable(1); System.out.println (Arrays.toString (डेटा)); }}जब मैं जावा क्लास चलाता हूं, तो मुझे निम्न आउटपुट मिलता है:
[4, 1, null, 2, null, null, 3]