Você não deve tentar impedir a injeção de SQL apenas no nível do banco de dados. Uma vez que eles chegaram lá, eles já pegaram você. Você deve usar parâmetros, entrada de máscara e remover caracteres ruins já na camada acima. Ferramentas (Frameworks?) como Entity Framework removem automaticamente caracteres perigosos.
Usando
DBMS_ASSERT.ENQUOTE_NAME
está indo muito bem aqui, mas eu recomendo fazer isso também nas camadas acima. Regra geral (que você segue aqui):Use mecanismos de segurança estabelecidos e comprovados, não os reinvente!
Além disso, uma afirmação como
select * from users where username = 'IAm"WayUp';
é absolutamente legal e não perigoso.
E como você chama a função/procedimento no banco de dados? Você é vulnerável lá também, não é?