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

4
我正在尝试在JSP中检索最后生成的自增ID,类似于PHP的mysql_insert_id()函数或MySQL的last_insert_id()函数,使用getGeneratedKeys()方法,如此问题所述(虽然我使用的是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 Driver版本-10.2.0.5.0,但失败了,然后我下载了一个更高版本的11.2.0.3.0,但仍然无济于事。可能的原因是什么?

看一下这个链接(https://dev59.com/iG855IYBdhLWcg3wPBtx),可能会有用,还有这个(http://1ikun.wordpress.com/2011/06/14/how-to-get-the-auto-generated-keys-with-jdbc-in-oraclesqlserver/)。 - Jacob
@Polppan - 那些链接非常有帮助,最终让我找到了想要的解决方案。非常感谢你。 - Tiny
2个回答

5
我找到了一些文档,内容与11g相关,但情况对于10g可能也不会更好。
你的错误的近因很可能是以下限制:

你只能通过位置访问从getGeneratedKeys方法返回的ResultSet对象

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

2
我已经按照这篇回答中提到的方法尝试了,两种方法都有效。但是,在第一种方法(使用PreparedStatement)中,我必须像该回答中指定的那样从SQL语句中删除序列生成的ID,即seq_mytable.NEXTVAL()。非常感谢您有用的回答。 - Tiny

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接