
- •Работа с таблицами в системе управления базами данных oracle
- •Типы данных Oracle
- •Строки символов
- •Числовые типы
- •Двоичные данные
- •Дата и время
- •Преобразование типов данных
- •Правила сравнения типов данных
- •Значения Null
- •Псевдостолбцы
- •Объекты базы данных
- •Создание таблиц
- •Ограничения для таблиц и столбцов
- •Alter table
- •Удаление таблицы
- •Ввод данных в таблицы
- •Удаление таблицы
- •Представление
- •Индексы
- •Create sequence
- •Create synonym
- •Индексы
- •Работа с индексами
- •Явные и неявные индексы
- •Изменение индекса
- •Удаление индексов
- •Битовые индексы
- •Кластеры
- •Создание кластеров
- •Удаление кластеров
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