यहाँ एक पुनरावर्ती फ़ैक्टर सबक्वेरी (Oracle 11.2 और ऊपर) का उपयोग करके एक समाधान दिया गया है:
(प्री>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
नोट :
आपने CLOB कहा था लेकिन आपके उदाहरण में आपने varchar2 स्ट्रिंग से निकाला है। मैंने to_clob()
added जोड़ा यह देखने के लिए कि यह CLOB पर काम करता है या नहीं।
मैंने instr
. का उपयोग किया है और substr
, जैसा कि वे अक्सर (आमतौर पर?) अपने regexp
. से बेहतर और बहुत बेहतर के बीच प्रदर्शन करते हैं समकक्ष।
मैंने इनपुट स्ट्रिंग के भीतर प्रत्येक सबस्ट्रिंग के "इंडेक्स" को सहेजा है; कुछ मामलों में इनपुट स्ट्रिंग में टोकन का क्रम महत्वपूर्ण है। (हालांकि आपके उदाहरण में नहीं, आपने एक ही टोकन को पांच बार दोहराया था।)
यदि आपको बेहतर प्रदर्शन की आवश्यकता है, खासकर यदि आपके सीएलओबी बहुत बड़े हैं, तो आप dbms_lob.substr
का उपयोग करना बेहतर समझ सकते हैं। और dbms_lob.instr
- देखें CLOB पर SUBSTR का प्रदर्शन
, विशेष रूप से एलेक्स पूल का उत्तर, और दस्तावेज़ यहाँ:http ://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_lob.htm#BABEAJAD
. नियमित substr
बनाम सिंटैक्स अंतर पर ध्यान दें / instr
।