sql >> Base de Datos >  >> RDS >> Oracle

Formateo de cadena UUID sin REGEXP_REPLACE y PL/SQL

Desafortunadamente, no puede incluir literales de cadena en formatos numéricos; de lo contrario, podría convertir la cadena hexadecimal en un número y luego regresar, insertando literales en la máscara de formato en los lugares correctos, pero solo puede hacerlo para las fechas.

Puedes usar substr() ya que las posiciones son fijas. Te preocupaba que

Obviamente, no puedo usar substr y concatenación ya que cada SUBSTR procesaría un SYS_GUID diferente.

El uso de factorización de subconsultas (también conocido como una expresión de tabla común/CTE) significa que substr() las llamadas a una fila de ese CTE ven el mismo GUID; este método no genera un SYS_GUID nuevo para cada uno.

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    

Eso es mucho más rápido que la expresión regular en una mayor cantidad de datos. Con 100000 valores en un bucle (en un bloque PL/SQL, haciendo una cantidad mínima de trabajo dentro del bucle para que realmente se evalúe correctamente y usando dbms_utility.get_cpu_time para comprobar el tiempo transcurrido), la versión de expresiones regulares tarda unos 2,51 segundos, mientras que la versión de subcadena tarda unos 0,29 segundos. Su sistema obtendrá diferentes números, por supuesto, pero aún debe ser del mismo orden de magnitud.