Это возможно с 9.0 и новым DO
для анонимных блоков:
do $$
declare
new_id integer;
begin
insert into foo1 (id) values (default) returning id into new_id;
insert into foo2 (id) values (new_id);
end$$;
Это может быть выполнено как один оператор.Я не пытался создать PreparedStatement из этого, хотя.
Редактировать
Другой подход состоит в том, чтобы просто сделать это в два шага, сначала запустить вставку в tableA с помощью выражения return, получить сгенерированное значение через JDBC, а затем запустить вторую вставку, что-то вроде этого:
PreparedStatement stmt_1 = con.prepareStatement("INSERT INTO tblA VALUES (DEFAULT, ?) returning id");
stmt_1.setString(1, "x");
stmt_1.execute(); // important! Do not use executeUpdate()!
ResultSet rs = stmt_1.getResult();
long newId = -1;
if (rs.next()) {
newId = rs.getLong(1);
}
PreparedStatement stmt_2 = con.prepareStatement("INSERT INTO tblB VALUES (default,?,?)");
stmt_2.setLong(1, newId);
stmt_2.setString(2, "y");
stmt_2.executeUpdate();