Infelizmente, você não pode incluir literais de string em formatos numéricos, caso contrário, você pode converter a string hexadecimal em um número e depois voltar novamente, inserindo literais na máscara de formato nos lugares certos - mas você só pode fazer isso para datas.
Você pode usar
substr()
pois as posições são fixas. Você estava preocupado que
Obviamente, não posso usar substr e concatenação, pois cada SUBSTR processaria um SYS_GUID diferente.
Usar fatoração de subconsulta (também conhecido como uma expressão de tabela comum/CTE) significa que o
substr()
todas as chamadas para uma linha desse CTE veem o mesmo GUID; este método não gera um novo SYS_GUID para cada um. 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
Isso é muito mais rápido que o regex em uma quantidade maior de dados. Com 100.000 valores em um loop (em um bloco PL/SQL, fazendo uma quantidade mínima de trabalho dentro do loop para fazê-lo realmente avaliar corretamente e usando
dbms_utility.get_cpu_time
para verificar o tempo decorrido) a versão regex leva cerca de 2,51 segundos, enquanto a versão substring leva cerca de 0,29 segundos. Seu sistema obterá números diferentes, é claro, mas ainda deve ser da mesma ordem de magnitude.