Zde je řešení pomocí rekurzivního faktorovaného poddotazu (Oracle 11.2 a vyšší):
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
Poznámky :
Řekli jste CLOB, ale ve svém příkladu jste extrahovali z řetězce varchar2. Přidal jsem to_clob()
abyste zjistili, zda/jak to funguje na CLOB.
Použil jsem instr
a substr
, protože často (obvykle?) fungují mezi lepšími a mnohem lepšími než jejich regexp
ekvivalenty.
Uložil jsem "index" každého podřetězce do vstupního řetězce; v některých případech je důležité pořadí tokenů ve vstupním řetězci. (Ve vašem příkladu však ne, právě jste opakovali stejný token pětkrát.)
Pokud potřebujete lepší výkon, zejména pokud jsou vaše CLOB velmi velké, může být lepší použít dbms_lob.substr
a dbms_lob.instr
– viz Výkon SUBSTR na CLOB
, zejména odpověď Alexe Poolea a dokumentace zde:http ://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_lob.htm#BABEAJAD
. Všimněte si rozdílů v syntaxi oproti běžnému substr
/ instr
.