Chức năng trích xuất đã không được chấp nhận trong một thời gian dài (ít nhất là kể từ khi 11gR2 - xem ghi chú trong tài liệu đó).
Nếu bạn có nhiều giá trị và có thể muốn xem nhiều giá trị, bạn có thể sử dụng XMLTable để loại bỏ nhiễu CDATA (nhưng có thể cần cắt bớt vì bạn có khoảng trắng trong các giá trị):
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
Nếu bạn đang nhắm mục tiêu một giá trị duy nhất, bạn cũng có thể sử dụng xmlquery, gần với phần trích xuất của bạn hơn:
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
Đây là tôi đã tìm ngày sinh mà bạn muốn dưới dạng văn bản trong một nút và có tên phù hợp; nhưng vì nó vẫn có CDATA, nó gần giống với những gì bạn có. Vì vậy, tôi đã sử dụng một biểu thức chính quy để loại bỏ phần CDATA, mặc dù bạn cũng có thể sử dụng substr / hướng dẫn nếu hiệu suất là vấn đề đáng lo ngại.