Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Вниз

Как узнать после 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.038 c
3-1106826055
juice
2005-01-27 14:40
2005.02.27
роли в IB Expert


3-1105480229
chir
2005-01-12 00:50
2005.02.27
Как правильно формировать запрос?


9-1101991043
TButton
2004-12-02 15:37
2005.02.27
Гексагональная сетка


14-1107432469
Ega23
2005-02-03 15:07
2005.02.27
Я плакал!


6-1103022407
Змей
2004-12-14 14:06
2005.02.27
TIdUDPServer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский