За съжаление не можете да включите низови литерали в числови формати, в противен случай бихте могли да конвертирате шестнадесетичния низ в число и след това обратно, като вмъкнете литерали във форматната маска на правилните места - но можете да направите това само за дати.
Можете да използвате substr()
тъй като позициите са фиксирани. Бяхте загрижени за това
Очевидно не мога да използвам substr и конкатенация, тъй като всеки SUBSTR ще обработва различен SYS_GUID.
Използването на факторинг на подзаявка (известен още като общ израз на таблица/CTE) означава substr()
извикванията за ред от този CTE всички виждат един и същ GUID; този метод не генерира нов 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
Това е много по-бързо от регулярния израз за по-голямо количество данни. С 100 000 стойности в цикъл (в PL/SQL блок, извършване на минимално количество работа вътре в цикъла, за да го направи действително оценяван правилно, и използване на dbms_utility.get_cpu_time
за да проверите изминалото време) версията на регулярния израз отнема около 2,51 секунди, докато версията на подниз отнема около 0,29 секунди. Системата ви, разбира се, ще получи различни числа, но те все още трябва да са от приблизително същия порядък.