Dies kann noch nicht mit 100% nativen SQL erfolgen. Diese übermäßig dynamischen Situationen werden normalerweise am besten vermieden; ein wenig mehr Typisierung ist in der Regel besser als komplizierten Code hinzufügen.
Wenn Sie wirklich einen Ausnahmefall haben und bereit sind, den Preis dort zu zahlen, ist ein Weg, dies zu tun. Es verwendet nicht 100% natürliches SQL, aber es könnte als "reines" SQL betrachtet werden, da es das Oracle Data Cartridge-Framework zur Erweiterung der Datenbank verwendet.
Sie können meine Open-Source-Projekt Method4 laufen dynamische SQL in SQL verwenden. Befolgen Sie die Github-Schritte, um die Objekte herunterzuladen und zu installieren. Der Code ist schmerzhaft kompliziert, aber glücklicherweise müssen Sie das meiste nicht verstehen. Nur die folgenden einfachen Änderungen sind erforderlich, um mit der Anpassung von Spaltennamen zu beginnen.
method4 Änderungen
Erstellen Sie eine Variable den neuen Spaltennamen zu halten. Fügen Sie es dem Deklarationsteil der Funktion ODCITableDescribe in Zeile 12 der Datei METHOD4_OT.TPB hinzu.
Erstellen Sie eine SQL-Anweisung, um die alte Spalte der neuen Spalte zuzuordnen. Fügen Sie dies zu Zeile 31 hinzu, wo es für jede Spalte ausgeführt wird.
--Get mapped column name if it exists. If none, use the existing name.
select nvl(max(target_column_name), r_sql.description(i).col_name)
into v_new_column_name
from column_names
where source_column_name = r_sql.description(i).col_name;
ändern Linie 42 auf den neuen Variablennamen zu verweisen:
substr(v_new_column_name, 1, 30),
Mapping Tabelle
drop table column_names;
create table column_names
(
source_column_name varchar2(30),
target_column_name varchar2(30),
constraint column_names_pk primary key(source_column_name)
);
insert into column_names values('A1234', 'BETTER_COLUMN_NAME');
insert into column_names values('B4321', 'Case sensitive column name.');
Abfrage Beispiel
Jetzt die Spaltennamen von jedem que Sie können sich magisch auf die von Ihnen gewünschten Werte einstellen. Und das verwendet nicht einfach Textersetzung; Die Spalten von *
werden ebenfalls geändert.
SQL> select * from table(method4.query('select 1 a1234, 2 b4321, 3 c from dual'));
BETTER_COLUMN_NAME Case sensitive column name. C
------------------ --------------------------- ----------
1 2 3
Warnungen
Oracle SQL ist horrend kompliziert und jeder Versuch, eine Schicht auf zu bauen, wenn es viele potenzielle Probleme hat. Zum Beispiel wird die Leistung sicherlich langsamer sein. Obwohl ich viele Komponententests erstellt habe, bin ich sicher, dass es einige seltsame Datentypen gibt, die nicht korrekt funktionieren. (Aber wenn Sie irgendwelche finden, erstellen Sie bitte ein Github-Problem, damit ich es beheben kann.)
Meiner Erfahrung nach, wenn Menschen nach dieser Art von dynamischem Verhalten fragen, ist es in der Regel nicht die Kosten wert. Manchmal ist ein bisschen Extra-Tippen die beste Lösung.
Danke Jon! Ich schätze es, dass du dir die Zeit genommen hast, zu antworten und werde dies versuchen. Der Grund, warum ich nach einer dynamischen Lösung suche, ist, dass jedes Mal, wenn ich diese Abfrage ausführen muss - und das ist oft der Fall - gegen neue Tabellen mit neuen Spaltennamen. –