Fungsi ekstrak sudah lama tidak digunakan lagi (setidaknya sejak 11gR2 - lihat catatan dalam dokumentasi itu).
Jika Anda memiliki beberapa nilai dan mungkin ingin melihat lebih dari satu, Anda dapat menggunakan XMLTable, yang menghilangkan gangguan CDATA (tetapi mungkin perlu dipangkas karena Anda memiliki spasi dalam nilai):
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
Jika Anda menargetkan satu nilai, Anda juga dapat menggunakan xmlquery, yang lebih dekat dengan ekstrak Anda:
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
Di sini saya telah mencari ulang tahun yang Anda inginkan sebagai teks dalam sebuah simpul, dan mendapatkan nama yang cocok; tetapi karena masih memiliki CDATA, kira-kira sama dengan yang Anda miliki. Jadi, saya telah menggunakan ekspresi reguler untuk menghapus bagian CDATA, meskipun Anda juga dapat menggunakan substr/instr jika kinerja menjadi perhatian.