Oracle - RETORNO combinado con funciones agregadas
Oracle admiteRETURNING
cláusula que podría ser muy útil.
Por ejemplo para datos:
CREATE TABLE t(Id INT, Val varchar2(50));
INSERT INTO t(Id, Val)
SELECT 10,'a' FROM dual
UNION ALL SELECT 20,'b' FROM dual
UNION ALL SELECT 30,'a' FROM dual
UNION ALL SELECT 40,'b' FROM dual;
Consulta
DECLARE
l_cnt INT;
BEGIN
DELETE FROM t RETURNING COUNT(*) INTO l_cnt;
DBMS_OUTPUT.put_line('l_cnt: ' || l_cnt);
END;
l_cnt: 4
Es compatible con MIN / MAX / AVG / SUM / LISTAGG:
DECLARE
l_max INT;
l_min INT;
l_str VARCHAR2(100);
BEGIN
DELETE FROM t
RETURNING MAX(id), MIN(id), LISTAGG(id, ',') WITHIN GROUP(ORDER BY id)
INTO l_max, l_min, l_str;
DBMS_OUTPUT.put_line('l_max:'||l_max||' l_min:'||l_min||' l_str:'|| l_str);
END;
l_max: 40 l_min: 10 l_str: 10,20,30,40
Desafortunadamente cuando se combina conDISTINCT
palabra clave me sale un error:
DECLARE
l_distinct_cnt INT;
BEGIN
DELETE FROM t
RETURNING COUNT(DISTINCT val) INTO l_distinct_cnt ;
DBMS_OUTPUT.put_line('l_distinct_cnt:' || l_distinct_cnt );
END;
ORA-00934: la función de grupo no está permitida aquí
a pregunta es por qué las funciones agregadas conDISTINCT
no están permitidos? Estoy buscando una respuesta de fuentes oficiales.
EDITAR
Tenga en cuenta queCOUNT(DISTINCT ...)
fue solo un ejemplo. El mismo comportamiento es paraSUM(col)/SUM(DISTINCT col)
y cualquier función agregada que admitaDISTINCT
palabra clave.