Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Узнать ID последней вставленной записи / 23 сообщений из 23, страница 1 из 1
23.03.2007, 12:04
    #34411144
BagaBaga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
Как узнать по выполнении INSETRа ID вставленной записи. ID - INT, генерируется триггером (а не через IDENTITY). Где-то ответ на это был, но, перерыв форм, нашел только для MSSQL.
...
Рейтинг: 0 / 0
23.03.2007, 12:29
    #34411291
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
1.
В каком триггере у генерируется id: в before или after?
2.
Как вы определяете "последнюю вставленную" запись?
По максимальному сгенерированному id?
Или как по-другому?
...
Рейтинг: 0 / 0
23.03.2007, 13:00
    #34411427
BagaBaga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
1.
Before trigger на insert

2.
Лучше объяснить на (синтетическом) примере

таблица
Tab1
ID(MUNERIC) OTHER(VARCHAR 10)
----------------------------------
1 aaaaaaaa
2 bbbbbbbb

Я выполняю вставку
INSERT INTO tab1(OTHER)
VALUES ('cccccccc')

Мне требуется узнать, какое ID будет у вставленной записи.

Из-за триггера, если я выполню
INSERT INTO tab1(ID,OTHER)
VALUES (1,'cccccccc'),
то ID будет 3 (для указанного примера)
...
Рейтинг: 0 / 0
23.03.2007, 13:28
    #34411518
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
Код: plaintext
1.
2.
3.
4.
5.
select max(id)
from new table
(
INSERT INTO tab1(OTHER)
VALUES ('cccccccc')
);
...
Рейтинг: 0 / 0
23.03.2007, 14:33
    #34411756
BagaBaga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
Пишу в CBuilder 6, ADOCOnnection, ADOQuery. Выдает ошибки. На синтаксис. Увы, ищу дальше. Через то самое ...
...
Рейтинг: 0 / 0
23.03.2007, 14:56
    #34411863
Alexey Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
Должно работать.
То что CBuilder и ADO не имеет никакого значения.

ЗЫ ";" из запроса убрал?
...
Рейтинг: 0 / 0
23.03.2007, 23:30
    #34413022
khl
khl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
Mark Barinstein
Код: plaintext
1.
2.
3.
4.
5.
select max(id)
from new table
(
INSERT INTO tab1(OTHER)
VALUES ('cccccccc')
);

А если ID генерится через Identity - то же самое или есть еще какой способ узнать ID ??
...
Рейтинг: 0 / 0
24.03.2007, 22:30
    #34413746
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
Mark Barinstein
Код: plaintext
1.
2.
3.
4.
5.
select max(id)
from new table
(
INSERT INTO tab1(OTHER)
VALUES ('cccccccc')
);
Неужели в DB2 нет функции для получения последнего вставленного идентификатора?
В MySQL например для этого есть функция LAST_INSERT_ID().
Такая необходимость ведь очень часто возникает.
...
Рейтинг: 0 / 0
25.03.2007, 10:21
    #34413865
khl
khl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
Вероятно, IDENTITY_VAL_LOCAL() - нашел в доках.
...
Рейтинг: 0 / 0
25.03.2007, 18:45
    #34414144
khl
khl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
Вопрос к специалистам.

Делаю INSERT в таблицу.
СОММИТ.
Получаю ID последней записи.
Далее этот ID новой транзакцией вставляется в другие таблицы. И при неудаче второй транзакции первая уже не откатится. Фигня получается.

Как лучше получить новый ID до завершения транзакции?
Генерить в приложении?

Или в DB2 есть средства типа интербейзовских генераторов?

Или писать хранимую процедуру и держать последний ID в отдельной таблице? (подкиньте текст процедуры, если есть готовая)

Как кто поступает в таком случае?
...
Рейтинг: 0 / 0
26.03.2007, 03:58
    #34414444
DB2Adventurer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE PROCEDURE newName ( IN p_name VARCHAR( 100 ), OUT p_lastid INTEGER )
    LANGUAGE SQL    SPECIFIC newName 
BEGIN ATOMIC
    INSERT INTO t_names    ( name)   VALUES   ( p_name) ;
    
    VALUES  identity_val_local()   INTO  p_lastid ;

    INSERT INTO t_users    ( last_id)   VALUES   ( p_lastid) ;
END
...
Рейтинг: 0 / 0
26.03.2007, 10:16
    #34414703
