Oracle
 sql >> Base de données >  >> RDS >> Oracle

Formatage de la chaîne UUID sans REGEXP_REPLACE et PL/SQL

Vous ne pouvez malheureusement pas inclure de littéraux de chaîne dans les formats numériques, sinon vous pourriez convertir la chaîne hexadécimale en nombre, puis revenir en arrière, en insérant des littéraux dans le masque de format aux bons endroits - mais vous ne pouvez le faire que pour les dates.

Vous pouvez utiliser substr() puisque les positions sont fixes. Vous craigniez que

Évidemment, je ne peux pas utiliser substr et la concaténation car chaque SUBSTR traiterait un SYS_GUID différent.

L'utilisation de la factorisation de sous-requête (c'est-à-dire une expression de table commune/CTE) signifie le substr() les appels pour une ligne à partir de ce CTE voient tous le même GUID ; cette méthode ne génère pas de nouveau SYS_GUID pour chacun.

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    

C'est beaucoup plus rapide que la regex sur une plus grande quantité de données. Avec 100000 valeurs dans une boucle (dans un bloc PL/SQL, faire un minimum de travail à l'intérieur de la boucle pour qu'elle s'évalue correctement, et en utilisant dbms_utility.get_cpu_time pour vérifier le temps écoulé), la version regex prend environ 2,51 secondes, tandis que la version sous-chaîne prend environ 0,29 secondes. Votre système obtiendra des nombres différents bien sûr, mais cela devrait toujours être à peu près du même ordre de grandeur.