【问题标题】:Retrieving the last inserted id in Oracle using JDBC使用 JDBC 在 Oracle 中检索最后插入的 id
【发布时间】:2012-10-29 00:40:18
【问题描述】:

我正在尝试使用 getGeneratedKeys() 中提到的 getGeneratedKeys() 方法在 JSP 中检索最后生成的自动增量 ID,例如 PHP mysql_insert_id() 函数或 MySQL last_insert_id() 函数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: 操作不 允许

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

【问题讨论】:

  • 看看this,可能有用和this
  • @Polppan - 这些链接非常有帮助,最终引导我找到了我想要的解决方案。非常感谢。
  • 不客气,编码愉快。

标签: java oracle jdbc oracle10g


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我找到了some documentation 关于这个。是11g的,但10g的情况可能不会好。

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

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

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

    【讨论】:

    • 我已经尝试过this 答案中提到的两种方法都有效。但是,在第一种方法(带有PreparedStatement 的方法)中,我必须从 SQL 语句中删除序列生成的 id,即该答案中指定的seq_mytable.NEXTVAL()。非常感谢您的有用回答。
    猜你喜欢
    • 2011-06-24
    • 2011-03-28
    • 1970-01-01
    • 2012-10-29
    • 2015-09-30
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2019-10-28
    相关资源
    最近更新 更多