gals
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
khlВопрос к специалистам.

Делаю INSERT в таблицу.
СОММИТ.
Получаю ID последней записи.
Далее этот ID новой транзакцией вставляется в другие таблицы. И при неудаче второй транзакции первая уже не откатится. Фигня получается.
Правильно, что фигня. Сам же первую транзакию и закрыл. Всё надо было делать в одной транзакции.

khl
Как лучше получить новый ID до завершения транзакции?
В DB2 есть SEQUENCE (последовательности). Можно спросить следующий свободный номер у последовательности. В этом случае удасться избежать получения одного номера несколькими участниками.
...
Рейтинг: 0 / 0
26.03.2007, 10:23
    #34414723
gals
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
Народ правильно предложил. Надо было делать SELECT из оператора INSERT. В этом случае Вы получаете набор ID только что созданных записей. При этом закрывать транзакцию совсем не надо. Триггеры и параметры, заполняемые по умолчанию, не ждут завершения транзакции.
Далее, в этой же транзакции работайте с полученным набором идентификаторов.
...
Рейтинг: 0 / 0
26.03.2007, 10:23
    #34414724
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
khlКак лучше получить новый ID до завершения транзакции?Не завершать ее сразу после insert. :)
На самом деле, после того, как вы вставили запись в таблицу с полем generated ... as identity, это значение уже невозможно "откатить" вне зависимости от ваших дальнейших действий.
Если для вас это критично (частые rollback?), то используйте таблицу-счетчик, блокируя ее до завершения всей транзакции.
Только решите, стоит ли заметная потеря производительности того, или нет.
...
Рейтинг: 0 / 0
26.03.2007, 11:13
    #34414866
khl
khl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
CREATE INTO и SEQUENCE, пожалуй решают все проблемы.

Сенкс.
...
Рейтинг: 0 / 0
29.03.2007, 01:34
    #34423252
BagaBaga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
Alexey PopovДолжно работать.
То что CBuilder и ADO не имеет никакого значения.

ЗЫ ";" из запроса убрал?
Убрал. Та же Ж -вид сбоку...
...
Рейтинг: 0 / 0
29.03.2007, 09:14
    #34423457
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
BagaBagaУбрал. Та же Ж -вид сбоку...А команда db2level что у вас выдает?
...
Рейтинг: 0 / 0
29.03.2007, 13:43
    #34424582
BagaBaga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
DB21085I Instance "DB2" uses DB2 code release "SQL07010" with level identifier

"02010105" and informational tokens "DB2 v7.1.0", "n000510" and "".
...
Рейтинг: 0 / 0
29.03.2007, 14:03
    #34424664
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
Ну... ниче...ниче...
Бывает хуже )))...
...
Рейтинг: 0 / 0
29.03.2007, 15:23
    #34424961
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
BagaBagaDB21085I Instance "DB2" uses DB2 code release "SQL07010" with level identifier

"02010105" and informational tokens "DB2 v7.1.0", "n000510" and "".Тогда так действительно нельзя.
Остается использовать sequence или таблицу-счетчик.
...
Рейтинг: 0 / 0
30.03.2007, 01:43
    #34426220
BagaBaga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
Mark BarinsteinТогда так действительно нельзя.
Остается использовать sequence или таблицу-счетчик.
А из-за чего? Мне эта строка ничего не говорит. (Как-то запросы пришлось запускать с явным указанием уровня отимизиции[после обновления]. Может, и здесь что такое? ).
...
Рейтинг: 0 / 0
30.03.2007, 05:59
    #34426260
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
Поля автогенерации generated ... as identity появились впервые в DB2 v7.2 for WIN. Значит остается вставлиять ID ручками. А вот откуда брать значение ID решай сам. Или через SEQUENCE, или сам веди таблицу последних использованных значений ID, или на худой конец select max(id).
В двух последних случаях придется разруливай блокировками и как следствие - жуткие тормоза при массовом асинхронном вводе.
...
Рейтинг: 0 / 0
30.03.2007, 09:22
    #34426426
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать ID последней вставленной записи
BagaBagaА из-за чего? Мне эта строка ничего не говорит. (Как-то запросы пришлось запускать с явным указанием уровня отимизиции[после обновления]. Может, и здесь что такое? ).У вас слишком старая версия db2.
Так, как я написал (select ... from new table...), можно только, начиная с v8.1.4.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Узнать ID последней вставленной записи / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]