我使用JDBC执行Oracle语句,如下所示:
"INSERT INTO MYTABLE(MYDATA) VALUES(?) RETURNING MY_CALCULATED_DATA INTO ?"
// MYTABLE's def makes MY_CALCULATED_DATA be auto-generated by DB on insert
我在Java中找到了几种方法来调用上面的语句,主要是:
>使用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));
>使用CallableStatement:
cs = conn.prepareCall(sql);
cs.setString(1,"myvalue");
cs.registerOutParameter(2,Types.VARCHAR);
cs.execute();
System.out.print(cs.getString(1));
问题:
>方法#2抛出“sqlException:不是所有返回参数注册”,但是,如果我将sql语句包装到“BEGIN..END;” – 然后方法#2工作正常.
>为什么方法#1没有“BEGIN..END”,但方法#2需要“BEGIN..END”才能正常工作?
>什么样的“魔法”“BEGIN..END”对声明做出了“不是所有参数注册”的问题突然解决了?
>有没有第三,更好的做上述方法?
谢谢,
AG.