Porque os parâmetros especificados nas cláusulas de retorno são tratados de uma maneira diferente em comparação com os parâmetros de saída normais (getReturnResultSet vs getResultSet vs retornando parâmetros em um callablestatement).
Eles precisam ser tratados com OraclePreparedStatement. No segundo caso, quando você envolve a instrução insert em begin..end, a inserção é tratada pelo próprio banco de dados e al jdbc vê é um bloco plsql anônimo.
http://docs.oracle.com/cd/E11882_01 /java.112/e16548/oraint.htm#BABJJDDA