gpt4 book ai didi

java - 在事务中插入后获取 id (Oracle)

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:07:20 24 4
gpt4 key购买 nike

假设我有三个表: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 的地方: How to get the insert ID in JDBC?

最佳答案

Oracle JDBC 驱动程序不支持 getGeneratedKeys() - 您在触发器中手动生成键,大概来自 SEQUENCE

您可以使用 Oracle 的返回子句:

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

关于java - 在事务中插入后获取 id (Oracle),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17459094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com