Получить последний идентификатор в вставленной строке в Oracle DB

Возможный дубликат:PLSQL JDBC: как получить идентификатор последней строки?

У меня проблема с получением идентификатора из таблиц. У меня две таблицы AJPES_TR, а TR_LOG и PK из таблицы TR_LOG заданы как внешний ключ в таблице AJPES_TR.

В таблице TR_LOG я просто пишу, из каких файлов импортированы данные, и я хочу связать этот ПК в основной таблице. В mySQL я отлично справлялся с getID.last(); int j = getID.getInt(TR_LOG_ID);, но теперь в Oracle это больше не работает.

Это мои PreparedStatements:

PreparedStatement insertData = 
 con.prepareStatement(
 "INSERT INTO T_AJPES_TR(rn,sSpre,reg,eno,davcna,Ime,Priimek) VALUES (?,?,?,?,?,?,?)"
 );
PreparedStatement select_file_log = 
 con.prepareStatement("SELECT * FROM T_AJPES_TR_LOG WHERE File_import = ?"
);
PreparedStatement getID = con.prepareStatement("SELECT * FROM T_AJPES_TR_LOG");
PreparedStatement insertFile = 
 con.prepareStatement(
 "INSERT INTO T_AJPES_TR_LOG(Date_import,File_import) VALUES (?,?)"
 );

В mySQL ID были установлены как автоинкремент.

Как получить идентификационное значение из TR_LOG и записать это значение в таблицу AJPES_TR?

4 ответа

Если триггер настроен на автоматическое задание поля первичного ключа со следующим значением из последовательности, вы можете изменить инструкцию INSERT следующим образом:

INSERT INTO table (field1, field2, field3)
 VALUES (?, ?, ?)
 RETURNING primary_key_field INTO ?

Затем добавьте значения параметров для INSERT, выходного параметра в конце первичного ключа и выполните запрос.

После выполнения запроса возьмите значение выходного параметра. Он должен содержать значение поля primary_key_.


В Oracle для используемых значений автоматического увеличения sequences

Следующее значение: SEQUENCE_NAME.NEXTVAL, последний используется SEQUENCE_NAME.CURRVAL


Если вы правильно поняли, что хотите вставить запись в одну таблицу T1, получите PK вставленной записи и используйте ее как FK в другой таблице T2. В этом случае Oracle возвращающее предложение очень полезно, вы можете использовать его вот так (мне жаль, что я не знаю, как использовать его в hot Java, но вы должны получить эту идею):

declare
 fId int;
begin
 insert into T1(id) values seq1.nextval returning id into fId
end;

После вставки у вас будет созданный идентификатор записи в переменной fId.


Вы можете сигнализировать столбцы автоматического увеличения в запросе оператора подготовки

Пример:

PreparedStatement ps = con.prepareStatement(sql, pkColumns);

После вставки строки базы данных:

ResultSet keys = ps.getGeneratedKeys();

Важно: это работает только в том случае, если значения автоматического прироста автоматически устанавливаются посредством DB-Trigger через последовательности

licensed under cc by-sa 3.0 with attribution.