我正在尝试在 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/