concat()
SQL-funktionen sammanfogar två värden, så det är bara att lägga till semikolon till varje extraherat värde oberoende av varandra. Men du försöker verkligen göra strängaggregering av resultaten (som förmodligen kan vara mer än två extraherade värden).
Du kan använda XMLQuery istället för extrahera och använda en XPath string-join()
funktion för att göra sammanfogningen:
XMLQuery('string-join(/A/B, ";")' passing xmltype(a.xml) returning content)
Demo med fasta XMl-ändnodstaggar:
-- CTE for sample data
with a (xml) as (
select '<A><B>123</B><C>456</C><B>789</B></A>' from dual
)
-- actual query
select XMLQuery('string-join(/A/B, ";")' passing xmltype(a.xml) returning content) as result
from a;
RESULT
------------------------------
123;789
Du kan också extrahera alla individuella <B>
värden med XMLTable och använd sedan aggregering på SQL-nivå:
-- CTE for sample data
with a (xml) as (
select '<A><B>123</B><C>456</C><B>789</B></A>' from dual
)
-- actual query
select listagg(x.b, ';') within group (order by null) as result
from a
cross join XMLTable('/A/B' passing xmltype(a.xml) columns b number path '.') x;
RESULT
------------------------------
123;789
vilket ger dig mer flexibilitet och skulle tillåta gruppering efter andra nodvärden lättare, men det verkar inte behövas här baserat på ditt exempelvärde.