extractvalue()
use का उपयोग करने का प्रयास करें फ़ंक्शन, जो extract()
. के बजाय एन्कोडेड इकाइयों को हटा देता है . यहां एक उदाहरण दिया गया है:
clear screen;
column res format a20;
-- depending on a situation, NOENTITYESCAPING might be dropped
select extractvalue(
xmlelement(NOENTITYESCAPING e,id,'->')
, '//text()'
) as res
from (select level as id
from dual
connect by level < 6)
परिणाम:
RES
--------------------
1->
2->
3->
4->
5->
लेकिन extractvalue()
. का उपयोग फ़ंक्शन इस तथ्य से सीमित हो सकता है कि यह केवल एक नोड का मान वापस कर सकता है। एकाधिक नोड्स के मान लौटाने के मामले में utl_i18n
पैकेज, और unescape_reference()
उस पैकेज के फ़ंक्शन का उपयोग एन्कोडेड इकाइयों से बचने के लिए किया जा सकता है:
clear screen;
column res format a20;
select utl_i18n.unescape_reference(xmlelement(root
, xmlelement(node1, '>')
, xmlelement(node2, '<')
).extract('//text()').getstringval()
) as res
from dual
connect by level <= 3;
परिणाम:
RES
--------------------
><
><
><
हां, utl_i18n.unescape_reference()
. के रूप में फ़ंक्शन केवल varchar2
. के मान स्वीकार करता है डेटा प्रकार और प्रकार जिन्हें परोक्ष रूप से varchar2
. में परिवर्तित किया जा सकता है डेटा प्रकार, जब बड़े "स्ट्रिंग्स . को संसाधित करने की बात आती है तो आपके हाथ बंधे होते हैं ". इस स्थिति में आप dbms_xmlgen
. पर जा सकते हैं पैकेज और convert()
विशेष रूप से फ़ंक्शन, जिसमें एक अतिभारित संस्करण है जो CLOB
. को स्वीकार करने में सक्षम है एस। यहाँ एक उदाहरण है:
select dbms_xmlgen.convert(
xmlagg(xmlelement(root
, xmlelement(node1, '>')
, xmlelement(node2, '<')
)
).extract('//text()').getclobval()
, 1) as res
from dual
connect by level <= 3000; -- 1 (second parameter of the convert() function)
-- instructs function to decode entities
परिणाम:
RES
------------------------------------------------------
><><><><><><><><><><><><><><><><><><><><><><><><><>
-- ... the rest of the CLOB