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