2011-08-12 16 views
7

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

SELECT 
(
select column_name 
from all_tab_cols 
where table_Name='CLARITY_SER' 
AND  OWNER='CLARITY' 
AND  data_type='DATE' 
) 
FROM CLARITY_SER 

इस वाक्य रचना काम नहीं करता है, के रूप में सबक्वेरी एकाधिक पंक्तियों देता है, एकाधिक स्तंभों के साथ एक पंक्ति के बजाय।

क्या केवल कुछ कॉलम चुनने के लिए तालिका स्कीमा जानकारी पूछकर गतिशील रूप से SQL कथन उत्पन्न करना संभव है?

** संपादित करें ** यदि संभव हो, तो फ़ंक्शन या प्रक्रिया का उपयोग किए बिना ऐसा करें।

+1

मेरा एक प्रश्न है उम्मीद है कि काफी जवाबदेह होना चाहिए जोड़ने के लिए अपने पद का संपादन किया। यद्यपि लोग आप जो पूछ रहे हैं उसे इंगित कर सकते हैं, मैंने सोचा कि यह स्पष्ट होना सर्वोत्तम है। –

+0

क्या आपका मतलब SQL प्रोग्राम बनाने के लिए प्रोग्रामिंग भाषा का उपयोग किए बिना है? – paulmorriss

+0

ऐसा करने का कारण क्या है? –

उत्तर

2

नहीं, SQL में गतिशील रूप से कॉलम सूची निर्दिष्ट करना संभव नहीं है। पहली क्वेरी चलाने के लिए आपको एक प्रक्रियात्मक भाषा का उपयोग करने की आवश्यकता होगी, दूसरी क्वेरी बनाने के लिए इसका उपयोग करें, फिर दूसरी क्वेरी चलाएं।

6

आप ऐसा कर सकते हैं:

declare 
    l_sql varchar2(32767); 
    rc sys_refcursor; 
begin 
    l_sql := 'select '; 
    for r in 
    (select column_name 
    from all_tab_cols 
    where table_Name='CLARITY_SER' 
    AND  OWNER='CLARITY' 
    AND  data_type='DATE' 
) 
    loop 
    l_sql := l_sql || r.column_name || ','; 
    end loop; 
    l_sql := rtrim(l_sql,',') || ' from clarity_ser'; 
    open rc for l_sql; 
    ... 
end; 
1

आप गतिशील एसक्यूएल इस्तेमाल कर सकते हैं। एक फ़ंक्शन बनाएं जो तालिका का नाम, मालिक, डेटा प्रकार लेता है, आंतरिक क्वेरी निष्पादित करता है और कॉलम नामों की अल्पविराम से अलग सूची देता है, या यदि आप चाहें तो एक सरणी तालिका देता है। फिर बाहरी क्वेरी का निर्माण करें और इसे execute immediate के साथ निष्पादित करें।

CREATE FUNCTION get_column_list(
     table_name IN varchar2, 
     owner_name IN varchar2, 
     data_type IN varchar2) 
    RETURN varchar2 
    IS 
BEGIN 
...... (get columns and return comma-separated list) 
END; 
/

अपने कार्य एक अल्पविराम से अलग किए देता है, तो आप इसे इनलाइन कर सकते हैं:

execute immediate 'select ' || get_column_list(table_name, owner_name, datatype) || ' from ' || table_name 

वैसे यह एक लंबे समय के बाद से मैं ओरेकल के साथ खेला तो मैं थोड़ा दूर हो सकता है, लेकिन मैं बहुत हूँ यकीन है कि यह काफी कामयाब है।

1

sqlplus में आप ऐसा कर सकता है:

COLUMN cols NEW_VALUE cols 

SELECT max(ltrim(sys_connect_by_path(column_name, ','), ',')) cols 
FROM 
(
select rownum rn, column_name 
from all_tab_cols 
where table_Name='CLARITY_SER' 
and  OWNER='CLARITY' 
AND  data_type='DATE' 
) 
start with rn = 1 connect by rn = prior rn +1 
; 

select &cols from clarity.clarity_ser; 
+0

क्या यह ओरेकल के एसक्यूएल डेवलपर में काम करेगा? – craig

+0

@ क्रैग, मुझे ऐसा नहीं लगता, क्योंकि मुझे नहीं लगता कि COLUMN कमांड का समर्थन किया गया है। यह करने का कोई और तरीका हो सकता है। –