Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать после INSERT присвоенный auto_increment'ом ключ? [D7]


Страницы:   1 2

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо