Uso RETURNING INTO do Oracle em Java (JDBC, Instrução Preparada)

Estou usando o JDBC para executar a instrução Oracle, que se parece com isso:

"INSERT INTO MYTABLE(MYDATA) VALUES(?) RETURNING MY_CALCULATED_DATA INTO ?"
// MYTABLE's def makes MY_CALCULATED_DATA be auto-generated by DB on insert

Eu encontrei várias maneiras de chamar a declaração acima em Java, principalmente:

Usando o OraclePreparedStatement:

ps = (OraclePreparedStatement)conn.prepareStatement(sql);
ps.setString(1, "myvalue");
ps.registerReturnParameter(2, Types.VARCHAR);
ps.execute();
rs = ps.getReturnResultSet();
rs.next();
System.out.print(rs.getString(1));

Usando o CallableStatement:

cs = conn.prepareCall(sql);
cs.setString(1, "myvalue");
cs.registerOutParameter(2, Types.VARCHAR);
cs.execute();
System.out.print(cs.getString(1));
Questões:Método # 2 lança"SQLException: Nem todos os parâmetros de retorno registrados", MAS, se eu envolver a instrução SQL em "BEGIN..END;"- então o método # 2 funciona muito bem.Por que o método # 1 funciona sem "BEGIN..END"mas o método # 2 requer"BEGIN..END" trabalhar?Que tipo de "mágica"?BEGIN..END"faz para a declaração para que" nem todos os parâmetros registrados "problema de repente resolve-se?

Existe algum terceiro método melhor de fazer o acima?

Obrigado AG.

questionAnswers(2)

yourAnswerToTheQuestion