sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo puedo obtener el valor CDATA de xml?

La función de extracción ha quedado obsoleta durante mucho tiempo (al menos desde 11gR2 - ver la nota en esa documentación).

Si tiene varios valores y desea ver más de uno, puede usar XMLTable, que elimina el ruido de CDATA (pero podría necesitar un recorte ya que tiene espacios en los valores):

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 está apuntando a un solo valor, también puede usar xmlquery, que está más cerca de su extracto:

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

Aquí está He buscado el cumpleaños que querías como texto dentro de un nodo y obtuve el nombre correspondiente; pero como todavía tiene el CDATA, es más o menos lo mismo que tenía. Entonces, he usado una expresión regular para eliminar la parte CDATA, aunque también podría usar substr/instr si el rendimiento es una preocupación.

db<>fiddle