Folgendes funktioniert Rufen Sie es als auf Wählen Sie * aus der Tabelle (Splitter ('a, b, c, d'))
%Vor%Leider müssen wir in 11g noch unsere eigenen PL / SQL-Tokenizer mit SQL-Typen abwickeln. In 11gR2 gab uns Oracle eine Aggregationsfunktion, um Ergebnisse in eine CSV-Zeichenkette zu verketten, so dass sie in 12i möglicherweise die umgekehrte Möglichkeit bieten.
Wenn Sie insbesondere keinen SQL-Typ erstellen möchten, können Sie die integrierte SYS.DBMS_DEBUG_VC2COLL wie folgt verwenden:
%Vor%Hier ist es in Aktion:
%Vor%Danksagung: Dieser Code ist eine Variante von ein Code, den ich in Tanel Poders Blog gefunden habe .
Um eine optimale Leistung zu erzielen, sollten Sie keine hierarchischen Abfragen (CONNECT BY) in der Splitter-Funktion verwenden.
Die folgende Splitter-Funktion wird bei größeren Datenvolumes deutlich besser ausgeführt
%Vor%Dieser Leistungsunterschied kann unten beobachtet werden (Ich habe den Funktionsteiler verwendet, wie zuvor in dieser Diskussion angegeben).
%Vor%Ich habe keine 11g installiert, um damit zu spielen, aber es gibt eine PIVOT- und UNPIVOT-Operation zum Konvertieren von Spalten in Zeilen / Zeilen in Spalten, was ein guter Ausgangspunkt sein kann.
(Nachdem wir tatsächlich weitere Untersuchungen durchgeführt haben, sieht dies für diesen Fall nicht geeignet aus - es arbeitet mit tatsächlichen Zeilen / Spalten, aber nicht mit Datensätzen in einer Spalte).
Es gibt auch DBMS_UTILITY.comma_to_table und table_to_comma zum Konvertieren von CSV-Listen in PL / SQL-Tabellen. Es gibt einige Einschränkungen (Umgang mit Zeilenumbrüchen usw.), aber es kann ein guter Ausgangspunkt sein.
Meine Neigung wäre, den TYPE-Ansatz zu verwenden, mit einer einfachen Funktion, die comma_to_table ausführt, dann PIPE ROW für jeden Eintrag im Ergebnis von comma_to_table (DBMS_UTILITY.comma_to_table ist leider eine Prozedur, die von SQL aus nicht aufgerufen werden kann).