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.

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

Re: не умеете.

[identity profile] lslarry.livejournal.com 2005-10-13 12:55 pm (UTC)(link)
о. давай в самом деле тут продолжим.
т.е. тебе надо быть увереным в целостности твоих новых данных. ты из связываешь по какому-то ключу и этот ключ должен быть валиден. т.е. одна логическая атомарная операция (сделать новую заявку, конкретный пример у меня) при спуске вниз рожает три инсерта в разные таблицы.
так AFAIK все нормальные субд обеспечивают правильность и уникальность curval/nextval внутри транзакции (заметь, не сессии), до комита.

Re: не умеете.

[identity profile] dil.livejournal.com 2005-10-13 12:59 pm (UTC)(link)
угу. вот товарищи говорят, что и оракл в этом плане действует так же, но почему об этом явно не написано в документации?

Re: не умеете.

[identity profile] dma.livejournal.com 2005-10-13 01:18 pm (UTC)(link)
..потому что об этом написано в другой документации, я подозреваю. SQL standart, называется :)

Re: не умеете.

[identity profile] dil.livejournal.com 2005-10-13 01:26 pm (UTC)(link)
не-а. если б это было стандартом, оно было бы одинаково для всех стандартных СУБД, а оно разное.
Ссылка по теме: http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96590/adg03sch.htm#1263
Только она доступна залогиненным пользователям. Там описано, как пользоваться последовательностями, но насчет persistent'ности currval ничего не написано :(

Re: не умеете.

[identity profile] mastre.livejournal.com 2005-10-15 12:23 pm (UTC)(link)
во-первых у insert в оракле есть дополнение returning, как уже было сказано выше
во-вторых, доки оракла идут с сервером и доступны на 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: не умеете.

[identity profile] dil.livejournal.com 2005-10-17 10:01 am (UTC)(link)
Да, спасибо. Вот фразу про One user can never acquire the sequence number generated by another user я не углядел. Видимо, не там читал.
А на Аду это не похоже, она гораздо более сильно типизированная и пакетизированная. Это даже на модулу не тянет, это типичный паскаль с SQLными дополнениями :)