Er is geen "optie" in Oracle om dit te doen; je mag in staat zijn om een klant te vinden die u dit toestaat, aangezien dit een taak is die normaal in de klant zou worden gedaan; Ik ken er geen.
Om uit te breiden op tbone's antwoord
je zult dit dynamisch moeten doen. Dit niet betekent dat je elke kolom moet vermelden. U zou het datawoordenboek
gebruiken , in het bijzonder alle_tab_columns
of user_tab_columns
om uw vraag te maken. Het zou gemakkelijker zijn om een weergave te maken met de exacte definitie die u wilt, zodat u deze desgewenst opnieuw kunt gebruiken.
Het doel is om het feit dat het bestaan van de kolommen in een tabel is opgeslagen als een tekenreeks te gebruiken om een query te maken om die kolom te gebruiken. Omdat de kolomnamen en tabelnamen worden opgeslagen als tekenreeksen, kunt u technieken voor tekenreeksaggregatie gebruiken om eenvoudig een query of DDL-instructie te maken die u vervolgens handmatig of dynamisch kunt uitvoeren.
Als u Oracle 11g Release 2 gebruikt, de listagg
functie is beschikbaar om u te helpen:
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')
;
Uitgaande van deze tabelstructuur:
create table foo ( id number, a number, b number, c number);
create table bar ( foo_id number, a number, b number, c number);
Deze enkele zoekopdracht levert het volgende op:
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
en hier is een SQL Fiddle om het te bewijzen.
Als u 11.2 niet gebruikt, kunt u exact dezelfde resultaten bereiken met de ongedocumenteerde functie wm_concat
of de door de gebruiker gedefinieerde functie stragg
, die is gemaakt door Tom Kyte. Oracle Base heeft een artikel over technieken voor stringaggregatie
en er zijn veel berichten op Stack Overflow.
Als een kleine toevoeging kunt u precies creëren wat u zoekt met een kleine wijziging in de bovenstaande zoekopdracht. U kunt een identificatiecode tussen aanhalingstekens
gebruiken om een kolom te maken in de TABLE_NAME.COLUMN_NAME
formaat. Je hebt om het te citeren als .
is geen geldig teken voor een objectnaam in Oracle. Het voordeel hiervan is dat je precies krijgt wat je wilt. Het nadeel is dat het opvragen van de gemaakte weergave enorm lastig is als je select * from ...
niet gebruikt.; het selecteren van benoemde kolommen is vereist ze moeten worden geciteerd.
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')
;
Deze zoekopdracht retourneert :
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