Прежде всего, документация и фактическая функциональность немного не синхронизированы, поэтому «официальные источники» не проливают свет на детали.
Синтаксическая схема для 10g R2 (https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/returninginto_clause.htm) ниже
В 11g (https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/returninginto_clause.htm) это было разделено на два: static_returning_clause (для вставки, обновления, удаления) и dynamic_returning_clause (для немедленного выполнения). Нас интересует один для DML.
Таким образом, для 10g существовало единственное выражение строки, которое согласно документации Выражение, которое возвращает одну строку таблицы . Сложно задать вопрос, должен ли оператор DML влиять на одну строку, или же одна строка может быть получена после выполнения оператора (скажем, с помощью агрегатных функций). Я предполагаю, что идея состояла в том, чтобы использовать этот синтаксис, когда операция DML влияет на одну строку (в отличие от bulk collect into
); не использует агрегатные функции, которые возвращают одну строку для затронутых строк.
Таким образом, агрегатные функции при возвращении в предложение четко не документированы. Более того, для 11g после возврата ключевого слова может появиться только имя столбца, поэтому даже выражение вроде abs (column_name) не может не упоминать aggregate_function (column_name), хотя в действительности это работает.
Итак, строго говоря, эта функциональность с агрегатными функциями не документирована, особенно для 11g, 12c, 18c, и вы не можете на нее полагаться.
Вместо этого вы можете использовать «массовый сбор в» (и оператор set для получения различного набора элементов)
SQL> create type str_tab as table of varchar2(4000)
2 /
Type created.
SQL> set serveroutput on
SQL> declare
2 i int;
3 a str_tab;
4 begin
5 delete from t returning val bulk collect into a;
6 dbms_output.put_line('cnt all ' || a.count || ' cnt distinct ' || set(a).count);
7 rollback;
8 end;
9 /
cnt all 4 cnt distinct 2
PL/SQL procedure successfully completed.
Обратите также внимание на сообщение об ошибке. Это ясно говорит
ORA-00934: группа функция здесь не разрешена
Не просто "не разрешено отличное", как в этом примере
SQL> select listagg(distinct val) within group (order by val) str from t;
select listagg(distinct val) within group (order by val) str from t
*
ERROR at line 1:
ORA-30482: DISTINCT option not allowed for this function