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
.