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;