Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
кожин / Лекции / Лекция 05 create_table.DOC
Скачиваний:
32
Добавлен:
20.03.2016
Размер:
233.47 Кб
Скачать
    1. Create sequence

Создание объекта базы данных, с помощью которого многие пользователи могут генерировать уникальные целые числа. Последовательные номера можно ис­пользовать для автоматической генерации основных ключей.

Требуется привилегия RESOURCE как минимум - в одном табличном пространстве. При создании после­довательности, которой будет владеть другой поль­зователь, необходима привилегия DBA.

CREATE SEQUENCE [user.]sequence

[INCREMENT BY n]

[START WITH n]

[MAXVALUE n | NOMAXVALUE]

[MINVALUE n | NOMINVALUE]

[CYCLE | NOCYCLE]

[CACHE n | NOCACHE]

[ORDER | NOORDER]

user владелец последовательности. Подразумевается пользователь, выдавший команду CREATE SEQUENCE

sequence имя последовательности. Должно следовать соглашениям ORACLE по именованию объектов базы данных.

INCREMENT BY определяет интервал между последовательными номерами. Если име­ет отрицательное значение, то последовательность убывающая, если положительное - последова­тельность возрастающая. Допусти­мо любое целое число не равное нулю. Умолчание 1 (возрастающая).

START WITH первый генерируемый последовательный номер. По умолчанию для возрастающих последовательностей равен MINVALUE, а для убывающих - MAXVALUE.

MINVALUE NOMINVALUE минимальное значение последовательного номера, которое будет генерироваться. Эта фраза опре­деляет нижнюю границу последова­тельности. Для возрастающих пос­ледовательностей равно 1, для убывающих 10e2 -1.

MAXVALUE NOMAXVALUE максимальное значение последовательного номера, которое будет генерироваться. Эта фраза опре­деляет верхнюю границу последо­вательности. Для убывающих пос­ледовательностей равно 1, для возрастающих 10e -1.

CYCLE По умолчанию предполагается NOCYCLE NOCYCLE, что означает завершение генерирования последовательных номеров по достижении конца пос­ледовательности. Любая попытка сгенерировать номер после этого приведет к ошибке.

Если специфицировано CYCLE, пос­ледовательность после достижения MAXVALUE (для возрастающих) вы­даст MINVALUE. Для убывающих последовательностей после выдачи MINVALUE выдастся MAXVALUE.

CACHE NOCACHE CACHE заранее готовит последовательные номера, так что при запросе их можно выбрать их памяти, в результате чего генерация пос­ледовательных номеров выполняет­ся быстрее.

По умолчанию предполагается зна­чение CACHE 20. Значение, указываемое в CACHE не должно превышать разницы между MAXVALUE и MINVALUE.

ORDER NOORDER специфицирует, что гарантируется генерация последовательных номеров в порядке запро­са. Это бывает важно для приложений, которые используют последовательные номера в ка­честве меток времени. Обычно это неважно, если таблицы используют последовательности для генериро­вания основных ключей. Даже если параметр ORDER не указан, после­довательность скорее всего будет генерироваться так, как если бы он был указан.

Можно использовать последовательные номера для автоматической генерации основных ключей, а также координировать ключи между нескольких столбцов или таблиц. Для создания после­довательности необходимо иметь привилегию RESOURSE как минимум - в одном табличном пространстве, а для доступа к чужой последовательности необходимо иметь к ней привилегию SELECT. DBA может генери­ровать последовательности с владельцами, отличны­ми от создающего пользователя. Последовательности могут быть изменены и отменены. Возможна регист­рация доступа к ним. Кроме того, последователь­ность может иметь синоним.

Действительные последовательные номера генериру­ются системой ORACLE автоматически и, следова­тельно, не являются узким местом, что случается, когда последовательные номера генерируются на уровне приложения. Например, при реализации на уровне приложения каждая транзакция должна блоки­ровать таблицу последовательных номеров, увеличи­вать последовательный номер и затем освобождать таблицу. При такой реализации одновременно может быть сгенерирован только один последовательный номер. Напротив, генераторы последовательностей системы ORACLE допускают параллельное генерирова­ние нескольких последовательных номеров, гаранти­руя при этом их уникальность.

Так как последовательные номера генерируются не­зависимо от таблиц, один и тот же генератор последовательностей может быть использован для одной или нескольких таблиц. Допустимо, чтобы последовательные номера иногда пропускались. Это связано с тем, что транзакция, их сгенерировав­шая, была отменена (rollback). Более того, от­дельные пользователи могут и не знать, что из той же последовательности берут номера другие пользо­ватели.

Чтобы посмотреть, к каким последовательностям имеется доступ, запрашиваются обзоры словаря данных USER_SEQUENCES и ALL_SEQUENCES.

Последовательности могут экспортироваться и им­портироваться наравне с таблицами. Экспорт сохра­няет последовательные номера, так что после им­порта получается результат, как будто экспорт или импорт не выполнялись.

