Oracle
 sql >> Database >  >> RDS >> Oracle

Come posso ottenere il valore CDATA da xml

La funzione di estrazione è stata deprecata per molto tempo (almeno da 11gR2 - vedere la nota in tale documentazione).

Se hai più valori e potresti volerne vedere più di uno, puoi usare XMLTable, che rimuove il rumore CDATA (ma potrebbe aver bisogno di un ritaglio dato che hai spazi nei valori):

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

Se stai prendendo di mira un singolo valore, puoi anche utilizzare xmlquery, che è più vicino alla tua estrazione:

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

Ecco che ho cercato il compleanno che volevi come testo all'interno di un nodo e ho ottenuto il nome corrispondente; ma poiché ha ancora il CDATA, è più o meno lo stesso di quello che avevi. Quindi, ho usato un'espressione regolare per rimuovere la parte CDATA, anche se potresti anche usare substr/instr se le prestazioni sono un problema.

db<>violino