Berikut adalah solusi menggunakan subquery terfaktor rekursif (Oracle 11.2 ke atas):
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
Catatan :
Anda mengatakan CLOB tetapi dalam contoh Anda, Anda mengekstraksi dari string varchar2. Saya menambahkan to_clob()
untuk melihat apakah/bagaimana ini bekerja pada CLOB.
Saya menggunakan instr
dan substr
, karena mereka sering (biasanya?) berkinerja antara lebih baik dan jauh lebih baik daripada regexp
setara.
Saya menyimpan "indeks" dari setiap substring dalam string input; dalam beberapa kasus urutan token dalam string input penting. (Tidak dalam contoh Anda, Anda hanya memiliki token yang sama yang diulang lima kali.)
Jika Anda membutuhkan kinerja yang lebih baik, terutama jika CLOB Anda sangat besar, Anda mungkin lebih baik menggunakan dbms_lob.substr
dan dbms_lob.instr
- lihat Kinerja SUBSTR di CLOB
, terutama jawaban Alex Poole, dan dokumentasi di sini:http ://docs.Oracle.com/cd/B28359_01/appdev.111/b28419/d_lob.htm#BABEAJAD
. Perhatikan perbedaan sintaks vs substr
biasa / instr
.