Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle-Spaltennamen im Format table.column zurückgeben?

Dazu gibt es in Oracle keine "Option". Sie können in der Lage sein, einen Client zu finden, der Ihnen dies ermöglicht, da dies eine Aufgabe ist, die normalerweise im Client erledigt wird; Ich kenne keinen.

Zur Erweiterung der Antwort von tbone Sie müssen dies dynamisch tun. Dies nicht bedeutet, dass Sie jede Spalte auflisten müssen. Sie würden das Datenwörterbuch verwenden , insbesondere all_tab_columns oder user_tab_columns um Ihre Abfrage zu erstellen. Es wäre einfacher, eine Ansicht mit genau der gewünschten Definition zu erstellen, damit Sie sie bei Bedarf wiederverwenden können.

Das Ziel besteht darin, die Tatsache zu nutzen, dass die Spaltenexistenz in einer Tabelle als Zeichenfolge gespeichert ist, um eine Abfrage zur Verwendung dieser Spalte zu erstellen. Da die Spaltennamen und Tabellennamen als Zeichenfolgen gespeichert werden, können Sie Zeichenfolgenaggregationstechniken verwenden, um auf einfache Weise eine Abfrage oder DDL-Anweisung zu erstellen, die Sie dann manuell oder dynamisch ausführen können.

Wenn Sie Oracle 11g Release 2 verwenden, wird der listagg Funktion steht Ihnen zur Verfügung:

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

Angenommen diese Tabellenstruktur:

create table foo ( id number, a number, b number, c number);
create table bar ( foo_id number, a number, b number, c number);

Diese einzelne Abfrage erzeugt Folgendes:

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

und hier ist ein SQL Fiddle um es zu beweisen.

Wenn Sie 11.2 nicht verwenden, können Sie mit der undokumentierten Funktion wm_concat oder die benutzerdefinierte Funktion stragg , das von Tom Kyte erstellt wurde. Oracle Base hat einen Artikel über String-Aggregation-Techniken und es gibt viele Posts auf Stack Overflow.

Als kleine Ergänzung können Sie mit einer kleinen Änderung an der obigen Abfrage tatsächlich genau das erstellen, wonach Sie suchen. Sie können eine Kennung in Anführungszeichen verwenden um eine Spalte in TABLE_NAME.COLUMN_NAME zu erstellen Format. Sie haben um es als . zu zitieren ist kein gültiges Zeichen für einen Objektnamen in Oracle. Der Vorteil davon ist, dass Sie genau das bekommen, was Sie wollen. Der Nachteil ist, dass das Abfragen der erstellten Ansicht sehr mühsam ist, wenn Sie select * from ... nicht verwenden; die Auswahl benannter Spalten ist erforderlich sie zu zitieren.

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

Diese Abfrage gibt zurück :

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