Ну вылитый паскаль.
Кроме того много думал о менталитете авторов Оракла. Он у них получился весь такой логичный-логичный. Но в некоторых местах всё-таки очень ненатуральный..
Вот, например, там нет автоинкрементируемых полей. Вместо них есть sequence, из которых при необходимости можно извлечь очередное значение и засунуть его в нужное поле. При добавлении записи это можно сделать автоматически, например, триггером.
Но вот как клиент может узнать, какое именно значение попало в свежедобавленную запись? Посмотреть в sequence можно, но если в это время кто-нибудь еще вставлял запись в ту же таблицу, то sequence мог уже поменяться.
cybernatic_cat предложил весь процесс вставки завернуть в хранимую функцию, которая будет сама извлекать очередное значение из sequence, и потом его возвращать.
Да, это будет надёжно работать, но.. как-то оно совсем ненатурально по сравнению с простым и логичным MySQLным SELECT LAST_INSERT_ID() или MSSQLным SELECT @@IDENTITY.
Или я просто не умею правильно готовить этих кошек?
Кроме того много думал о менталитете авторов Оракла. Он у них получился весь такой логичный-логичный. Но в некоторых местах всё-таки очень ненатуральный..
Вот, например, там нет автоинкрементируемых полей. Вместо них есть sequence, из которых при необходимости можно извлечь очередное значение и засунуть его в нужное поле. При добавлении записи это можно сделать автоматически, например, триггером.
Но вот как клиент может узнать, какое именно значение попало в свежедобавленную запись? Посмотреть в sequence можно, но если в это время кто-нибудь еще вставлял запись в ту же таблицу, то sequence мог уже поменяться.
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
Да, это будет надёжно работать, но.. как-то оно совсем ненатурально по сравнению с простым и логичным MySQLным SELECT LAST_INSERT_ID() или MSSQLным SELECT @@IDENTITY.
Или я просто не умею правильно готовить этих кошек?
Tags:
no subject
имена функций - приблизительные.
no subject
Только там нигде явно не написано, что CURRVAL поддерживается неизменным для сессии/транзакции.
no subject
no subject
no subject
no subject
То есть если ты сказал
INSERT INTO mytable(ID, x) VALUES(seqname.NEXTVAL, 'a');
COMMIT
SELECT seqnane.CURRVAL FROM DUAL;
То тогда оно не сказать, чтобы определено. А вот пока коммит не сказал - CURRVAL абсолютно точно вернёт твоё значение, которое надо.
no subject
no subject
Но вообще - не надо триггеры на это пользовать. Правильнее в инсерте сказать seqname.NEXTVAL
no subject
no subject
no subject
не умеете.
в пг, например, это делается, через SELECT nextval(seq);
более того, результат селекта гарантированно правилен. т.е. каждая сессия из например цги получит правильное, уникальное число.
т.е. правильность транзакции обеспечивает сама субд. в отличие от.
хм. чот сумбурно как-то выходит. надеюсь донес мысль.
Re: не умеете.
Re: не умеете.
Re: не умеете.
Re: не умеете.
Re: не умеете.
только давайте определимся с терминами. как понимать "для текущей сессии"? сессии или транзакции?
Re: не умеете.
Re: не умеете.
Re: не умеете.
no subject
Re: не умеете.
т.е. тебе надо быть увереным в целостности твоих новых данных. ты из связываешь по какому-то ключу и этот ключ должен быть валиден. т.е. одна логическая атомарная операция (сделать новую заявку, конкретный пример у меня) при спуске вниз рожает три инсерта в разные таблицы.
так AFAIK все нормальные субд обеспечивают правильность и уникальность curval/nextval внутри транзакции (заметь, не сессии), до комита.
Re: не умеете.
Re: не умеете.
Re: не умеете.
Ссылка по теме: http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96590/adg03sch.htm#1263
Только она доступна залогиненным пользователям. Там описано, как пользоваться последовательностями, но насчет persistent'ности currval ничего не написано :(
Re: не умеете.
во-вторых, доки оракла идут с сервером и доступны на OTN (регистрация бесплатная), и там сказано вот что:
Purpose
Use the CREATE SEQUENCE statement to create a sequence, which is a database object from which multiple users may generate unique integers. You can use sequences to automatically generate primary key values.
When a sequence number is generated, the sequence is incremented, independent of the transaction committing or rolling back. If two users concurrently increment the same sequence, then the sequence numbers each user acquires may have gaps, because sequence numbers are being generated by the other user. One user can never acquire the sequence number generated by another user. Once a sequence value is generated by one user, that user can continue to access that value regardless of whether the sequence is incremented by another user.
Sequence numbers are generated independently of tables, so the same sequence can be used for one or for multiple tables. It is possible that individual sequence numbers will appear to be skipped, because they were generated and used in a transaction that ultimately rolled back. Additionally, a single user may not realize that other users are drawing from the same sequence.
то есть, сиквенсы (возвращаемое значение currval) разделены по сессиям.
а PL/SQL вроде как сделан на основе Ады
Re: не умеете.
А на Аду это не похоже, она гораздо более сильно типизированная и пакетизированная. Это даже на модулу не тянет, это типичный паскаль с SQLными дополнениями :)