No debe intentar evitar la inyección de SQL solo en el nivel de la base de datos. Una vez que llegaron allí, en su mayoría ya te atraparon. Debe usar parámetros, enmascarar la entrada y eliminar los caracteres malos que ya están en la capa superior. Las herramientas (¿Frameworks?) como Entity Framework eliminan automáticamente los caracteres peligrosos.
Usando DBMS_ASSERT.ENQUOTE_NAME
lo está haciendo muy bien aquí, pero recomendaría hacer esto también en las capas de arriba.
Regla general (que sigues aquí):Utiliza mecanismos de seguridad establecidos y probados, ¡no los reinventes!
Además, una declaración como
select * from users where username = 'IAm"WayUp';
es absolutamente legal y no es peligroso.
¿Y cómo llamas a la función/procedimiento en la base de datos? Eres vulnerable ahí también, ¿no?.