oracle sql: собрать агрегацию

Я хочу сгруппировать свои записи базы данных по атрибуту и ​​знать, какие записи находятся в каждой группе одновременно. Я собираю идентификаторы сгруппированных записей с помощью функции Oracle COLLECT СБОР Функция

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;

Но затем я получаю сообщение об ошибке:

Отчет об ошибке -
ORA-06550: строка 5, столбец 44:
PL/SQL: ORA-00902: неверный тип данных
ORA-06550: строка 5, столбец 5:
PL/SQL: SQL Оператор проигнорирован
06550. 00000 - "строка %s, столбец %s:\n%s"
*Причина: обычно ошибка компиляции PL/SQL.
*Действие:

Что здесь не так?


person Ewgenij Sokolovski    schedule 20.07.2018    source источник
comment
Для начала, почему вы объявляете тип для number(19,0). Во-вторых, вам нужно представить, как выглядит rechnungsdaten (определение таблицы).   -  person FDavidov    schedule 20.07.2018
comment
Я исправил это, теперь это список чисел: TYPE ids_type IS TABLE OF number(19, 0); Rechnungsdaten имеет много атрибутов, но статус — это varchar2 (35 символов), а id — это число (19, 0).   -  person Ewgenij Sokolovski    schedule 20.07.2018
comment
Что ж, в вашем операторе select вы пытаетесь преобразовать значение (`r.id) в тип таблицы. Это, конечно, НЕ юридическое заявление.   -  person FDavidov    schedule 20.07.2018
comment
Я делаю это с помощью функции сбора, как это описано в документации по сбору, не так ли?   -  person Ewgenij Sokolovski    schedule 20.07.2018
comment
Ну, если вы хотите заполнить локальную таблицу содержимым столбца в другой таблице, вы можете просто использовать последовательность INSERT INTO .... SELECT xyz FROM .... В ORACLE вы можете иметь вложенные таблицы (т. е. столбец таблицы может быть таблицей сам по себе), и я думаю, что это основное использование функции COLLECT (это всего лишь предположение, и я могу ошибаться).   -  person FDavidov    schedule 20.07.2018


Ответы (1)


Вы не можете использовать функцию 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;

Используйте простой запрос LISTAGG, чтобы просмотреть список идентификаторов в виде строки.

SELECT
    r.status,
    LISTAGG(r.id,',') WITHIN GROUP(
            ORDER BY
                id
        )
FROM
    rechnungsdaten r
GROUP BY
    r.status;

Демо

person Kaushik Nayak    schedule 20.07.2018