lat*_*atj 7 java sql oracle jdbc
假设我有三张牌桌:球队,球员,球队球员.表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();
Run Code Online (Sandbox Code Playgroud)
这是我读到的关于RETURN_GENERATED_KEYS的地方: 如何在JDBC中获取插入ID?
sam*_*wis 11
Oracle JDBC驱动程序不支持getGeneratedKeys()- 您手动生成触发器中的键,可能来自a 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));
Run Code Online (Sandbox Code Playgroud)
或者使用第二个SQL查询获取最后一个序列号:
SELECT mysequence.CURRVAL FROM dual
Run Code Online (Sandbox Code Playgroud)