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

Вниз

Как красиво исполнить INSERT?   Найти похожие ветки 

 
Duce   (2002-02-14 12:37) [0]

Милостивые а равно и сведующие государи!

Delphi6 + Oracle7.

Есть нечто вроде ленточной формы, в которой отображаем несколько записей и
ползаем по набору данных отображая несколько записей в ленте.
При добавлении записи все панельки -формы зачищаются и в верхней юзер
вводит запись, затем жмет Save, вот и дальше надо исполнить INSERT на
табличке где ID безусловно заполняется триггером из SEQUENCE. Все ОК, но
после лента формочек-записей обновить надо и крайне желательно отобразить
вновь добавленную запись в ленте(скажем вверху) и установить на ей курсор БД.
Нужно залокалить по ID и перечитать несколько записей на ленту.все ОК.
Но вот как ID -то узнать!? Дело в том,что забой в БД идет очень интенсивно и как
показывает практика, между Query.Close и Query.Open вполне может добавиться еще
чужих записей с других мест других мест. Мне в голову ничего, кроме как лочить таблицу перед вставкой, после встаки брать MAX ID для позиционирования и отпускать таблицу не приходит(а тормоза???). Не привязывать же записи к юзерам! Что делать?


 
Fay   (2002-02-14 14:31) [1]

Я в Оракле не копенгаген, но думаю что и там есть хранимые процедуры с аутпут-параметрами.


 
Внук   (2002-02-14 15:06) [2]

Самый здесь оптимальный путь, на мой взгляд - это после Insert попытаться выполнить запрос типа
Select MySequence.CurrVal from dual;
Он вернет последний ID, причем ORACLE гарантирует, что ID будет последним для ТЕКУЩЕЙ СЕССИИ, то есть именно то, что надо.
Два требования - разные пользователи работают в разных сессиях, и разные последовательности управляют разными таблицами.
Если что непонятно - могу объяснить подробнее.


 
Sergey13   (2002-02-15 10:46) [3]

Я делаю это так. В тригере делаю не безусловное заполнение из последовательности, а по условию
if :new.id is null then
select MySequence.Nextval into :new.id from dual;
end if;

А в приложении, если мне надо узнать CurVal, в строку инсерта явно забиваю NextVal типа
insert into MyTable(id,name) values(MySequence.Nextval,"Бла-бла")
потом читаю
select MySequence.CurVal from dual
и гарантировано получаю этот самый ID т.к. запрос к сиквенсу осуществляется в одной сессии. А для таюблицы по барабану где заполняется IDшник, главное что из одного сиквенса.

2Внук
Я не помню, тригер выполняется под СЕССИЕЙ ПОЛЬЗОВАТЕЛЯ(он ведь выполнятся с правами владельца) или как то автономно. Надо будет проверить, самому интересно стало. Если первое то ты полностью прав. Если второе то правильнее будет мой вариант, так как запрос nextval и curval гарантировано происходят в одной сессии, что при итенсивной вставке разными юзерами очень важно.
Правда твои "требования" по моему - чепуха
1. разные пользователи и не могут ОДНОВРЕМЕННО работать в одной сессии, а при указании схемы в запросе, пользователь значения не имеет, лишь бы права были.
2. а какая разница в сколько таблиц я вставляю данные из сиквенса? А может по другому и не сделаешь. Если допустим надо чтобы ключи не пересекались для 2(3,4,5...)таблиц.


 
Внук   (2002-02-15 13:32) [4]

>>Sergey13 ©
Тоже вариант, только непонятно, зачем тогда здесь вообще нужен триггер. И как-то сложно это :)
Насчет сессии - действительно, проверьте. Это убедит Вас лучше, чем я. В этом смысле триггер, по-моему, не отличается от хранимых процедур, а с их использованием все работает.
Насчет требований:
1. Наверное, мы говорим о разных вещах. Я под пользователем имел в виду не пользователя ORAСLE, а пользователя программы. Пример: пишу трехзвенное приложение. Сервер приложения - COM-объект, живущий в единственном экземпляре для всех клиентов. Каждый клиент при запуске получает ссылку на одну и ту же сессию. Здесь начнется веселье со значением CurVal.
2. Иногда бывает нужно выполнить "каскадный" Insert. То есть успешно вставить в разные таблицы соответствующие записи, или при ошибке не вставлять ничего. Если для этих таблиц используется одна и та же последовательность, невозможно (или затруднительно) определить ID записи, вставленной в первую по очереди таблицу.
Эти условия я не выдумываю, а привожу исходя из собственного опыта :-)


 
Duce   (2002-02-15 17:15) [5]

ОГРОМНОЕ СПАСИБО ЗА КОНСАЛТ!!!
Действительно, secuence.currval хвала богам,
сохраняеть значение для сессии -самое простое и
думается быстрое решение. Вставляю я по одной записи,
без накопления, в двузвеннике... А триггер его породитель не
захотель ифить...Ну и не надА! :-))



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

Форум: "Базы";
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.004 c
1-43106
Michael C
2002-02-28 10:45
2002.03.14
Народ, как сравнить текущий выбираемый элемент массива


14-43166
Alex12
2002-01-28 15:20
2002.03.14
Delphi или C?


1-43071
cahek2000
2002-02-27 09:56
2002.03.14
Синхронный скролинг


4-43234
davile
2002-01-15 17:31
2002.03.14
Help!!! Mne with Handle чужого окна плз ||||||| ; ) ||||||


1-43033
makar
2002-02-26 09:25
2002.03.14
Вопрос





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