No mundo Oracle, a ordem geral de desenvolvimento deve ser:
Sempre que possível, faça-o puramente com SQL. Se você precisar de mais do que SQL, faça-o com PL/SQL. Se você precisar de algo que PL/SQL não pode fazer, use Java. Se tudo mais falhar, use C. Se você não puder faça isso com C, volte lentamente para longe do problema....
Os procedimentos armazenados PL/SQL são uma excelente maneira de mover sua lógica de negócios para uma camada que será acessível por qualquer tecnologia de integração. A lógica de negócios em um pacote (não escreva funções e procedimentos autônomos - eles crescerão ao longo do tempo de maneira não gerenciável) pode ser executado por Java, C#, PL/SQL, ODBC e assim por diante.
PL/SQL é a maneira mais rápida de lançar grandes blocos de dados fora do SQL puro. Os recursos "Bulk Binding" significam que funciona muito bem com o mecanismo SQL.
Os procedimentos armazenados Java são melhores para criar funcionalidades que interagem com a rede ou o sistema operacional. Exemplos seriam enviar e-mails, enviar dados por FTP, enviar arquivos de texto e compactar, executar linhas de comando do host em geral.
Eu nunca tive que codificar nenhum C ao trabalhar com Oracle, mas presumivelmente ele poderia ser usado para integração com aplicativos legados.