2013-01-09 19 views
7

निष्पादित किए बिना परिणामसेट के कॉलम नामों को लौटाना मुझे आश्चर्य है कि परिणाम सेट के कॉलम नाम (जावा में ओरेकल डेटाबेस,) को वापस करने का कोई तरीका है जो उत्पन्न होगा IF I वास्तव में एक प्रश्न निष्पादित किया। उदाहरण के लिए, कहते हैं कि मैं एसक्यूएल कुछ इस तरह लग रही थी:वास्तव में क्वेरी (ओरेकल और जावा)

select * from <complex table join>; 

वहाँ ओरेकल को यह क्वेरी भेजने के लिए एक रास्ता है और यह मुझे बताओ क्या स्तंभ नाम परिणाम पर हैं सेट यह वास्तव में प्रदर्शन के बिना वापस आ जाएगी है क्वेरी (क्योंकि यह महंगा है)?

+0

मुश्किल सवाल का अनुरोध के साथ में जानना चाहते हैं, जटिल तालिका –

+0

@mpettis में शामिल होने को संशोधित करता है: मैं अपने जवाब को नवीनीकृत किया है ... क्या आपको उसमें अपना समाधान मिला? – Parth

+0

@codeMaker: उत्तर के लिए धन्यवाद ... मैंने नीचे आपके उत्तर पर टिप्पणी की है। संक्षेप में यह है कि मुझे काम करने के लिए 'getMetaData' नहीं मिल रहा है, और मुझे यकीन नहीं है कि मेरा डीबी ड्राइवर उस कॉल के साथ काम करता है ... – mpettis

उत्तर

2

आप जहां 1 = 0 किसी भी पंक्तियों को लाते समय से रोकने के लिए एक बाहरी चयन में क्वेरी लपेटकर और जोड़ने की कोशिश कर सकते हैं:

SELECT * from (
    <your query here> 
) 
    WHERE 1=0 
+0

के रूप में एक ही ड्राइवर संस्करण बहुत अच्छी तरह से हो सकता है यह काम करता है, और मैंने केवल छोटे, सस्ते प्रश्नों पर इसका परीक्षण किया है। ओरेकल के क्वेरी विश्लेषक से परिचित नहीं है, मैं सिर्फ यह पुष्टि करना चाहता हूं कि <आपकी क्वेरी यहां> अनुभाग वास्तव में निष्पादित नहीं है और 'जहां 1 = 0' अनुभाग के कारण त्याग दिया गया है।तो, क्या यह सच है कि <आपकी क्वेरी यहां> वास्तव में परिणाम पुनर्प्राप्त नहीं करेगी और उन्हें बाहरी 'कहां' कथन में छोड़ दिया जाएगा? – mpettis

+0

मैं यह समाधान ले रहा हूं क्योंकि यह अंतर्निहित जेडीबीसी चालक से स्वतंत्र काम करता है। धन्यवाद फ्रैंक और हर कोई जिसने उत्तर दिया! – mpettis

11

मैं एक PreparedStatement का उपयोग कर काम कर सकता था लगता है:

PreparedStatement stmt = connection.prepareStatement("select ..."); 
ResultSetMetaData meta = stmt.getMetaData(); 
for (int col=0; col < meta.getColumnCount(); col++) 
{ 
    System.out.println("Column: " + meta.getColumnName(col + 1)); 
} 

(संपादित): मैं Oracle 11.2 और ड्राइवर को संस्करण 11.2.0.3 के साथ इस की कोशिश की और यह काम करता है।

यदि यह विफल हो जाता है तो आप क्वेरी में where 1=0 जोड़ सकते हैं और फिर इसे निष्पादित कर सकते हैं। कम से कम यह सभी पंक्तियों को वापस नहीं करेगा (संभवतः Statement.setMaxRows() का उपयोग करके, सुनिश्चित करने के लिए भी।

अंतिम (अभी तक बहुत जटिल) विकल्प dbms_sql का उपयोग कथन खोलने, तैयार करने और वर्णन करने के लिए किया जाएगा। देखें जानकारी के लिए मैनुअल: http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_sql.htm

+0

धन्यवाद! मुझे त्रुटि मिल रही है: "java.sql.SQLException: कथन संभाल निष्पादित नहीं किया गया: getMetaData"। गुगलिंग पर, मैंने पाया: http://stackoverflow.com/questions/9207073/column-names-for-an-ad-hoc-sql। मैं जिस ड्राइवर का उपयोग कर रहा हूं वह 'ojdbc5.jar 'है, और मैं सोच रहा हूं कि' getMetaData 'कॉल इस के साथ समर्थित नहीं है। – mpettis

+0

@mpettis: फिर एक नया ड्राइवर आज़माएं। जैसा कि मैंने कहा, ड्राइवर संस्करण 11.2.0.3 के साथ यह मेरे लिए काम किया। फ़ाइल नाम में "5" * ड्राइवर * के संस्करण को इंगित नहीं करता है। यह जावा संस्करण है जिसके लिए ड्राइवर का इरादा है (क्या आप वास्तव में जावा 5 का उपयोग कर रहे हैं?)। आप मेनिफेस्ट फ़ाइल (.jar के अंदर) –

+0

धन्यवाद देखकर ड्राइवर का संस्करण पा सकते हैं! मुझे एक नया ड्राइवर मिलेगा (जावा 6 का उपयोग करके), लेकिन यह मेरी कंपनी में वितरित मानक जेडीबीसी ड्राइवर है, इसलिए मैं एक नया स्थापित करने के लिए लॉबी करूंगा (ojdbc6.jar)। मुझे विश्वास नहीं था कि एक नया चालक ऐसा करेगा क्योंकि गुगलिंग पर मैंने देखा कि यह कार्यक्षमता ojdbc5.jar के साथ अन्य लोगों के लिए अच्छी तरह से काम करती है, इसलिए मैंने माना कि यह मेरे साथ काम करेगा जब तक कि मुझे कोई अन्य समस्या न हो जो मुझे नहीं पता था के बारे में। यह समाधान वह था जिसे मैं काम करने की कोशिश कर रहा था क्योंकि यह सबसे अधिक प्रोग्रामिक रूप से स्थिर लगता है, और यह एक चाल पर भरोसा नहीं करता है। लेकिन जैसा कि यह खड़ा है, यह काम नहीं किया। – mpettis

-1
SELECT 
     COLUMN_NAME 
    FROM 
     ALL_TAB_COLUMNS 
    WHERE 
     TABLE_NAME ='tableName'; 

आप शायद क्या मतलब है। हालांकि यह अभी भी एक que है ry ... सिर्फ इतना है कि बजाय आवेदन तालिकाओं से क्वेरी की आप विशेष टेबल

एक ही जवाब है कि मेटाडाटा

+0

ओरेकल के पास 'SYSOBJECTS' नाम का कोई दृश्य नहीं है और यह किसी भी जॉइन के कॉलम को वापस नहीं करेगा। –

+0

@a_horse_with_no_name ... मैंने अपनी क्वेरी को सही किया है ... धन्यवाद – Vikram

+0

यह अभी भी ऐसा नहीं करता है जो ओपी चाहता है ... –

संबंधित मुद्दे