sql >> Database teknologi >  >> RDS >> Oracle

Brug af GROUP BY med en XMLCast og XMLQuery giver ORA-22950

For at aggregere via en værdi, skal værdien være sorterbar/hashbar efter, hvilket betyder, at to værdier skal være sammenlignelige (for at blive sorteret/hashed). XMLType er ikke sorterbar/hashbar. Et objekt/klasse i Oracle er hashbar/sortérbar, når den har en af ​​specialfunktionerne map eller order defineret. Se den respektive Oracle-dokumentation .

Du samler via xcol , som er en XMLType værdi. Så en løsning på dit problem ville være at samle via noget andet.

Baseret på den kaotiske information, du giver os, dukker jeg op to løsninger ...

Løsning 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;

Løsning 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;


  1. FEJL 1366 (HY000):Forkert strengværdi:'\xF0\x9F\x98\x9C' for kolonne 'kommentar' i række 1

  2. Brug af Oracle JDeveloper Snippets med MySQL

  3. Hvordan konfigurerer jeg HikariCP til postgresql?

  4. SQLite ÆNDRINGSTABEL