Nie możesz niestety dołączyć literałów ciągów w formatach liczb, w przeciwnym razie możesz przekonwertować ciąg szesnastkowy na liczbę, a następnie z powrotem, wstawiając literały w masce formatu we właściwych miejscach - ale możesz to zrobić tylko dla dat.
Możesz użyć substr()
ponieważ pozycje są ustalone. Obawiałeś się, że
Oczywiście nie mogę używać substr i konkatenacji, ponieważ każdy SUBSTR przetwarzałby inny SYS_GUID.
Korzystanie z faktoringu podzapytania (znanego również jako wspólne wyrażenie tabelowe/CTE) oznacza, że substr()
wzywa do wiersza z tego CTE, wszystkie widzą ten sam identyfikator GUID; ta metoda nie generuje nowego SYS_GUID dla każdego z nich.
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
To dużo szybciej niż wyrażenie regularne na większej ilości danych. Z 100000 wartościami w pętli (w bloku PL/SQL, wykonanie minimalnej pracy wewnątrz pętli, aby właściwie ocenić, i użycie dbms_utility.get_cpu_time
aby sprawdzić upływ czasu) wersja regex zajmuje około 2,51 sekundy, a wersja podłańcuchowa około 0,29 sekundy. Twój system otrzyma oczywiście różne liczby, ale nadal powinny one być mniej więcej tego samego rzędu wielkości.