Oracle
 sql >> Datenbank >  >> RDS >> Oracle

UUID-String formatieren ohne REGEXP_REPLACE und PL/SQL

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.