La fonction d'extraction est obsolète depuis longtemps (au moins depuis 11gR2 - voir la note dans cette documentation).
Si vous avez plusieurs valeurs et que vous souhaitez en voir plusieurs, vous pouvez utiliser XMLTable, qui supprime le bruit CDATA (mais peut nécessiter une réduction car vous avez des espaces dans les valeurs) :
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
Si vous ciblez une seule valeur, vous pouvez également utiliser xmlquery, qui est plus proche de votre extrait :
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
Voici que j'ai cherché l'anniversaire que vous vouliez sous forme de texte dans un nœud et j'ai obtenu le nom correspondant; mais comme cela a toujours le CDATA, c'est à peu près le même que ce que vous aviez. J'ai donc utilisé une expression régulière pour supprimer la partie CDATA, bien que vous puissiez également utiliser substr/instr si les performances sont un problème.