ऐसा करने के लिए कोई "विकल्प" Oracle में है; आप एक ग्राहक को खोजने में सक्षम हो जो आपको ऐसा करने की अनुमति देता है क्योंकि यह एक ऐसा काम है जो आमतौर पर ग्राहक में किया जाएगा; मैं एक के बारे में नहीं जानता।
tbone's answer आप इस गतिशील रूप से करने के लिए करने जा रहे हैं पर विस्तार करने के लिए। यह का अर्थ यह नहीं है कि आपको प्रत्येक कॉलम सूचीबद्ध करना होगा। आप अपनी क्वेरी बनाने के लिए data dictionary, विशेष रूप से all_tab_columns या user_tab_columns
का उपयोग करेंगे। अपनी इच्छित परिभाषा के साथ एक दृश्य बनाना आसान होगा ताकि आप चाहें तो इसका पुन: उपयोग कर सकें।
उद्देश्य तथ्य यह है कि कॉलम अस्तित्व आदेश उस कॉलम का उपयोग करने के लिए एक प्रश्न बनाने के लिए एक स्ट्रिंग के रूप में एक तालिका में संग्रहीत किया जाता है का उपयोग करें। चूंकि स्तंभ नाम और तालिका नाम तारों के रूप में संग्रहीत होते हैं, इसलिए आप स्ट्रिंग एग्रीगेशन तकनीकों का उपयोग आसानी से एक क्वेरी या डीडीएल कथन बनाने के लिए कर सकते हैं जिसे आप मैन्युअल रूप से या गतिशील रूप से निष्पादित कर सकते हैं।
आप ओरेकल 11g रिलीज उपयोग कर रहे हैं 2 listagg
समारोह उपलब्ध है मदद करने के लिए:
:
create table foo (id number, a number, b number, c number);
create table bar (foo_id number, a number, b number, c number);
यह एकल क्वेरी निम्नलिखित का उत्पादन:
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 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
का उपयोग करके ठीक उसी परिणाम प्राप्त कर सकते हैं, जिसे टॉम क्येट द्वारा बनाया गया था। ओरेकल बेस पर string aggregation techniques पर एक लेख है और स्टैक ओवरफ़्लो पर कई पोस्ट हैं।
आप वास्तव में वास्तव में बना सकते हैं एक छोटे से परिशिष्ट आप ऊपर क्वेरी में कुछ बदलाव करने के साथ जो खोज रहे हैं के रूप में। TABLE_NAME.COLUMN_NAME
प्रारूप में कॉलम बनाने के लिए आप quoted identifier का उपयोग कर सकते हैं।में है जो इसे .
के रूप में उद्धृत करने के लिए ओरेकल में किसी ऑब्जेक्ट नाम के लिए मान्य वर्ण नहीं है। इसका लाभ यह है कि आप वही हासिल करते हैं जो आप चाहते हैं। नकारात्मकता यह है कि यदि आप 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')
;
This query returns:
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
मैं PL/SQL में सक्षम नहीं है, लेकिन शायद आप उन्हें शामिल होने से पहले टेबल के स्तंभ का नाम बदलने की कोशिश कर सकते हैं। – bonsvr
आप डेटा का निर्यात कैसे कर रहे हैं? हो सकता है कि यह तर्क व्यक्तिगत विवरणों के बजाय उस निर्यात उपकरण में संबंधित है? –