Oracle
 sql >> Database >  >> RDS >> Oracle

Restituire i nomi delle colonne Oracle nel formato table.column?

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')
        ;

Questa query restituisce :

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