java - 使用 JDBC 在 Oracle 中检索最后插入的 ID

标签 java oracle jdbc oracle10g

我正在尝试在 JSP 中检索最后生成的自动增量 ID,例如 PHP mysql_insert_id()函数或 MySQL last_insert_id()使用 getGeneratedKeys() 的函数question中提到的方法(虽然我使用的是 Oracle 10g)。

我在 Oracle 数据库中有一个 TRANSPORTER 表,它有一个名为 TRANSPORTER_ID 的列,类型为 NUMBER(35, 0),它映射到Java 中的 BigDecimal 类型,它是一个序列生成的主键。

Connection con;
ResultSet rs;
PreparedStatement ps;
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "root";
String pwd = "root";

Class.forName("oracle.jdbc.OracleDriver").newInstance();
con = DriverManager.getConnection(url, user, pwd);

ps = con.prepareStatement("INSERT INTO transporter(transporter_name, transporter_website)VALUES(?, ?)");
ps.setString(1, "New");
ps.setString(2, "New Website");
ps.executeUpdate();

BigDecimal id = new BigDecimal(0);
rs = ps.getGeneratedKeys();

while (rs.next()) {
    id = rs.getBigDecimal("transporter_id");
}

out.println("The generated id is : " + id);

执行插入操作后,代码尝试在前面的 while 循环之上调用此方法 rs = ps.getGeneratedKeys();,但失败并出现以下异常.

javax.servlet.ServletException: java.sql.SQLException: operation not allowed

我已经尝试使用 Oracle JDBC 驱动程序版本 - 10.2.0.5.0,当它失败时,我下载了一个更高的版本,即 11.2.0.3.0 但是徒劳无功。可能是什么原因?

最佳答案

我找到了 some documentation对这个。它适用于 11g,但对于 10g 来说情况可能不会更好。

您的错误的近端原因可能是以下限制:

You need to access the ResultSet object returned from getGeneratedKeys method by position only

看来 Oracle 驱动程序还要求您识别键列,以便它检索键列而不仅仅是 ROWID。示例代码包含在链接文档中。

关于java - 使用 JDBC 在 Oracle 中检索最后插入的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13295453/

相关文章:

java - 如何为 DB2 通用 JDBC 驱动程序设置套接字超时?

java - PostgresQL中如何使用SCRAM-SHA-256通过jdbc连接数据库

java - 如何在 Java 中声明字节数组?

java - 如何重用 Oracle 主键列中的序列间隙?

SQL DB 性能和短时间间隔内的重复查询

java - 如何配置liquibase maven插件为oracle生成sql输出

java - 如何将 NewProxyConnection 类型转换为 AS400JDBCConnection

java - 将字符串转换为带括号的数组

java - 如果先指定 -jar,为什么 -Dproperty=value 不起作用?

java - 重新添加 JCheckBox 组件后,它们不会显示在 JPanel 上