Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Formatando String UUID sem REGEXP_REPLACE e PL/SQL


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.