当前位置: 首页 > 面试题库 >

在事务中插入后获取ID(Oracle)

公羊雅达
2023-03-14
问题内容

假设我有三个表:team,player,team_player。表team_player是一个桥接表,允许“多对多”关系。

当某人想要创建一个新团队时,他们指定该团队的初始球员。

如何在同一交易中同时插入team和team_player行?也就是说,我想在提交到新团队行之前插入所有team_player记录。我正在使用JDBC和Oracle。

当我尝试下面的代码时,即使team.id是一个数字(由触发器递增),teamId也会由字母字符串填充。因此,这似乎不是我刚刚尝试插入的记录的ID(但尚未提交)。

c = DB.getConnection();
c.setAutoCommit(false);

sql = "INSERT INTO team (name) values (?)";
myInsert = c.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
myInsert.setString(1, "cougars");
int affectedRows = memoInsert.executeUpdate();

String teamId;
ResultSet generatedKeys = myInsert.getGeneratedKeys();
if (generatedKeys.next()) {
    teamId = generatedKeys.getString(1);
}

// ...loop through players inserting each player and team.id into team_player

// c.commit();

在这里,我读到了有关RETURN_GENERATED_KEYS的信息:
如何在JDBC中获取插入ID?


问题答案:

Oracle JDBC驱动程序不支持getGeneratedKeys()-您正在触发器中手动生成密钥,大概是从中生成的SEQUENCE

您可以使用Oracle的returning子句:

String query = "BEGIN INSERT INTO team (name) values (?) returning id into ?; END;";
CallableStatement cs = conn.prepareCall(query);
cs.setString(1, "cougars");
cs.registerOutParameter(2, OracleTypes.NUMBER);
cs.execute();
System.out.println(cs.getInt(2));

或使用第二个SQL查询获取最后一个序列号:

SELECT mysequence.CURRVAL FROM dual


 类似资料:
  • 问题内容: 我将SQLite与Android一起使用,我想知道获取插入的行的生成ID的最佳方法。 我认为有一个解决方案可以在包含之后进行搜索,但它并不是最好的方法。 问题答案: 该方法返回刚插入的行或插入期间发生错误的行。 db在哪里。

  • 问题内容: 我有一个查询,我想插入最后一个ID。字段ID是主键,并且是自动递增的。 我知道我必须使用以下语句: 该语句适用于如下查询: 但是,如果我想使用以下语句获取ID: 我收到此错误: 我究竟做错了什么? 问题答案: 那是因为那是SQL函数,而不是PHP。您可以使用。 喜欢: 如果要使用SQL而不是PDO API进行操作,则可以像普通的select查询一样进行操作:

  • 问题内容: …并且该手册似乎表明您可以随时拨打电话,并且可以正常使用。但是这个… …似乎说明它必须在事务内。所以我的问题是:我可以在查询之前(只要没有交易)就等我想要的时间吗?面对许多并发连接,这可靠吗? 问题答案: PostgreSQL中的INSERT,UPDATE和DELETE具有RETURNING子句,这意味着您可以执行以下操作: 然后查询将为插入的每一行返回它为id插入的值。将往返保存到服

  • 问题内容: 当我插入一行时,表格的“ id”字段会自动增加。我想插入一行,然后获取该ID。 我会按照我说的去做,但是有没有办法我不用担心插入行和获取ID之间的时间呢? 我知道我可以在数据库中查询与输入的信息相匹配的行,但是变化很大,将有重复项,唯一的区别是id。 问题答案: 请参阅。 无论您做什么,都不要插入“ ”。就像您说的那样,这是比赛条件,没有必要。已经具有此功能。

  • 问题内容: 是否有任何选项可以获取CodeIgniter中新记录的最后插入ID? 考虑字段id(自动递增)firstcolumn和secondcolumn的表组成。 这样,您可以在以下代码中使用插入ID。 问题答案: 真可惜 我看了一下用户指南,第一个功能是 这也适用于activerecord插入… 编辑:我更新了链接

  • 问题内容: 如何在JDBC中获取插入ID? 问题答案: 如果它是自动生成的密钥,那么你可以使用它。你需要Statement使用与用于相同的名称进行调用INSERT。首先,你需要创建用于通知JDBC驱动程序以返回键的语句。 这是一个基本示例: 请注意,你是否依赖JDBC驱动程序。当前,大多数最新版本都可以使用,但是如果我没错,Oracle JDBC驱动程序仍然有些麻烦。MySQL和DB2已经支持它很