Получить последний идентификатор в вставленной строке в 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?
Ответы
Ответ 1
Если триггер настроен на автоматическое задание поля первичного ключа со следующим значением из последовательности, вы можете изменить инструкцию INSERT следующим образом:
INSERT INTO table (field1, field2, field3)
VALUES (?, ?, ?)
RETURNING primary_key_field INTO ?
Затем добавьте значения параметров для INSERT, выходного параметра в конце первичного ключа и выполните запрос.
После выполнения запроса возьмите значение выходного параметра. Он должен содержать значение поля primary_key_.
Ответ 2
В Oracle для используемых значений автоматического увеличения sequences
Следующее значение: SEQUENCE_NAME.NEXTVAL, последний используется SEQUENCE_NAME.CURRVAL
Ответ 3
Если вы правильно поняли, что хотите вставить запись в одну таблицу T1, получите PK вставленной записи и используйте ее как FK в другой таблице T2. В этом случае Oracle возвращающее предложение очень полезно, вы можете использовать его вот так (мне жаль, что я не знаю, как использовать его в hot Java, но вы должны получить эту идею):
declare
fId int;
begin
insert into T1(id) values seq1.nextval returning id into fId
end;
После вставки у вас будет созданный идентификатор записи в переменной fId
.
Ответ 4
Вы можете сигнализировать столбцы автоматического увеличения в запросе оператора подготовки
Пример:
PreparedStatement ps = con.prepareStatement(sql, pkColumns);
После вставки строки базы данных:
ResultSet keys = ps.getGeneratedKeys();
Важно: это работает только в том случае, если значения автоматического прироста автоматически устанавливаются посредством DB-Trigger через последовательности