2

を使用してサマリー ロジックを含むレポートを作成していますが、次のGROUPING SETSエラーが発生します。

SELECT c1, c2, c3, SUM(c4) AS MySum
FROM TABLE(get_data()) src
GROUP BY GROUPING SETS ((c1, c2, c3), (c1, c2), c1, c2, ());

-------------------------
ORA-00932: inconsistent datatypes: expected NUMBER got XXX.MYROW
00932. 00000 -  "inconsistent datatypes: expected %s got %s"

以下のみを含めるc1か、c2個別に使用すると問題なく動作します。

GROUP BY GROUPING SETS ((c1, c2, c3), (c1, c2), c1, ());  
GROUP BY GROUPING SETS ((c1, c2, c3), (c1, c2), c2, ());

t1テーブルから直接クエリを取得しても問題なく動作します。

SELECT c1, c2, c3, SUM(c4) AS MySum
FROM t1 src
GROUP BY GROUPING SETS ((c1, c2, c3), (c1, c2), c1, c2, ());

私は何が欠けていますか?何だかシンプルな気がします。これが私のセットアップの簡単な例です:

-- Base table
CREATE TABLE t1 (c1 VARCHAR(10), c2 VARCHAR(10), c3 VARCHAR(10), c4 INTEGER);

-- Row type
CREATE TYPE myrow AS OBJECT (c1 VARCHAR(10), c2 VARCHAR(10), c3 VARCHAR(10), c4 INTEGER);

-- Table type
CREATE OR REPLACE TYPE mytable AS TABLE OF myrow;

-- Get data function
CREATE OR REPLACE FUNCTION get_mydata
RETURN mytable PIPELINED AS
BEGIN
  FOR v_rec IN (
    SELECT c1, c2, c3, c4
    FROM t1
  ) LOOP
    PIPE ROW (myrow(v_Rec.c1, v_Rec.c2, v_Rec.c3, v_Rec.c4));
  END LOOP;
    
  RETURN;    
END;

DB バージョン - 12.1.0

実際の関数で発生する別のエラーを更新
します(「マテリアライズ」ヒントを使用しても):

ORA-22905: cannot access rows from a non-nested table item 22905. 
00000  -  "cannot access rows from a non-nested table item" 
*Cause: attempt to access rows of an item whose type is not known 
at parse time or that is not of a nested table type 
*Action: use CAST to cast the item to a nested table type
4

2 に答える 2

2

うまくいかない理由はわかりませんが、この回避策が役立つかどうかを確認してください (CTE とmaterializeヒントを使用してください):

SQL> with test as
  2    (select /*+ materialize */
  3      c1, c2, c3, c4
  4     from table(get_mydata()) src
  5    )
  6  select c1, c2, c3, sum(c4) as mysum
  7  from test
  8  group by grouping sets ((c1, c2, c3), (c1, c2), c1, c2, ());

C1         C2         C3              MYSUM
---------- ---------- ---------- ----------
1          2          3                   4
1                                         4
           2                              4
                                          4
1          2                              4

SQL>
于 2021-01-04T13:51:32.517 に答える