Як красиво виконати insert
Як красиво виконати INSERT?
Милостиві а так само і сведующие государі!
Є щось на зразок стрічкової форми, в якій відображаємо кілька записів і
плазуємо по набору даних відображаючи кілька записів у стрічці.
При додаванні запису все панельки -форми зачищаються і у верхній юзер
вводить запис, потім тисне Save, ось і далі треба виконати INSERT на
табличці де ID безумовно заповнюється тригером з SEQUENCE. Все ОК, але
після стрічка формочок-записів оновити треба і вкрай бажано відобразити
знову додану запис в стрічці (скажімо вгорі) і встановити на їй курсор БД.
Потрібно залокаліть по ID і перечитати кілька записів на ленту.все ОК.
Але ось як ID -то дізнатися. Справа в тому, що забій в БД йде дуже інтенсивно і як
показує практика, між Query.Close і Query.Open цілком може додатися ще
чужих записів з інших місць інших місць. Мені в голову нічого, крім як лочіть таблицю перед вставкою, після встакі брати MAX ID для позиціонування і відпускати таблицю не спадає (а гальма.). Чи не прив'язувати ж записи до користувачів! Що робити?
Я в Оракл НЕ копенгаген, але думаю що і там є процедури, що з аутпут-параметрами.
Самий тут оптимальний шлях, на мій погляд - це після Insert спробувати виконати запит типу
Select MySequence.CurrVal from dual;
Він поверне останній ID, причому ORACLE гарантує, що ID буде останнім для ПОТОЧНОГО СЕСІЇ, тобто саме те, що треба.
Два вимоги - різні користувачі працюють в різних сесіях, і різні послідовності управляють різними таблицями.
Якщо що незрозуміло - можу пояснити докладніше.
Я роблю це так. У Тригер роблю не безумовне заповнення з послідовності, а за умовою
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.) Таблиць.
Величезне спасибі ЗА КОНСАЛТ.
Дійсно, secuence.currval хвала богам,
сохраняється значення для сесії -самое просте і
думається швидке рішення. Вставляю я по одному запису,
без накопичення, в двузвенніке. А тригер його породітель НЕ
Захотілося іфіть. Ну і не нада. -))
Пам'ять: 0.74 MB
Час: 0.036 c