Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Używanie GROUP BY z XMLCast i XMLQuery daje ORA-22950

Aby agregować za pomocą wartości, wartość musi być możliwa do sortowania/haszowania według, co oznacza, że ​​dowolne dwie wartości muszą być porównywalne (aby można było je posortować/zahaszować). XMLType nie można sortować / haszować. Obiekt/klasę w Oracle można haszować/sortować, gdy ma jedną ze specjalnych funkcji map lub order zdefiniowane. Zobacz odpowiednią dokumentację Oracle .

Agregujesz przez xcol , który jest XMLType wartość. Tak więc rozwiązaniem Twojego problemu będzie agregacja za pomocą czegoś innego.

W oparciu o chaotyczne informacje, które nam przekazujesz, przychodzą mi do głowy dwa rozwiązania ...

Rozwiązanie 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;

Rozwiązanie 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Co zrobić, jeśli podczas korzystania ze sterownika Easysoft Oracle ODBC w wersji OCI nie można otworzyć pliku obiektu współdzielonego?

  2. Zwiększenie grupy dysków VOTE w ASM dla aktualizacji GI 12.2

  3. Warunki (jak jak) na polu binarnym (blob) w oracle

  4. Jak zmienić nazwę klucza podstawowego w Oracle, aby można go było ponownie użyć?

  5. Jak określić nazwę hosta w Oracle APEX?