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

Tin*_*iny 4 java oracle jdbc oracle10g

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

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

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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sam*_*ard 5

我找到了一些关于此的文档.这是11克,但10克的情况可能不会更好.

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

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

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

  • 我已经按照[this](http://stackoverflow.com/a/3552353/1391249)的回答进行了尝试,两种方法都有效.但是,在第一种方法(具有`PreparedStatement`的方法)中,我必须从SQL语句中删除序列生成的id,即该答案中指定的`seq_mytable.NEXTVAL()`.谢谢你的有用答案. (2认同)