Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.27;
Скачать: CL | DM;

Вниз

Как узнать после INSERT присвоенный auto_increment ом ключ?   Найти похожие ветки 

 
mikel   (2005-01-14 13:03) [0]

Как узнать после INSERT присвоенный auto_increment"ом ключ?
вот собственно и вопрос.
использую ADOConnection, ADOQuery.

Заранее огромное спасибо!


 
ЮЮ ©   (2005-01-14 13:05) [1]

Вот за это auto_increment и не люблю, что очень трудно "готовить" :)
Access что ли?


 
mikel   (2005-01-14 13:08) [2]

нет, Oracle. А как "готовить"?
просто очень-очень надо узнать присвоенный записи ключ, либо другую технологию...
я уже премного всем благодарен за помощь. Но как с этим справиться так и не нашел пока ничего :(


 
stone ©   (2005-01-14 13:09) [3]

СУБД какая?
Для MSSQL и Access - @@IDENTITY


 
mikel   (2005-01-14 13:10) [4]

СУБД - Oracle

Ставил галочку при создании темы, но чего-то Oracle не отображается :/


 
Fay ©   (2005-01-14 13:16) [5]

Сначала пролучи значение sequence-а, потом делай insert. И будет тебе Щястье.


 
mikel   (2005-01-14 13:17) [6]

понял. фенкс!


 
mikel   (2005-01-14 13:21) [7]

эх... ну вот беда то:
Sequence"а на эту таблицу нету... и создавать нельзя (по заданию).


 
Ega23 ©   (2005-01-14 13:22) [8]

Select Max(ID) в этой же транзакции?


 
mikel   (2005-01-14 13:25) [9]

да... похоже остается только SELECT max(id)...
чтож делаю так.

Спасибо всем! и хорошего вам настроения :)


 
Fay ©   (2005-01-14 13:29) [10]

А почему именно MAX? Почему не  AVG ? Как реализована последовательность?


 
Sergey13 ©   (2005-01-14 13:32) [11]

insert into my_table(f1,f2) value(:f1,:f2) returning id into :id


 
Sergey13 ©   (2005-01-14 13:34) [12]

values конечно 8-)


 
mikel   (2005-01-14 13:42) [13]

> Fay
последовательность для этой таблицы не нашел. Я в этом конечно чайник, но созданной последовательности (create sequence...) для этой таблицы не было.

> Fay
Потому что MAX(id)+1 будет новый ключ
а AVG то зачем?

> Sergey13
спасибо! сейчас попробую!


 
msguns ©   (2005-01-14 13:46) [14]

А что, генераторов в оракле нетути ?


 
mikel   (2005-01-14 13:56) [15]

в чем может быть ошибка?

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"... :/


 
Sergey13 ©   (2005-01-14 14:05) [16]

Я с АДО не работал, но вместо ExecSQL не Open надо?


 
Sergey13 ©   (2005-01-14 14:07) [17]

2[15] mikel   (14.01.05 13:56)
Кроме того - MAX - порочный путь. Если ИДшник генерится последовательностью, то можно узнать последний номер сгенеренный тобой.
select my_seq.curval from dual


 
mikel   (2005-01-14 14:13) [18]

ок. > 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)


 
mikel   (2005-01-14 14:14) [19]

>Serg13

ёшки... SELECT ведь... Конечно Open, а не ExecSQL
:) облажался :)


 
Sergey13 ©   (2005-01-14 14:41) [20]

2[18] mikel   (14.01.05 14:13)
>Как узнать какой последовательностью генерится ключ для этой таблицы?

Посмотреть тригер этой таблицы на "перед вставкой".

insert into regalia (name, idk_r)
values ("asdf",20101)
returning id_r INTO :id_r

id_r - поле значение которого назо вернуть.
:id_r - это переменная запроса, которую можно прочитать после его выполнения. Имя может быть любым. Как в АДО это сделать (прочитать значение) - не знаю, АДО не юзал.


 
mikel   (2005-01-14 15:12) [21]

понял. дело в том что такой запрос

insert into regalia (name, idk_r)
values ("asdf",20101)
returning id_r INTO :id_r

не проходит :(... пробую в PL/QL Developer


 
Sergey13 ©   (2005-01-14 15:13) [22]

2[21] mikel   (14.01.05 15:12)
А тригер на таблицу с генерацией ИД есть?


 
Sergey13 ©   (2005-01-14 15:15) [23]

>не проходит :(... пробую в PL/QL Developer
Как не проходит? Может говорит что не все переменные привязаны? Так надо в Test Window смотреть - там можно переменные просматривать.


 
mikel   (2005-01-28 16:36) [24]

> 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;

говорит ошибка... :(


 
mikel   (2005-01-28 17:02) [25]

нашел триггер, нашел последовательность! ура!
но все равно малость не понимаю.

допустим запрос готов
insert into employees (id_e, name)
values (some_seq.nextval, "asdf")

но мне надо остаться с id_e. т.е. мне нужен id_e в программе.


 
mikel   (2005-01-28 17:05) [26]

что-то я тут на сооброжал.

вопрос такой. для получения id_e остается только такой способ:?

select some_seq.currval from Dual

?


 
fess ©   (2005-01-30 13:14) [27]

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;
И все! ;)
Удачи!


 
sniknik ©   (2005-01-30 23:11) [28]

fess ©   (30.01.05 13:14) [27]
это к чему? ты вопрос то читал?

тем более с таблицами, попробуй с ними к серьезной базе сунься (в оракле обычно такие), и этот код у тебя по пол дня будет отрабатывать (пробовал как то на таблице с 40 милионами записей)... за это время автоинкремент на на пару тысяч записей "подрастет". ;о))


 
Sergey13 ©   (2005-01-31 09:36) [29]

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)
Теоретически можно и так. Только можно нарваться. Последовательность может быть дернута тобой же неявно в другом тригере например.


 
Johnmen ©   (2005-01-31 09:45) [30]

Просто интересно, а что, такое поле (id_e) есть в таблице ?



Страницы: 1 вся ветка

Текущий архив: 2005.02.27;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.05 c
14-1107432945
Usser
2005-02-03 15:15
2005.02.27
Маловато будет?


1-1108224281
TeNY
2005-02-12 19:04
2005.02.27
как правильно использовать функцию EnumResourceNames


14-1107345166
Никита
2005-02-02 14:52
2005.02.27
Почему кладовка заперта?


1-1108363949
Mishenka
2005-02-14 09:52
2005.02.27
Отображаемые файлы или потоки?


3-1106903250
Oleon
2005-01-28 12:07
2005.02.27
Как в cxGrid выборочные строки выделить другим цветом?