![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать после INSERT присвоенный auto_increment'ом ключ? [D7]
mikel © (2005-01-14 13:03:00)Как узнать после INSERT присвоенный auto_increment'ом ключ?
вот собственно и вопрос.
использую ADOConnection, ADOQuery.
Заранее огромное спасибо!
Johnmen (2005-01-31 09:45:00) [1]Просто интересно, а что, такое поле (id_e) есть в таблице ?
Sergey13 (2005-01-31 09:36:00) [2]2[24] mikel (28.01.05 16:36)
> говорит ошибка... :(
Так и говорит? Со смайликом? Сочувствует значит. 8-)
2[24] mikel (28.01.05 16:36)
Оставь в TestWindow только
insert into employees (surname, name, sex, date_of_birth)
values ('aaa','aaa',1,'28.01.2004') returning id_e into :be
be пропиши в списке переменных в нижнем окошке
2[26] mikel (28.01.05 17:05)
Теоретически можно и так. Только можно нарваться. Последовательность может быть дернута тобой же неявно в другом тригере например.
sniknik (2005-01-30 23:11:00) [3]fess © (30.01.05 13:14) [27]
это к чему? ты вопрос то читал?
тем более с таблицами, попробуй с ними к серьезной базе сунься (в оракле обычно такие), и этот код у тебя по пол дня будет отрабатывать (пробовал как то на таблице с 40 милионами записей)... за это время автоинкремент на на пару тысяч записей "подрастет". ;о))
fess (2005-01-30 13:14:00) [4]USES ...,DB;
var s : string;
Для поиска в БД используешь следующую функцию:
Например: хотим найти ID_Discip вставленной дисциплины в таблицу
dm.ADOTableDiscip.Active:=false;
dm.ADOTableDiscip.Active:=true;
dm.ADOTableDiscip.Locate('NameOfDiscip', s, [loCaseInsensitive]);
Id_Discip:=dm.ADOTableDiscip.FieldByName('Id_Discip').AsInteger;
И все! ;)
Удачи!
mikel (2005-01-28 17:05:00) [5]что-то я тут на сооброжал.
вопрос такой. для получения id_e остается только такой способ:?
select some_seq.currval from Dual
?
mikel (2005-01-28 17:02:00) [6]нашел триггер, нашел последовательность! ура!
но все равно малость не понимаю.
допустим запрос готов
insert into employees (id_e, name)
values (some_seq.nextval, 'asdf')
но мне надо остаться с id_e. т.е. мне нужен id_e в программе.
mikel (2005-01-28 16:36:00) [7]> Sergey13 ©
так и говорит.
че то я не совсем понимаю. весь пример из TestWindow:
-- Created on 28.01.2005 by Èííà
declare
-- Local variables here
i integer;
be integer;
begin
-- Test statements here
insert into employees (surname, name, sex, date_of_birth)
values ('aaa','aaa',1,'28.01.2004') returning id_e into :be
end;
говорит ошибка... :(
Sergey13 (2005-01-14 15:15:00) [8]>не проходит :(... пробую в PL/QL Developer
Как не проходит? Может говорит что не все переменные привязаны? Так надо в Test Window смотреть - там можно переменные просматривать.
Sergey13 (2005-01-14 15:13:00) [9]2[21] mikel (14.01.05 15:12)
А тригер на таблицу с генерацией ИД есть?
mikel (2005-01-14 15:12:00) [10]понял. дело в том что такой запрос
insert into regalia (name, idk_r)
values ('asdf',20101)
returning id_r INTO :id_r
не проходит :(... пробую в PL/QL Developer
Sergey13 (2005-01-14 14:41:00) [11]2[18] mikel (14.01.05 14:13)
>Как узнать какой последовательностью генерится ключ для этой таблицы?
Посмотреть тригер этой таблицы на "перед вставкой".
insert into regalia (name, idk_r)
values ('asdf',20101)
returning id_rINTO :id_r
id_r- поле значение которого назо вернуть.
:id_r- это переменная запроса, которую можно прочитать после его выполнения. Имя может быть любым. Как в АДО это сделать (прочитать значение) - не знаю, АДО не юзал.
mikel (2005-01-14 14:14:00) [12]>Serg13
ёшки... SELECT ведь... Конечно Open, а не ExecSQL
:) облажался :)
mikel (2005-01-14 14:13:00) [13]ок. > Serg13 Как узнать какой последовательностью генерится ключ для этой таблицы?
Попробовал такую конструкцию (но не знаю, что надо писать вместо '?'; получить надо id_r
insert into regalia (name, idk_r)
values ('asdf',20101)
returning ? INTO :?
Знал бы я какую последовательность использовать все было бы проще
insert into regalia (id_r, name, idk_r)
values (some_seq.nextval, 'asdf',20101)
Sergey13 (2005-01-14 14:07:00) [14]2[15] mikel (14.01.05 13:56)
Кроме того - MAX - порочный путь. Если ИДшник генерится последовательностью, то можно узнать последний номер сгенеренный тобой.
select my_seq.curval from dual
Sergey13 (2005-01-14 14:05:00) [15]Я с АДО не работал, но вместо ExecSQL не Open надо?
mikel (2005-01-14 13:56:00) [16]в чем может быть ошибка?
with DM.ADOQ7 do
begin
Close;
SQL.Text := 'SELECT MAX(id_r) AS max_id_r FROM regalia';
ExecSQL;
new_id_r := FieldByName('max_id_r').AsInteger+1;
end;
Ругается: "ADOQ7: field max_id_r not found"... :/
msguns (2005-01-14 13:46:00) [17]А что, генераторов в оракле нетути ?
mikel (2005-01-14 13:42:00) [18]> Fay
последовательность для этой таблицы не нашел. Я в этом конечно чайник, но созданной последовательности (create sequence...) для этой таблицы не было.
> Fay
Потому что MAX(id)+1 будет новый ключ
а AVG то зачем?
> Sergey13
спасибо! сейчас попробую!
Sergey13 (2005-01-14 13:34:00) [19]values конечно 8-)
Sergey13 (2005-01-14 13:32:00) [20]insert into my_table(f1,f2) value(:f1,:f2) returning id into :id