Oracle返回Java中的用法(JDBC,准备语句)

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

我使用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));

问题:

  1. 方法#2抛出“SQLException:并不是所有的返回参数都被注册了”但是,如果我把SQL语句包装到“ BEGIN..END; ”中 - 那么方法#2工作得很好。
    • 为什么方法#1在没有“ BEGIN..END ”的情况下工作,但方法#2需要“ BEGIN..END ”才能工作?
    • 什“ BEGIN..END ”对声明做了什么,以便“并非所有参数注册”问题突然解决了?

  2. 有没有第三个更好的方法来做到这一点?

提问于
用户回答回答于

为了获得自动生成的密钥,我们在预语句中有getGeneratedKeys方法,它返回包含键值的结果集,我们所需要的只是将键列名传递给前置语句。

pstm = con.prepareStatement("insert query",new String[]{primarykeycolumnname});
int i = pstm.executeUpdate();
if (i > 0) 
{
    ResultSet rs = pstm.getGeneratedKeys();
    while(rs.next())
    {
        System.out.println(rs.getString(1)); 
    }
}
用户回答回答于

由于返回子句中指定的参数与普通输出参数(getReturnResultSet vs getResultSet与可调用语句中返回参数)的处理方式不同。 他们需要使用OraclePreparedStatement进行处理。在第二种情况下,当你将insert语句包装在begin..end中时,插入由数据库本身处理,并且al jdbc看到的是一个匿名的plsql块。 http://docs.oracle.com/cd/E11882_01/java.112/e16548/oraint.htm#BABJJDDA

扫码关注云+社区