まず第一に、ドキュメントと実際の機能は少し同期していないため、「公式ソース」は詳細に光を当てません。
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(即時実行用)の2つに分割されました。 DML用のものに関心があります。
したがって、10gの場合、ドキュメントによるとテーブルの単一行を返す式である単一行式がありました。 。 DMLステートメントが単一の行に影響を与える必要があるのか、それともステートメントの実行後に単一の行を導出できるのか(たとえば、集計関数を使用して)は微妙な問題です。 DML操作が単一の行に影響を与える場合(bulk collect into
とは対照的に)、この構文を使用するというアイデアだったと思います。 );影響を受ける行に対して単一の行を返す集計関数を使用していません。
したがって、句に戻る際の集計関数は明確に文書化されていません。さらに、11gの場合、キーワードを返した後に列名だけが表示されることがあるため、abs(column_name)のような式でも、実際には機能しますが、aggregate_function(column_name)は言うまでもありません。
したがって、厳密に言えば、特に11g、12c、18cの場合、集計関数を使用したこの機能は文書化されておらず、信頼することはできません。
代わりに、「一括収集」(および集合演算子を使用して要素の個別のセットを取得)を使用できます
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.
エラーメッセージにも注意してください。はっきりと書いてあります
この例のように「明確に許可されていない」だけではありません
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