Умолчания для последовательностей спроектированы таким образом, что не указав никаких фраз соз­дается возрастающая последовательность, начинаю­щаяся с 1, возрастающая на 1 и не имеющая верхне­го предела. Если специфицирован только "INCREMENT BY -1", создастся убывающая последова­тельность начинающаяся с -1 и не имеющая нижнего ограничения. Фразы, описанные в подзаголовке "Ключевые слова и параметры", допускают различные вариации этих стандартных последовательностей.

Последовательность может:

* расти безгранично

* останавливаться на заранее заданном пределе

* начинаться снова после достижения заранее заданного лимита.

Чтобы создать последовательность без границ не задается MAXVALUE для возрастающих последо­вательностей и MINVALUE - для убывающих, а также не указывается NOCYCLE.

Чтобы создать последовательность, останавливающу­юся в на определенном номере, специфицируйте MAXVALUE для возрастающих последовательностей и MINVALUE - для убывающих, а также задается NOCYCLE. Любая попытка сгенерировать последова­тельный номер после достижения ограничения приве­дет к ошибке.

Чтобы создать последовательность, начинающуюся снова после достижения предела, определяется и MAXVALUE и MINVALUE. Задается также и CYCLE.

Фраза START WITH влияет только на первый последо­вательный номер. При возврате на начало последо­вательность будет начинаться с MINVALUE в случае возрастания и MAXVALUE - в случае убывания.

Число последовательных номеров, кеширующихся в памяти, определяется аргументом фразы CACHE. Кешируемые последовательности обеспечивают более быструю генерацию последовательны номеров. Кеш для каждой данной последовательности заполняется после первого запроса номера из этой последова­тельности. В случае краха системы все кешируемые последовательные номера, не использованные в за­писанных транзакциях (commited), теряются. Потен­циальное число потерянных номеров равно числу, указанному во фразе CACHE.

Параметры, влияющие на поведение всех последова­тельностей, задаются в файле INIT.ORA.

По умолчанию предполагается, что в памяти будут кешироваться 20 последовательных номеров, которые генерируются системой ORACLE заранее для ускоре­ния доступа.

NEXTVAL Псевдостолбец NEXTVAL используется для генерирования очередного номера из указанной последова­тельности. Ссылка на NEXTVAL приводит к генерированию очередного номера. Обращение имеет следующий синтаксис:

sequence.NEXTVAL

где sequence - это имя последовательности.

CURRVAL Псевдостолбец CURRVAL - это текущее значение последовательного номера. Ссылка на NEXTVAL приводит к тому, что текущее значение номера помещается в CURRVAL. В текущем сеансе NEXTVAL должен быть ис­пользован хотя бы один раз до ссылки на CURRVAL. Обращение к CURRVAL имеет следующий синтаксис:

sequense.CURRVAL

где sequence - имя последовательности, на которую ссылался NEXTVAL.

NEXTVAL и CURRVAL можно использовать:

* во фразе SELECT оператора SELECT (исключая обзоры)

* в списке значений оператора INSERT

* в выражении SET оператора UPDATE NEXTVAL и CURRVAL не разрешено использовать:

* внутри подзапроса

* внутри списка select для обзора

* с ключевым словом DISTINCT

* с фразами ORDERBY,GROUPBYиHAVINGопера­тораSELECT

* с операциями объединения (UNION, INTERSECT, MINUS)

Пример. После создания последовательность может использоваться для генерирования номеров. Допустим в сле­дующих примерах, что пользователь ELLY создала последовательность с именем ESEQ:

CREATE SEQUENCE ESEQ INCREMENT BY 10

Первое обращение к ESEQ.NEXTVAL вернет 1, следую­щее вернет 11. Каждая последующая ссылка будет возвращать значение на 10 большее предыдущего.

NEXTVAL всегда необходимо предварять именем пос­ледовательности: ESEQ.NEXTVAL. Для данной после­довательности ссылка на NEXTVAL в одном операторе может быть выполнена лишь однажды. Несколько ссы­лок в одном операторе будут возвращать одно и то же значение последовательного номера.

NEXTVAL может быть встроено внутрь DML - операто­ра:

INSERT INTO EMP VALUES (ESEQ.NEXTVAL,'LEWIS','TIMOTHY')

(в предположении что EMP имеет три столбца: EMPNO, LAST_NAME, FIRST_NAME).

При генерации последовательного номера он добав­ляется независимо от того, записана или откачена транзакция. Если два пользователя одновременно обращаются к одной последовательности, номера для каждого пользователя могут иметь промежутки, так как из непрерывной последовательности попеременно получают номера оба пользователя. Каждый из двух пользователей не будет видеть последовательные номера, сгенерированные для другого пользователя.

После выполнения предыдущего оператора INSERT можно будет выполнить следующую команду:

INSERT INTO EMP_PROJ VALUES (ESEQ.CURRVAL, 101)

(предполагая, что EMP_PROJ содержит два столбца: EMPNO и PROJNO).

Использование в одном операторе и NEXTVAL и CURRVAL приведет к тому, что в обоих случаях бу­дет использоваться NEXTVAL независимо от порядка их появления в команде.

Чтобы увидеть последний номер, сгенерированный в сеансе, можно выполнить следующий оператор:

SELECT ESEQ.CURRVAL FROM any_table

Соседние файлы в папке Лекции