oracle sql:收集聚合

Ewg*_*ski 4 oracle plsql group-by collect

我想按属性对我的数据库条目进行分组,并同时知道每个组中有哪些条目。我使用 Oracle COLLECT 函数COLLECT 函数收集分组条目的 ID

DECLARE
  TYPE ids_type IS TABLE OF number(19, 0);   
  ids ids_type;
BEGIN 
  select cast(collect(r.id) as ids_type) into ids from rechnungsdaten r group by r.status;
END;
Run Code Online (Sandbox Code Playgroud)

但后来我得到了错误:

错误报告 -
ORA-06550:第 5 行,第 44 列:
PL/SQL:ORA-00902:无效数据类型
ORA-06550:第 5 行,第 5 列:
PL/SQL:SQL 语句被忽略
06550。00000 -“行 %s,列%s:\n%s"
*原因:通常是 PL/SQL 编译错误。
*行动:

这里有什么问题?

Kau*_*yak 5

不能COLLECT在 PL/SQL 匿名块中声明的类型上使用函数。您还有其他选择,例如

创建数据库类型并运行您的收集查询。

create or replace TYPE ids_type IS TABLE OF number(19, 0);
SELECT
    r.status,
    CAST(COLLECT(r.id) AS ids_type)
FROM
    rechnungsdaten r
GROUP BY
    r.status;
Run Code Online (Sandbox Code Playgroud)

使用简单的LISTAGG查询以字符串形式查看 id 列表

SELECT
    r.status,
    LISTAGG(r.id,',') WITHIN GROUP(
            ORDER BY
                id
        )
FROM
    rechnungsdaten r
GROUP BY
    r.status;
Run Code Online (Sandbox Code Playgroud)

演示