एक्स्ट्रेक्ट फ़ंक्शन को लंबे समय से हटा दिया गया है (कम से कम 11gR2 - उस दस्तावेज़ में नोट देखें)।
यदि आपके पास एकाधिक मान हैं और आप एक से अधिक देखना चाहते हैं तो आप XMLTable का उपयोग कर सकते हैं, जो सीडीएटीए शोर को हटा देता है (लेकिन आपके पास मानों में रिक्त स्थान होने के कारण ट्रिम की आवश्यकता हो सकती है):
select x.stu_name, x.birthday,
trim(stu_name) as stu_name2, to_char(x.birthday,'YYYY-MM-DD') as birthday2
from your_table t
cross join xmltable ('/RESPONSE/INFO' passing t.doc
columns
stu_name varchar2(30) path 'STU_NAME',
birthday date path 'BIRTHDAY'
) x
where x.stu_name like '%M%'
STU_NAME BIRTHDAY STU_NAME2 BIRTHDAY2
-------- --------- --------- ---------
Maria 12-MAR-12 Maria 2012-03-12
यदि आप किसी एकल मान को लक्षित कर रहे हैं तो आप xmlquery का भी उपयोग कर सकते हैं, जो आपके उद्धरण के करीब है:
select regexp_replace(
xmlquery('/RESPONSE/INFO[contains(BIRTHDAY, "2012-03-12")]/STU_NAME/text()'
passing doc
returning content),
'<!\[CDATA\[ *(.*?) *\]\]>', '\1') as stu_name
from your_table t
STU_NAME
--------
Maria
यहां मैंने उस जन्मदिन की तलाश की है जिसे आप नोड के भीतर टेक्स्ट के रूप में चाहते थे, और मेल खाने वाला नाम मिला; लेकिन जैसा कि अभी भी सीडीएटीए है, यह लगभग वैसा ही है जैसा आपके पास था। इसलिए, मैंने सीडीएटीए भाग को अलग करने के लिए नियमित अभिव्यक्ति का उपयोग किया है, हालांकि यदि प्रदर्शन चिंता का विषय है तो आप सबस्ट्र/इंस्ट्र का भी उपयोग कर सकते हैं।