O
concat()
A função SQL concatena dois valores, portanto, apenas anexa o ponto e vírgula a cada valor extraído de forma independente. Mas você está realmente tentando fazer agregação de strings dos resultados (o que pode, presumivelmente, ser mais do que dois valores extraídos). Você pode usar XMLQuery em vez de extrair e usar um XPath
string-join()
função para fazer a concatenação:XMLQuery('string-join(/A/B, ";")' passing xmltype(a.xml) returning content)
Demonstração com tags de nó final XML fixas:
-- 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
Você também pode extrair todos os
<B>
individuais valores usando XMLTable e, em seguida, use a agregação em nível de SQL:-- 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
o que lhe dá mais flexibilidade e permitiria o agrupamento por outros valores de nó mais facilmente, mas isso não parece ser necessário aqui com base no seu valor de exemplo.