我似乎无法找到正确的魔法组合来完成这项工作:
OracleDataSource ods = new oracle.jdbc.pool.OracleDataSource();
ods.setURL("jdbc:oracle:thin:app_user/pass@server:1521:sid");
DefaultContext conn = ods.getConnection();
CallableStatement st = conn.prepareCall("INSERT INTO tableA (some_id) VALUES (1) RETURNING ROWID INTO :rowid0");
st.registerReturnParameter(1, OracleTypes.ROWID);
st.execute();
我收到的错误是“违反协议(protocol)”。如果我更改为 registerOutParameter(),我会收到通知说我还没有注册所有返回变量。如果我将语句包装在 PL/SQL begin 中;结尾; block 然后我使用常规的 registerOutParameter() 调用获得参数就好了。我真的更愿意避免在 PL/SQL 中包装我的所有插入语句 - 那么上面缺少什么?
最佳答案
通常您不想让代码依赖于数据库。您应该使用 CallableStatement 而不是 OraclePreparedStatement。
CallableStatement statement = connection.prepareCall("{call INSERT INTO tableA (some_id) VALUES (1) RETURNING ROWID INTO ? }");
statement.registerOutParameter( 1, Types.VARCHAR );
int updateCount = statement.executeUpdate();
if (updateCount > 0) {
return statement.getString(1);
}
关于java - 使用 JDBC 连接到 oracle 从插入语句返回 ROWID 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/682539/