dil: (Default)
dil ([personal profile] dil) wrote2005-10-13 12:21 pm

Учился писать программы на PL/SQL

Ну вылитый паскаль.

Кроме того много думал о менталитете авторов Оракла. Он у них получился весь такой логичный-логичный. Но в некоторых местах всё-таки очень ненатуральный..

Вот, например, там нет автоинкрементируемых полей. Вместо них есть sequence, из которых при необходимости можно извлечь очередное значение и засунуть его в нужное поле. При добавлении записи это можно сделать автоматически, например, триггером.
Но вот как клиент может узнать, какое именно значение попало в свежедобавленную запись? Посмотреть в sequence можно, но если в это время кто-нибудь еще вставлял запись в ту же таблицу, то sequence мог уже поменяться.
[livejournal.com profile] cybernatic_cat предложил весь процесс вставки завернуть в хранимую функцию, которая будет сама извлекать очередное значение из sequence, и потом его возвращать.
Да, это будет надёжно работать, но.. как-то оно совсем ненатурально по сравнению с простым и логичным MySQLным SELECT LAST_INSERT_ID() или MSSQLным SELECT @@IDENTITY.

Или я просто не умею правильно готовить этих кошек?

[identity profile] dma.livejournal.com 2005-10-13 12:40 pm (UTC)(link)
Да.
Но вообще - не надо триггеры на это пользовать. Правильнее в инсерте сказать seqname.NEXTVAL

[identity profile] dil.livejournal.com 2005-10-13 12:57 pm (UTC)(link)
Не-а. Правильно, чтобы о целостности и непротиворечивости данных заботилась СУБД, а не приложение. Поэтому если автоинкремента нет, то пусть будет триггер.

[identity profile] dma.livejournal.com 2005-10-13 01:17 pm (UTC)(link)
Тогда тебе и currval не нужен. Делай insert, потом select его обратно, по каким-нибудь характерным признакам. Пусть база заботится.

[identity profile] dil.livejournal.com 2005-10-13 01:23 pm (UTC)(link)
Характерные признаки правильно называются "уникальный ключ". Если б он у меня был, известный клиенту, мне бы ID не понадобился :)