sql >> Databáze >  >> RDS >> Oracle

Použití GROUP BY s XMLCast a XMLQuery poskytuje ORA-22950

Aby bylo možné agregovat pomocí hodnoty, musí být hodnota setříditelná/hashovatelná, což znamená, že jakékoli dvě hodnoty musí být srovnatelné (aby mohly být seřazeny/hashovány). XMLType není tříditelné/hašovatelné. Objekt/třída v Oracle je hashovatelná/tříditelná, když má jednu ze speciálních funkcí map nebo order definovaný. Viz příslušná dokumentace Oracle .

Agregujete prostřednictvím xcol , což je XMLType hodnota. Řešením vašeho problému by tedy bylo agregovat něco jiného.

Na základě chaotických informací, které nám poskytujete, mě napadají dvě řešení ...

Řešení 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;

Řešení 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. MySQL vs Microsoft SQL

  2. Jak programově identifikujete závislosti uložené procedury?

  3. JComboBox upraví index pomocí DefaultComboBoxModel

  4. Řešení kódu chyby:1005. Nelze vytvořit tabulku '' (chyba:150) Chyba