Non c'è alcuna "opzione" in Oracle per farlo; tu puoi essere in grado di trovare un cliente che ti permetta di farlo poiché questo è un lavoro che normalmente verrebbe svolto nel cliente; Non ne conosco uno.
Per approfondire risposta di tbone
dovrai farlo in modo dinamico. Questo non significa che devi elencare ogni colonna. Dovresti utilizzare il dizionario dati
, in particolare all_tab_columns
o user_tab_columns
per creare la tua richiesta. Sarebbe più semplice creare una vista con la definizione esatta che desideri in modo da poterla riutilizzare se lo desideri.
L'obiettivo è utilizzare il fatto che l'esistenza delle colonne è memorizzata in una tabella come stringa per creare una query per utilizzare quella colonna. Poiché i nomi delle colonne e delle tabelle vengono archiviati come stringhe, puoi utilizzare tecniche di aggregazione di stringhe per creare facilmente una query o un'istruzione DDL che puoi quindi eseguire manualmente o dinamicamente.
Se stai utilizzando Oracle 11g Release 2, listagg
la funzione è disponibile per aiutarti:
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')
;
Assumendo questa struttura di tabella:
create table foo ( id number, a number, b number, c number);
create table bar ( foo_id number, a number, b number, c number);
Questa singola query produce quanto segue:
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
ed ecco un SQL Fiddle per dimostrarlo.
Se non stai usando 11.2 puoi ottenere esattamente gli stessi risultati usando la funzione non documentata wm_concat
o la funzione definita dall'utente stragg
, creato da Tom Kyte. Oracle Base ha un articolo sulle tecniche di aggregazione di stringhe
e ci sono molti post su Stack Overflow.
Come piccola aggiunta puoi effettivamente creare esattamente ciò che stai cercando con una piccola modifica alla query sopra. Puoi utilizzare un identificatore tra virgolette
per creare una colonna in TABLE_NAME.COLUMN_NAME
formato. Tu hai per citarlo come .
non è un carattere valido per un nome oggetto in Oracle. Il vantaggio di questo è che ottieni esattamente quello che vuoi. Lo svantaggio è che interrogare la vista creata è una seccatura enorme se non usi select * from ...
; la selezione di colonne con nome richiede da citare.
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