Řetězcové literály bohužel nemůžete zahrnout do číselných formátů, jinak byste mohli převést hexadecimální řetězec na číslo a pak zase zpět a vložit literály do masky formátu na správná místa – ale můžete to udělat pouze pro data.
Můžete použít substr()
protože pozice jsou pevné. Měli jste obavy
Je zřejmé, že nemohu použít substr a zřetězení, protože každý SUBSTR by zpracoval jiný SYS_GUID.
Použití faktoringu poddotazů (aka běžný tabulkový výraz/CTE) znamená substr()
volá po řádku z tohoto CTE, všichni vidí stejný GUID; tato metoda negeneruje nový SYS_GUID pro každý 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 je mnohem rychlejší než regulární výraz na větším množství dat. S 100 000 hodnotami ve smyčce (v bloku PL/SQL s minimálním množstvím práce uvnitř smyčky, aby se skutečně správně vyhodnotila, a pomocí dbms_utility.get_cpu_time
pro kontrolu uplynulého času) verze regulárního výrazu trvá asi 2,51 sekundy, zatímco verze podřetězce trvá asi 0,29 sekundy. Váš systém bude mít samozřejmě různá čísla, ale pořád by to mělo být přibližně stejného řádu.