Oracle
 sql >> Database >  >> RDS >> Oracle

Formattazione della stringa UUID senza REGEXP_REPLACE e PL/SQL

Sfortunatamente non puoi includere stringhe letterali nei formati numerici, altrimenti potresti convertire la stringa esadecimale in un numero e poi tornare indietro, inserendo i letterali nella maschera del formato nei posti giusti, ma puoi farlo solo per le date.

Puoi usare substr() poiché le posizioni sono fisse. Te ne eri preoccupato

Ovviamente non posso usare substr e concatenazione poiché ogni SUBSTR elaborerebbe un SYS_GUID diverso.

L'uso del fattore di sottoquery (aka un'espressione di tabella comune/CTE) significa il substr() le richieste di una riga da quel CTE vedono tutte lo stesso GUID; questo metodo non genera un nuovo SYS_GUID per ciascuno.

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    

È molto più veloce dell'espressione regolare su una quantità maggiore di dati. Con 100000 valori in un ciclo (in un blocco PL/SQL, eseguendo una quantità minima di lavoro all'interno del ciclo per farlo valutare effettivamente correttamente e utilizzando dbms_utility.get_cpu_time per controllare il tempo trascorso) la versione regex impiega circa 2,51 secondi, mentre la versione sottostringa impiega circa 0,29 secondi. Il tuo sistema riceverà ovviamente numeri diversi, ma dovrebbe comunque essere all'incirca dello stesso ordine di grandezza.