Você deve revisar todos os comandos RAISE que causam exceções pré-definidas, porque normalmente esse é um sinal de lógica ruim. Considere esse exemplo:
CREATE OR REPLACE FUNCTION grupo_tem_usuario(id IN NUMBER) RETURN BOOLEAN IS tem_usuario BOOLEAN; usuario_id usuario_grupo.usuario_id%TYPE; BEGIN BEGIN SELECT usuario_grupo.usuario_id INTO grupo_id FROM usuario_grupo WHERE usuario_grupo.grupo_id = id; RAISE TOO_MANY_ROWS; EXCEPTION WHEN NO_DATA_FOUND THEN tem_usuario := FALSE; WHEN TOO_MANY_ROWS THEN tem_usuario := TRUE; END; RETURN tem_usuario; END;
Nesse caso, a exceção TOO_MANY_ROWS está sendo usada como mecanismo de controle de fluxo. Essa função poderia ser reescrita para evitar o comando RAISE:
CREATE OR REPLACE FUNCTION grupo_tem_usuario(id IN NUMBER) RETURN BOOLEAN IS numero_de_usuarios NUMBER; BEGIN BEGIN SELECT COUNT(*) INTO numero_de_usuarios FROM usuario_grupo WHERE usuario_grupo.grupo_id = id; EXCEPTION WHEN OTHERS THEN numero_de_usuarios := 0; END; RETURN numero_de_usuarios > 0; END;