If you don't care about saving the output, this can be done simply without the need for recursion:
SQL> select
2 translate(
3 initcap('newyork is a BEAUTIFUL city')
4 , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz'
5 , 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
6 )
7 from dual
8 /
TRANS
-----
NIABC
SQL>
If the sentence contains numbers, punctuation marks, etc., we would have to add these characters to the first replacement line, which could become quite tedious.