-
БД Oracle. Есть таблица. Поле ID инкрементный идентификатор, который определяется триггером в базе.
В программе данные отображаются через DBGrid. Связь с таблицей , связь через ADOQuery.
При вставке новой записи поле ID отображается как "0", хотя реальное значение отличается от нуля. Реальное значение появляется после Active=false Active=true Либо после перезапуска программы.
Можно ли получить значение поля без перезапуска?
-
> Можно ли получить значение поля без перезапуска?
Надо обновлять НД.
-
НД это что?
-
Набор данных.
-
Набор данных?
-
Но тут появляется одна проблема. Курсор слетает с записи. Тоесть становится на первую запись в таблице. Можно ли его зафиксировать на обновляемой строке? Или придётся производить поиск?
-
Нет, блин, набор микроскопов. У тебя изначально твой НД понятия не имеет, какой ID будет сгенерен триггером. Соответственно, чтобы узнать надо его обновить. Либо в 2 транзакции делать, сначала NextID получить, а потом с ним вставлять запись.
-
> Можно ли его зафиксировать на обновляемой строке?
В общем случае - нет, поскольку ты не знаешь, какой именно ID будет.
-
Тоесть чтобы вставить строку, получить ID и вернуться на эту запись нужно: 1. определить LAST_NUMBER 2. обновить DataSet 3. произвести поиск записи c ID равным LAST_NUMBER
Проще наверное нельзя?
-
Можно. Но по твоим условиям задачи - нельзя.
-
> Есть таблица. Поле ID инкрементный идентификатор, который > определяется триггером в базе.
автоинкрмента как такового в оракле нет, есть т.н. sequence`ы. есои точно испольуется триггер, в нем написано что-то типа :new.ID := MySequence.nextval
в твой ситуации, если известно имя сиквенса, в программе его текущее значение можно получить как MySequence.currval. с параллельным доступом тоже все хорошо разрулено, currval дает значение для текущей сессии, т.е. ровно то, что вернул последний nextval в твоей сессии
-
Ну да, тут триггер ссылается на нужный сиквенс, найти следующее значение ID не проблема.
-
> Ну да, тут триггер ссылается на нужный сиквенс, найти следующее > значение ID не проблема.
тебе не следующее, а текущее надо, то что вернул последний nextval
-
Если я хочу определить ID записи перед тем как её вставить, то я нахожу значение LAST_NUMBER из сиквенса, это и будет идентификатором новой записи.
-
> well © (13.12.10 15:32) [13] > > Если я хочу определить ID записи перед тем как её вставить, > то я нахожу значение LAST_NUMBER из сиквенса, это и будет > идентификатором новой записи. >
какое LAST_NUMBER??? перед тем как вставить ты определишь ерунду, триггер потом все равно вызовет nextval, а что он вернет, известно только ктулху, и именно это он запишет в базу. в общем, тебе сказали, как надо, хочешь по-своему - флаг в руки
-
INSERT ... RETURNING
-
> Игорь Шевченко © (13.12.10 16:22) [15] > > INSERT ... RETURNING
в идеале да, только там уже сть триггер и прочая фигня. и insert явно ADO само формирует.
-
> и insert явно ADO само формирует.
Там, судя по симптомам, DBGrid с редактированием в нём.
-
> Ega23 © (13.12.10 16:49) [17]
ну да, у меня такой же диагноз :) в общем-то, на вполне определнном круге задач это не преступление и не моветон.
-
> в идеале да, только там уже сть триггер и прочая фигня
INSERT и после триггера RETURNING
|