String-Literale kann man leider nicht in Zahlenformate einbinden, sonst könnte man den Hex-String in eine Zahl umwandeln und wieder zurück, indem man in der Formatmaske an den richtigen Stellen Literale einfügt - das geht aber nur für Datumsangaben.
Sie können substr()
verwenden da die Positionen fest sind. Das hat Sie beunruhigt
Offensichtlich kann ich substr und concatenation nicht verwenden, da jeder SUBSTR eine andere SYS_GUID verarbeiten würde.
Die Verwendung von Subquery Factoring (auch bekannt als ein allgemeiner Tabellenausdruck/CTE) bedeutet substr()
Aufrufe für eine Zeile von diesem CTE sehen alle dieselbe GUID; diese Methode generiert nicht für jeden eine neue SYS_GUID.
with t as (
select rawtohex(sys_guid()) guid from dual
connect by level <= 2
)
select guid, substr(guid, 1, 8)
||'-'|| substr(guid, 9, 4)
||'-'|| substr(guid, 13, 4)
||'-'|| substr(guid, 17, 4)
||'-'|| substr(guid, 21, 12) as formatted_guid
from t;
GUID FORMATTED_GUID
-------------------------------- ----------------------------------------
2F6BA62518F926D0E0534D49E50ABB46 2F6BA625-18F9-26D0-E053-4D49E50ABB46
2F6BA62518FA26D0E0534D49E50ABB46 2F6BA625-18FA-26D0-E053-4D49E50ABB46
Das ist viel schneller als die Regex bei einer größeren Datenmenge. Mit 100000 Werten in einer Schleife (in einem PL/SQL-Block, minimaler Arbeit innerhalb der Schleife, damit sie tatsächlich richtig ausgewertet wird, und Verwendung von dbms_utility.get_cpu_time
um die verstrichene Zeit zu überprüfen) benötigt die Regex-Version etwa 2,51 Sekunden, während die Substring-Version etwa 0,29 Sekunden benötigt. Ihr System wird natürlich andere Zahlen erhalten, aber es sollte immer noch ungefähr in der gleichen Größenordnung liegen.