Получить последний идентификатор вставки с Oracle 11g, используя JDBC - PullRequest
5 голосов
/ 10 февраля 2011

Я новичок в использовании Oracle, поэтому я перехожу к тому, что уже было дано ранее в этом вопросе . Я просто не могу заставить его работать. Вот заявление, которое я использую:

declare
  lastId number;
begin
INSERT INTO "DB_OWNER"."FOO" 
  (ID, DEPARTMENT, BUSINESS)
  VALUES (FOO_ID_SEQ.NEXTVAL, 'Database Management', 'Oracle')
  RETURNING ID INTO lastId;
end;

Когда я вызываю executeQuery PreparedStatement, который я сделал, он прекрасно вставляет все в базу данных. Тем не менее, я не могу понять, как получить идентификатор. Возвращенный объект ResultSet не будет работать для меня. Вызов

if(resultSet.next()) ...

дает неприятное исключение SQLE, которое гласит:

Невозможно выполнить выборку для оператора PLSQL: следующий

Как мне получить это lastId? Очевидно, я делаю это неправильно.

Ответы [ 6 ]

2 голосов
/ 04 апреля 2012

Я пытался использовать драйвер Oracle v11.2.0.3.0 (поскольку в 10.x и 11.1.x есть некоторые ошибки, см. другой блог ). Следующий код работает нормально:

final String sql = "insert into TABLE(SOME_COL, OTHER_COL) values (?, ?)";
PreparedStatement ps = con.prepareStatement(sql, new String[] {"ID"});
ps.setLong(1, 264);
ps.setLong(2, 1);
int executeUpdate = ps.executeUpdate();
ResultSet rs = ps.getGeneratedKeys();
if (rs.next() ) {
    // The generated id
    long id = rs.getLong(1);
    System.out.println("executeUpdate: " + executeUpdate + ", id: " + id);
}
2 голосов
/ 10 февраля 2011

Не уверен, что это сработает, поскольку я очистил все свои компьютеры от Oracle, но ...

Измените ваше объявление на:

declare
  lastId OUT number;

Переключите ваш оператор из PreparedStatement в CallableStatement с помощью prepareCall () в вашем соединении. Затем зарегистрируйте выходной параметр перед вашим вызовом и прочитайте его после обновления:

cstmt.registerOutParameter(1, java.sql.Types.NUMERIC);
cstmt.executeUpdate();
int x = cstmt.getInt(1);
2 голосов
/ 10 февраля 2011

сделать его функцией, которая возвращает его вам (вместо процедуры).Или используйте процедуру с параметром OUT.

1 голос
/ 10 февраля 2011

Вы можете использовать Statement.getGeneratedKeys () , чтобы сделать это. Вам просто нужно обязательно сообщить JDBC, какие столбцы вы хотите вернуть, используя для этого одну из перегрузок метода, например, перегрузку Connection.prepareStatement:

Connection conn = ...
PreparedStatement pS = conn.prepareStatement(sql, new String[]{"id"});
pS.executeUpdate();
ResultSet rS = pS.getGeneratedKeys();
if (rS.next()) {
  long id = rS.getLong("id");
  ...
}

С этим не нужно ничего делать RETURNING x INTO, просто используйте необходимый базовый оператор SQL.

1 голос
/ 10 февраля 2011

Вы делаете это в хранимой процедуре?Согласно этому документу Oracle , он не будет работать с драйвером на стороне сервера.

The Oracle server-side internal driver does not support 
the retrieval of auto-generated keys feature.
1 голос
/ 10 февраля 2011

При подготовке выписки установите для второго параметра значение RETURN_GENERATED_KEYS. Тогда вы сможете получить ResultSet от объекта оператора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...