2016-05-24 28 views
0

Ich habe eine Oracle-Tabelle mit dem Namen: col_mapping wobei eine Spalte in dieser Tabelle die Spaltenwerte von Spalten aus einer anderen Tabelle enthält.Verwenden von Spaltenwerten aus einer Tabelle innerhalb einer SELECT-Klausel aus einer anderen Tabelle

Beispiel Daten der Tabelle:

ID DESCR  COL_VALS 
------------------------------ 
    1  LABEL  COL_1 
    2  NAME_ADDR COL_2:COL_3 
    3  SALARY COL4 

Basierend auf der obigen Tabelle col_mapping, ich möchte nun durch jeden Datensatz in col_mapping gehen und die COL_VALS als Teil meiner

select COL_VALS from other_tab 

verwenden offensichtlich , wenn es mehr als einen Wert wie COL_2: COL_3 gibt, muss das ':' durch ein ','

SELECT COL_1 from other_tab; 
    SELECT COL_2,COL_3 from other_tab; 
    SELECT COL_4 from other_tab; 
ersetzt werden

Jede Hilfe, wie man das oben genannte in Oracle erreicht, wäre großartig.

Danke.

+0

Möchten Sie diese Select-Anweisungen nur als Strings generieren oder tatsächlich ausführen? Um sie auszuführen, benötigen Sie eine Form von dynamischem SQL. und was würden Sie mit den Ergebnissen der Abfragen tun? Ist die 'descr'-Spalte relevant - soll das ein Alias ​​für die abgefragten Spalten sein, und wenn ja, soll der zweite 'col_2' und' col_3' zu einem einzigen Wert kombinieren? –

+0

@Alex Poole Ich möchte diese Select-Anweisungen tatsächlich generieren und die tatsächlichen Werte für diese Spalten in der Tabelle other_tab in eine Staging-Tabelle einfügen. Die descr-Spalte lässt mich einfach wissen, was in den col_vals liegt, also mit col_2 und col_3 möchte ich diese als separate Werte. Hoffe das hilft. Vielen Dank. – tonyf

+0

Hat Ihre Staging-Tabelle die gleichen Spaltennamen und Datentypen wie 'other_tab'? Wenn nicht, wie werden die Werte abgebildet und konvertiert? –

Antwort

1

können Sie generieren und Insert-Anweisungen basierend auf dem col_vals Wert mit dynamischem SQL in einem Cursor Schleife über die col_mappings Zeilen ausführen:

begin 
    for r in (select replace(col_vals, ':', ',') as cols from col_mapping) loop 
    dbms_output.put_line('insert into staging_tab(' || r.cols || ')' 
     || ' select ' || r.cols || ' from other_tab'); 
    execute immediate 'insert into staging_tab(' || r.cols || ')' 
     || ' select ' || r.cols || ' from other_tab'; 
    end loop; 
end; 
/

Der Cursor wird nur den cols_val Wert, Kolon mit Komma ersetzt. Die generierte Einfügung verwendet die modifizierte cols_val sowohl als Einfüge- als auch als Auswahlliste - da Sie angegeben haben, dass die Staging-Tabelle der Struktur other_tab entspricht.

Die Zeile dbms_output ist nur so, dass Sie die generierten Anweisungen sehen können - es ist nicht notwendig für den Code zu laufen, und Sie müssen set serveroutput on oder gleichwertig, um es trotzdem zu sehen. Damit aktiviert ist, läuft diesen Block mit Ihrem Beispiel-Mapping-Daten zeigt:

PL/SQL procedure successfully completed. 

insert into staging_tab(COL_1) select COL_1 from other_tab 
insert into staging_tab(COL_2,COL_3) select COL_2,COL_3 from other_tab 
insert into staging_tab(COL4) select COL4 from other_tab 

Was Sie mit am Ende sind die Daten aus jeder Zeile in other_tab verteilt über mehrere Zeilen in staging_tab, mit vielen Nullwerte. Hoffentlich haben Sie das beabsichtigt.

+0

Dank @Alex Poole - schauen Sie und lassen Sie es wissen. – tonyf

+0

Danke @Alex Poole - alles sieht gut aus, aber ich musste einen neuen Thread erstellen, da ich nun die COL_VALS in einem WHERE Zustand einfügen muss. – tonyf

Verwandte Themen