使用JDBC检索Oracle中最后插入的id

时间:2012-11-08 18:32:25

标签: java oracle jdbc oracle10g

我正在尝试使用mysql_insert_id()方法检索JSP中最后生成的自动增量ID,例如PHP last_insert_id()函数或MySQL getGeneratedKeys()函数,如下所述{ {3}}(我使用的是Oracle 10g)。

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

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); 循环之上调用此方法rs = ps.getGeneratedKeys();,并且失败并出现以下异常。

  

javax.servlet.ServletException:java.sql.SQLException:不是操作   允许

我尝试使用while,当它失败时我下载了更高版本Oracle JDBC Driver version - 10.2.0.5.0,但无济于事。可能是什么原因?

2 个答案:

答案 0 :(得分:5)

我发现了some documentation。它适用于11g,但10g的情况可能会更好。

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

  

您需要按位置访问getGeneratedKeys方法返回的ResultSet对象

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

答案 1 :(得分:0)

ps = con.prepareStatement(“ INSERT INTO transporter(transporter_name,transporter_website)VALUES(?,?)”,新String [] {“ transporter_id”});