Главная страница
    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.044 c
3-1106659874
Behemoth
2005-01-25 16:31
2005.02.27
Как переименовать MSSQLSERVER


6-1102802976
Opilki_Inside
2004-12-12 01:09
2005.02.27
Как узнать на что ссылается банер, оснаванный на Флэше (swf)


3-1106753831
Muchacho
2005-01-26 18:37
2005.02.27
совместимость с 1C


3-1106381724
Dell3r
2005-01-22 11:15
2005.02.27
Сетевая версия


1-1107337808
Drakosha
2005-02-02 12:50
2005.02.27
Ошибка при активизации последней ячейки





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский