Die Extraktionsfunktion ist seit langem veraltet (mindestens seit 11gR2 - siehe Hinweis in dieser Dokumentation).
Wenn Sie mehrere Werte haben und mehr als einen sehen möchten, können Sie XMLTable verwenden, das das CDATA-Rauschen entfernt (aber möglicherweise eine Kürzung erforderlich ist, da Sie Leerzeichen in den Werten haben):
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
Wenn Sie auf einen einzelnen Wert abzielen, können Sie auch xmlquery verwenden, das näher an Ihrem Extrakt liegt:
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
Hier habe ich nach dem Geburtstag gesucht, den Sie als Text in einem Knoten haben wollten, und den passenden Namen erhalten. aber da das immer noch die CDATA hat, ist es ungefähr das gleiche wie das, was Sie hatten. Also habe ich einen regulären Ausdruck verwendet, um den CDATA-Teil zu entfernen, obwohl Sie auch substr/instr verwenden könnten, wenn es um die Leistung geht.