内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
我使用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中的上述语句,主要是:
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));
cs = conn.prepareCall(sql); cs.setString(1, "myvalue"); cs.registerOutParameter(2, Types.VARCHAR); cs.execute(); System.out.print(cs.getString(1));
为了获得自动生成的密钥,我们在预语句中有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