Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment puis-je obtenir la valeur CDATA à partir de xml

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.

db<>violon