Функция SQL concat()
объединяет два значения, поэтому просто добавляет точку с запятой к каждому извлеченному значению независимо. Но вы действительно пытаетесь выполнить агрегацию строк результатов (которые, возможно, на самом деле могут быть более двух извлеченных значений).
Вы можете использовать XMLQuery вместо извлечения и использовать функцию XPath string-join()
для объединения:
XMLQuery('string-join(/A/B, ";")' passing xmltype(a.xml) returning content)
Демонстрация с фиксированными тегами конечных узлов XMl:
-- 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
Вы также можете извлечь все отдельные значения <B>
, используя XMLTable, а затем использовать агрегацию на уровне 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
, который дает вам больше гибкости и позволяет более легко группировать по другим значениям узла, но это, как представляется, не требуется здесь на основе значения вашего примера.