Afin d'agréger via une valeur, la valeur doit être triable/hachable par, ce qui signifie que deux valeurs doivent être comparables (afin d'être triées/hachées). XMLType
n'est pas triable/hachable. Un objet/classe dans Oracle est hachable/triable lorsqu'il a l'une des fonctions spéciales map
ou order
défini. Voir la documentation Oracle correspondante
.
Vous agrégez via xcol
, qui est un XMLType
évaluer. Donc, une solution à votre problème serait d'agréger via autre chose.
D'après les infos chaotiques que vous nous donnez, deux solutions me viennent à l'esprit...
Solution 1
WITH xdata AS
(SELECT 1 AS a_id,
xmltype ('<a>
<b>
<b_id>1</b_id>
<val>2</val>
</b>
<b>
<b_id>1</b_id>
<val>3</val>
</b>
</a>') AS xcol
FROM DUAL
UNION ALL
SELECT 2 AS a_id,
xmltype ('<a>
<b>
<b_id>3</b_id>
<val>5</val>
</b>
<b>
<b_id>4</b_id>
<val>4</val>
</b>
</a>') AS xcol
FROM DUAL)
SELECT a_id,
sum(XMLCAST (
XMLQUERY ('sum($doc/a/b/val)'
PASSING xcol AS "doc" RETURNING CONTENT) AS INTEGER))
b_val
FROM xdata
group by a_id;
Solution 2
WITH xdata AS
(SELECT 1 AS a_id,
xmltype ('<a>
<b>
<b_id>1</b_id>
<val>2</val>
</b>
<b>
<b_id>1</b_id>
<val>3</val>
</b>
</a>') AS xcol
FROM DUAL
UNION ALL
SELECT 2 AS a_id,
xmltype ('<a>
<b>
<b_id>3</b_id>
<val>5</val>
</b>
<b>
<b_id>4</b_id>
<val>4</val>
</b>
</a>') AS xcol
FROM DUAL)
select X.a_id, sum(Y.b_val) as b_val
from xdata X
cross join xmltable(
'/a/b'
passing X.xcol
columns
b_val integer path 'val'
) Y
group by X.a_id;