ऐसा करने के लिए Oracle में कोई "विकल्प" नहीं है; आप हो सकता है एक क्लाइंट ढूंढने में सक्षम हो जो आपको ऐसा करने की अनुमति देता है क्योंकि यह एक ऐसा काम है जो आमतौर पर क्लाइंट में किया जाता है; मैं एक के बारे में नहीं जानता।
tbone's answer
पर विस्तार करने के लिए आपको इसे गतिशील रूप से करना होगा। यह नहीं इसका मतलब है कि आपको हर कॉलम को सूचीबद्ध करना होगा। आप डेटा डिक्शनरी
का उपयोग करेंगे , विशेष रूप से all_tab_columns
या user_tab_columns
अपनी क्वेरी बनाने के लिए। अपनी इच्छित सटीक परिभाषा के साथ एक दृश्य बनाना आसान होगा ताकि आप चाहें तो उसका पुन:उपयोग कर सकें।
उद्देश्य इस तथ्य का उपयोग करना है कि कॉलम का उपयोग करने के लिए एक क्वेरी बनाने के लिए कॉलम अस्तित्व को एक स्ट्रिंग के रूप में एक तालिका में संग्रहीत किया जाता है। चूंकि कॉलम नाम और टेबल नाम स्ट्रिंग्स के रूप में संग्रहीत होते हैं, इसलिए आप आसानी से एक क्वेरी या डीडीएल स्टेटमेंट बनाने के लिए स्ट्रिंग एग्रीगेशन तकनीकों का उपयोग कर सकते हैं, जिसे आप मैन्युअल रूप से या गतिशील रूप से निष्पादित कर सकते हैं।
अगर आप Oracle 11g रिलीज़ 2 का उपयोग कर रहे हैं तो listagg
फ़ंक्शन आपकी सहायता के लिए उपलब्ध है:
select 'create or replace view my_view as
select '
|| listagg( table_name || '.' || column_name
|| ' as '
|| substr(table_name,1,1) || '_'
|| column_name, ', ')
within group
( order by case when table_name = 'FOO' then 0 else 1 end
, column_id
)
|| ' from foo f
join bar b
on f.id = b.foo_id'
from user_tab_columns
where table_name in ('FOO','BAR')
;
इस तालिका संरचना को मानते हुए:
create table foo ( id number, a number, b number, c number);
create table bar ( foo_id number, a number, b number, c number);
यह एकल क्वेरी निम्नलिखित उत्पन्न करती है:
create or replace view my_view as
select FOO.ID as F_ID, FOO.A as F_A, FOO.B as F_B, FOO.C as F_C
, BAR.FOO_ID as B_FOO_ID, BAR.A as B_A, BAR.B as B_B, BAR.C as B_C
from foo f
join bar b on f.id = b.foo_id
और यह रहा एक SQL Fiddle इसे साबित करने के लिए।
आप 11.2 का उपयोग नहीं कर रहे हैं, तो आप अनिर्दिष्ट फ़ंक्शन का उपयोग करके बिल्कुल वही परिणाम प्राप्त कर सकते हैं wm_concat
या उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन stragg
, जिसे टॉम कायटे ने बनाया था। Oracle बेस में स्ट्रिंग एग्रीगेशन तकनीक
पर एक लेख है। और स्टैक ओवरफ्लो पर कई पोस्ट हैं।
एक छोटे से परिशिष्ट के रूप में आप वास्तव में वही बना सकते हैं जो आप उपरोक्त क्वेरी में एक छोटे से बदलाव के साथ खोज रहे हैं। आप उद्धृत पहचानकर्ता
का उपयोग कर सकते हैं TABLE_NAME.COLUMN_NAME
. में एक कॉलम बनाने के लिए प्रारूप। आपके पास है इसे .
. के रूप में उद्धृत करने के लिए Oracle में किसी ऑब्जेक्ट नाम के लिए मान्य वर्ण नहीं है। इसका फायदा यह है कि आपको वही मिलता है जो आप चाहते हैं। नकारात्मक पक्ष यह है कि यदि आप select * from ...
का उपयोग नहीं करते हैं तो बनाए गए दृश्य को क्वेरी करना एक बहुत बड़ा दर्द है; नामित स्तंभों का चयन करने के लिए आवश्यकता होगी उन्हें उद्धृत किया जाना है।
select 'create or replace view my_view as
select '
|| listagg( table_name || '.' || column_name
|| ' as '
|| '"' || table_name || '.'
|| column_name || '"', ', ')
within group
( order by case when table_name = 'FOO' then 0 else 1 end
, column_id
)
|| ' from foo f
join bar b
on f.id = b.foo_id'
from user_tab_columns
where table_name in ('FOO','BAR')
;
create or replace view my_view as
select FOO.ID as "FOO.ID", FOO.A as "FOO.A", FOO.B as "FOO.B", FOO.C as "FOO.C"
, BAR.FOO_ID as "BAR.FOO_ID", BAR.A as "BAR.A"
, BAR.B as "BAR.B", BAR.C as "BAR.C"
from foo f
join bar b on f.id = b.foo_id