java - 使用 JDBC 连接到 oracle 从插入语句返回 ROWID 参数

标签 java oracle jdbc

我似乎无法找到正确的魔法组合来完成这项工作:


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/

相关文章:

java - 在 Talend 中使用单列创建分层数据

oracle - 能够通过 localhost 而不是通过 IP 地址访问 Oracle 数据库

java.sql.SQLRecoverableException : The Network Adapter could not establish the connection

java - 如何计算数组列表中元素的重复次数?

java - 查询 MySQL 数据库并将整列存储在 ArrayList 中

java - 面板重绘方法未更新

java - 使用复杂业务逻辑和远程服务调用的 Bean 验证

java - 将文件写入桌面

sql - 'select *' 的默认 SQL 结果排序顺序是什么?

java - 从非常大的结果集中呈现数据的最佳方式是什么?