
- •7.4.3. Операции модификации строк
- •7.4.4. Операции удаления строк
- •7.5. Построение выражений
- •7.6. Средства определения, модификации и удаления представлений
- •7.7. Средства определения, модификации и удаления синонимов
- •7.8. Средства определения, модификации и удаления последовательностей
- •7.9. Средства определения, модификации и удаления пользователей
7.7. Средства определения, модификации и удаления синонимов
Синоним – это объект базы данных, используемый для альтернативного именования других объектов. Обычно синонимы создаются для таблиц и представлений, предназначенных для общего использования. Наличие синонимов позволяет обеспечивать независимость приложений от того, в какой схеме размещена таблица или представление. Оператор определения синонима имеет следующий синтаксис:
CREATE [PUBLIC] SYNONYM [имя_схемы1.]имя_синонима
FOR [имя_схемы2.]имя_объекта
Ключевое слово PUBLIC определяет, что синоним будет доступен всем пользователям, т.е. будет являться общим. По умолчанию синоним доступен только создавшему его пользователю.
Параметр имя_схемы1 задает имя существующей в базе данных схемы, в которой предполагается создать синоним. Параметр имя_синонима задает имя создаваемого синонима. Если параметр имя_схемы1 опущен, то предполагается, что синоним создается в схеме пользователя, выдавшего команду. Синоним должен иметь имя, отличное от имен остальных объектов схемы, в которой создается синоним.
Параметр имя_схемы2 задает имя схемы, в которой находится объект, для которого создается синоним. Наконец, параметр имя_объекта указывает на этот объект.
Пример 25. Создать синоним “prj” для таблицы project.
Данная задача может быть решена путем создания обычного синонима или общего синонима. Этим двум вариантам будут соответствовать следующие команды:
CREATE SYNONYM prj FOR project
и
CREATE PUBLIC SYNONYM prj FOR project
Операции вставки, модификации и удаления строк с использованием синонимов таблиц аналогичны операциям с самими таблицами.
Для удаления синонимов используется команда, имеющая следующий синтаксис:
DROP [PUBLIC] SYNONYM [имя_схемы.]имя_синонима
Необязательное ключевое слово PUBLIC определяет факт удаления общего синонима. Изменить синоним можно только путем его удаления и последующего создания.
7.8. Средства определения, модификации и удаления последовательностей
На практике часто возникает ситуация, когда нескольким пользователям требуется выполнить вставку данных в одну и ту же таблицу одновременно. При этом каждый их них должен вставлять строки, у которых значения столбца, входящего в состав первичного ключа таблицы, будут отличаться.
Последовательностью называется объект базы данных, генерирующий неповторяющиеся целые числа. Полученные из последовательности числа обычно используются в качестве значений колонок, входящих в состав первичных ключей.
Одна последовательность может использоваться для генерации первичных ключей для нескольких таблиц. Если несколько пользователей одновременно обращаются к одной последовательности, номера для каждого пользователя могут иметь промежутки, так как из непрерывной последовательности попеременно получают номера все пользователи. Каждый из пользователей не будет видеть последовательные номера, сгенерированные для других пользователя. При генерации элемента последовательности счетчик элементов изменяется независимо от того, успешно или неуспешно завершена транзакция.
Числа, создаваемые последовательностью, могут либо возрастать постоянно, либо только до определенного предела, либо, по достижении предела, начинать возрастание заново, с начального значения. Последовательность может создавать цепочки как увеличивающихся чисел, так и уменьшающихся. Можно задавать также и приращение значений.
Оператор определения последовательности СУБД Oracle использует следующий синтаксис:
CREATE SEQUENCE [имя_схемы.]имя_последовательности
[INCREMENT BY приращение]
[START WITH начальное_значение]
[MAXVALUE наибольшее_значение|NOMAXVALUE]
[MINVALUE наименьшее_значение|NOMINVALUE]
[CYCLE|NOCYCLE]
[CACHE число_элементов|NOCACHE]
Параметр имя_схемы указывает на схему, в которой будет создана последовательность. Если схема не указана явно, то подразумевается схема пользователя, выдавшего команду CREATE SEQUENCE. Параметр имя_последовательности задает имя создаваемой последовательности.
Параметр приращение, заданный после ключевых слов INCREMENT BY, определяет интервал между последовательными номерами. Если параметр приращение имеет отрицательное значение, то последовательность убывающая, если положительное – последовательность возрастающая. Допустимо любое целое число, не равное нулю. По умолчанию параметр приращение принимает значение 1 (возрастающая последовательность значений).
Параметр начальное_значение, указанный после ключевых слов START WITH, задает первый генерируемый последовательностью номер. Если ключевые слова START WITH не указаны, то по умолчанию для возрастающих последовательностей начальный генерируемый последовательный номер равен значению параметра наименьшее_значение, а для убывающих последовательностей — значению параметра наибольшее_значение.
Параметр наибольшее_значение, указанный после ключевого слова MAXVALUE, задает максимальное значение последовательного номера, которое будет генерироваться. Параметр наибольшее значение определяет верхнюю границу последовательности, которая может быть любым целым числом, с количеством знаков, не превышающим 28 цифр и большим, чем параметры начальное_значение и наименьшее_значение (если они заданы). Отсутствие верхней границы указывается ключевым словом NOMAXVALUE, которое определяет для убывающих последовательностей значение -1, а для возрастающих последовательностей 1027.
Параметр наименьшее_значение, указанный после ключевого слова MINVALUE, задает минимальное значение последовательного номера, которое будет генерироваться. Параметр наименьшее_значение определяет нижнюю границу последовательности, которая может быть любым целым числом, с количеством знаков, не превышающим 28 цифр, меньшим, чем параметры наибольшее_значение и начальное_значение (если значение параметров задано). Отсутствие нижней границы указывается ключевым словом NOMINVALUE, которое определяет для убывающих последовательностей значение -1026, а для возрастающих последовательностей значение –1.
Если ключевые слова START WITH не указаны, то по умолчанию для возрастающих последовательностей начальный генерируемый последовательный номер равен значению параметра наименьшее_значение, а для убывающих последовательностей – значению параметра наибольшее_значение.
Ключевое слово NOCYCLE, используемое по умолчанию, предполагает завершение генерирования последовательных номеров по достижении конца последовательности. Любая попытка получить очередной элемент последовательности после этого приведет к ошибке. Если при определении последовательности указано ключевое слово CYCLE, то после достижения значения параметра наибольшее_значение (для возрастающих последовательностей) будет выдано значение параметра наименьшее_значение. Если параметры наибольшее_значение и наименьшее_значение не указаны, то используются их значения по умолчанию. Для убывающих последовательностей параметры меняются местами. Необходимо помнить, что ключевые слова START WITH влияют только на первый элемент последовательности. При возврате на начало последовательность будет начинаться с параметра наименьшее_значение в случае возрастающей последовательности и с параметра наибольшее_значение в случае убывающей.
Ключевое слово CACHE указывает на использование техники предварительной подготовки элементов последовательности, что обеспечивает их быстрое получение при запросе. Число последовательных номеров, хранящихся в области кэша оперативной памяти, определяется параметром число_элементов после ключевого слова CACHE. Кэширование последовательности обеспечивают более быструю генерацию элементов последовательности. Заполнение кэша для каждой данной последовательности происходит после запроса первого элемента этой последовательности. По умолчанию предполагается, что в памяти будут кэшироваться 20 последовательных элементов для каждой последовательности. Значение параметра число_элементов не должно превышать разницы между параметрами, задаваемыми ключевыми словами наибольшее_значение и наименьшее_значение. Для отключения механизма кэширования необходимо использовать ключевое слово NOCACHE.
Получить значение следующего элемента последовательности возможно путем применения запросов, в которых необходимо указать в перечне колонок псевдостолбец последовательности NEXTVAL. Простейший запрос можно построить к фиктивной таблице DUAL, которая всегда содержит только одну строку (данная фиктивная таблица является особенностью СУБД Oracle). Синтаксическая конструкция такого запроса будет иметь вид:
select имя_последовательности.NEXTVAL from DUAL
Также возможно использование псевдостолбца CURRVAL для ссылки на текущее значение последовательности. В текущем сеансе соединения с базой данных псевдостолбец NEXTVAL должен быть использован хотя бы один раз до использования CURRVAL.
В рамках одного запроса генерируется лишь одно новое значение последовательности; то есть, если в запросе псевдостолбец NEXTVAL применительно к одной и той же последовательности встречается несколько раз, то лишь для первого обращения будет возвращено новое значение последовательности, а все остальные обращения в этом же запросе возвратят то же самое значение.
Команда удаления последовательностей имеет следующий синтаксис:
DROP SEQUENCE [имя_схемы.]имя_последовательности
Пример 26. Создать последовательность для генерации значений первичного ключа таблицы project. Последовательность должна генерировать значения от 10 до 1000 с шагом 10.
Для создания такой последовательности необходимо использовать следующую команду:
CREATE SEQUENCE seq_project
INCREMENT BY 10
START WITH 10
MAXVALUE 1000
MINVALUE 10
NOCYCLE
После выполнения этой команды будет создана последовательность с именем seq_project. Для получения значения последовательности можно использовать команду:
SELECT seq_project.NEXTVAL FROM DUAL
В результате выполнения этого запроса будет возвращено значение 10 (рисунок 41).
Рис. 41. Результат запроса следующего
значения последовательности
Повторное выполнение таких запросов будет приводить к получению новых значений с шагом 10.
Если в запросе на выборку дважды указать псевдостолбец NEXTVAL последовательности seq_project, то будет возвращаться только одно значение, генерируемое последовательностью (рисунок 42):
SELECT seq_project.NEXTVAL nextval1,
seq_project.NEXTVAL nextval2
FROM DUAL
Рис. 42. Результат повторного запроса следующего
значения последовательности в одной команде
Пример 27. Вставить в таблицу project запись, в которой номер проекта будет представлять собой значение, генерируемое последовательностью seq_project, а наименование проекта будет представлять собой строку, состоящую из слова “Проект ” и следующего после него номера проекта.
Значение, возвращаемое при использовании псевдостолбца NEXTVAL, можно использовать при непосредственной вставке данных в таблицы. Запрос для реализации задания из примера будет иметь следующий вид:
INSERT INTO project
(proj_no, proj_name)
VALUES (seq_project.NEXTVAL,
'Проект '||TO_CHAR(seq_project.NEXTVAL) )
В результате в таблицу project будет вставлена строка, представленная на рисунке 43.
Рис. 43. Результат вставки строки с использованием
значения последовательности