Quando as coisas funcionam em blocos anônimos, mas não em procedimentos armazenados, geralmente é por causa dos direitos do definidor versus os direitos do invocador. Blocos anônimos e procedimentos de direitos do invocador podem usar privilégios concedidos por meio de funções, mas os procedimentos de direitos do definidor não podem.
Tente alterar
return varchar2 is
para return varchar2 authid current_user is
.