Der er ingen "mulighed" i Oracle for at gøre dette; du må være i stand til at finde en klient, der tillader dig at gøre det, da dette er et job, der normalt ville blive udført i klienten; Jeg kender ikke en.
For at uddybe tbones svar
du bliver nødt til at gøre dette dynamisk. Dette ikke betyder, at du skal liste hver kolonne. Du ville bruge dataordbogen
, specifikt all_tab_columns
eller user_tab_columns
for at oprette din forespørgsel. Det ville være nemmere at oprette en visning med den nøjagtige definition, du ønsker, så du kan genbruge den, hvis du vil.
Målet er at bruge det faktum, at kolonnens eksistens er gemt i en tabel som en streng for at oprette en forespørgsel til at bruge den kolonne. Da kolonnenavne og tabelnavne er gemt som strenge, kan du bruge strengaggregeringsteknikker til nemt at oprette en forespørgsel eller DDL-sætning, som du derefter kan udføre manuelt eller dynamisk.
Hvis du bruger Oracle 11g Release 2, er code>listagg funktion er tilgængelig for at hjælpe dig:
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')
;
Forudsat denne tabelstruktur:
create table foo ( id number, a number, b number, c number);
create table bar ( foo_id number, a number, b number, c number);
Denne enkelt forespørgsel producerer følgende:
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
og her er en SQL Fiddle for at bevise det.
Hvis du ikke bruger 11.2, kan du opnå nøjagtig de samme resultater ved at bruge den udokumenterede funktion wm_concat
eller den brugerdefinerede funktion stragg
, som blev skabt af Tom Kyte. Oracle Base har en artikel om strengaggregeringsteknikker
og der er mange indlæg på Stack Overflow.
Som et lille tillæg kan du faktisk skabe præcis det, du leder efter, med en lille ændring af ovenstående forespørgsel. Du kan bruge en citeret identifikator
for at oprette en kolonne i TABLE_NAME.COLUMN_NAME
format. Du har for at citere det som .
er ikke et gyldigt tegn for et objektnavn i Oracle. Fordelen ved dette er, at du får præcis det, du ønsker. Ulempen er, at det er en stor smerte at forespørge på den oprettede visning, hvis du ikke bruger vælg * fra ...
; at vælge navngivne kolonner kræver dem skal citeres.
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')
;
Denne forespørgsel returnerer :
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