Le concat()
La fonction SQL concatène deux valeurs, il suffit donc d'ajouter le point-virgule à chaque valeur extraite indépendamment. Mais vous essayez vraiment de faire une agrégation de chaînes des résultats (ce qui pourrait vraisemblablement être plus de deux valeurs extraites).
Vous pouvez utiliser XMLQuery au lieu d'extraire et utiliser un XPath string-join()
fonction pour faire la concaténation :
XMLQuery('string-join(/A/B, ";")' passing xmltype(a.xml) returning content)
Démo avec des balises de nœud final XML fixes :
-- 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
Vous pouvez également extraire tous les <B>
individuels valeurs à l'aide de XMLTable, puis utilisez l'agrégation au niveau 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
ce qui vous donne plus de flexibilité et permettrait un regroupement plus facile par d'autres valeurs de nœud, mais cela ne semble pas être nécessaire ici en fonction de votre exemple de valeur.