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

Cómo dividir un objeto CLOB usando y:delimitador en Oracle en múltiples registros

Aquí hay una solución usando una subconsulta factorizada recursiva (Oracle 11.2 y superior):

with inputs ( str ) as (
       select to_clob('ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0,ABCDEF:PmId12345RmLn1VlId0')
       from dual
     ),
     prep ( s, n, token, st_pos, end_pos ) as (
       select ',' || str || ',', -1, null, null, 1
         from inputs
       union all
       select s, n+1, substr(s, st_pos, end_pos - st_pos),
              end_pos + 1, instr(s, ',', 1, n+3)
         from prep
         where end_pos != 0
     )
select n as idx, token as column_name
from   prep
where  n > 0;



   IDX COLUMN_NAME
------ ----------------------------
     1 ABCDEF:PmId12345RmLn1VlId0
     2 ABCDEF:PmId12345RmLn1VlId0
     3 ABCDEF:PmId12345RmLn1VlId0
     4 ABCDEF:PmId12345RmLn1VlId0
     5 ABCDEF:PmId12345RmLn1VlId0

Notas :

Dijiste CLOB pero en tu ejemplo extrajiste de una cadena varchar2. Agregué to_clob() para ver si/cómo funciona esto en un CLOB.

Usé instr y substr , ya que a menudo (¿normalmente?) se desempeñan entre mejor y mucho mejor que sus regexp equivalentes.

Guardé el "índice" de cada subcadena dentro de la cadena de entrada; en algunos casos, el orden de los tokens en la cadena de entrada es importante. (Sin embargo, no en su ejemplo, solo repitió el mismo token cinco veces).

Si necesita un mejor rendimiento, especialmente si sus CLOB son muy grandes, es mejor que use dbms_lob.substr y dbms_lob.instr - consulte Rendimiento de SUBSTR en CLOB , especialmente la respuesta de Alex Poole y la documentación aquí:http ://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_lob.htm#BABEAJAD . Tenga en cuenta las diferencias de sintaxis frente a substr normal / instr .