Конференция "Базы" » Как получить идентификатор записи?
 
  • well © (13.12.10 14:00) [0]
    БД Oracle.
    Есть таблица. Поле ID инкрементный идентификатор, который определяется триггером в базе.

    В программе данные отображаются через DBGrid. Связь с таблицей , связь через ADOQuery.

    При вставке новой записи поле ID отображается как "0", хотя реальное значение отличается от нуля.
    Реальное значение появляется после  
    Active=false
    Active=true
    Либо после перезапуска программы.

    Можно ли получить значение поля без перезапуска?
  • Ega23 © (13.12.10 14:07) [1]

    > Можно ли получить значение поля без перезапуска?


    Надо обновлять НД.
  • well © (13.12.10 14:11) [2]
    НД это что?
  • Ega23 © (13.12.10 14:11) [3]
    Набор данных.
  • well © (13.12.10 14:12) [4]
    Набор данных?
  • well © (13.12.10 14:21) [5]
    Но тут появляется одна проблема. Курсор слетает с записи. Тоесть становится на первую запись в таблице. Можно ли его зафиксировать на обновляемой строке? Или придётся производить поиск?
  • Ega23 © (13.12.10 14:22) [6]
    Нет, блин, набор микроскопов.
    У тебя изначально твой НД понятия не имеет, какой ID будет сгенерен триггером. Соответственно, чтобы узнать надо его обновить. Либо в 2 транзакции делать, сначала NextID получить, а потом с ним вставлять запись.
  • Ega23 © (13.12.10 14:23) [7]

    >  Можно ли его зафиксировать на обновляемой строке?


    В общем случае - нет, поскольку ты не знаешь, какой именно ID будет.
  • well © (13.12.10 14:43) [8]
    Тоесть чтобы вставить строку, получить ID и вернуться на эту запись нужно:
    1. определить LAST_NUMBER
    2. обновить DataSet
    3. произвести поиск записи c ID равным LAST_NUMBER

    Проще наверное нельзя?
  • Ega23 © (13.12.10 14:50) [9]
    Можно. Но по твоим условиям задачи - нельзя.
  • Petr V. Abramov © (13.12.10 15:02) [10]

    > Есть таблица. Поле ID инкрементный идентификатор, который
    > определяется триггером в базе.

    автоинкрмента как такового в оракле нет, есть т.н. sequence`ы.
    есои точно испольуется триггер, в нем написано что-то типа
    :new.ID := MySequence.nextval

    в твой ситуации, если известно имя сиквенса, в программе его текущее значение можно получить как  MySequence.currval.
    с параллельным доступом тоже все хорошо разрулено, currval дает значение для текущей сессии, т.е. ровно то, что вернул последний nextval в твоей сессии
  • well © (13.12.10 15:11) [11]
    Ну да, тут триггер ссылается на нужный сиквенс, найти следующее значение ID не проблема.
  • Petr V. Abramov © (13.12.10 15:15) [12]

    > Ну да, тут триггер ссылается на нужный сиквенс, найти следующее
    > значение ID не проблема.

    тебе не следующее, а текущее надо, то что вернул последний nextval
  • well © (13.12.10 15:32) [13]
    Если я хочу определить ID записи перед тем как её вставить, то я нахожу значение LAST_NUMBER из сиквенса, это и будет идентификатором новой записи.
  • Petr V. Abramov © (13.12.10 15:55) [14]

    > well ©   (13.12.10 15:32) [13]
    >
    > Если я хочу определить ID записи перед тем как её вставить,
    >  то я нахожу значение LAST_NUMBER из сиквенса, это и будет
    > идентификатором новой записи.
    >

    какое LAST_NUMBER???
    перед тем как вставить ты определишь ерунду, триггер потом все равно вызовет nextval, а что он вернет, известно только ктулху, и именно это он запишет в базу.
    в общем, тебе сказали, как надо, хочешь по-своему - флаг в руки
  • Игорь Шевченко © (13.12.10 16:22) [15]
    INSERT ... RETURNING
  • Petr V. Abramov © (13.12.10 16:30) [16]

    > Игорь Шевченко ©   (13.12.10 16:22) [15]
    >
    > INSERT ... RETURNING

    в идеале да, только там уже сть триггер и прочая фигня. и insert явно ADO само формирует.
  • Ega23 © (13.12.10 16:49) [17]

    >  и insert явно ADO само формирует.


    Там, судя по симптомам, DBGrid с редактированием в нём.
  • Petr V. Abramov © (13.12.10 16:53) [18]

    > Ega23 ©   (13.12.10 16:49) [17]

    ну да, у меня такой же диагноз :)
    в общем-то, на вполне определнном круге задач это не преступление и не моветон.
  • Игорь Шевченко © (13.12.10 16:57) [19]

    > в идеале да, только там уже сть триггер и прочая фигня


    INSERT и после триггера RETURNING
 
Конференция "Базы" » Как получить идентификатор записи?
Есть новые Нет новых   [134431   +15][b:0.001][p:0.001]