4.2. Навигационные операции
Навигационные операции реализуются с помощью
навигационных языков. Они обеспечивают навигацию по БД, то есть
последовательный просмотр кортежей. Набор навигационных операций
сводится к созданию скана (курсора) для просмотра записей
какого-либо отношения, организации цикла, для которого создан скан
(операции входа в цикл и выхода из цикла, операция перехода к
следующему кортежу, удовлетворяющему заданному условию), уничтожению
скана. Синтаксис конкретного навигационного языка определяется
конкретной реализацией. Рассмотрим пример навигационного языка.
Команды:
CREATE SCAN <имя> ON <отношение> - создает скан с указанным именем
DROP SCAN <имя> - удаляет скан с указанным именем
GET NEXT <имя_скана> [WHERE <условие>] - выдача следующего кортежа,
если указано условие, то следующего кортежа, удовлетворяющего
условию, операция выполняется в цикле. Если такого нет, то выход из
цикла.
BEGIN <имя_скана>....END - операторные скобки, ограничивающие тело
цикла для скана с указанным именем.
Кроме того, в навигационном языке должны быть определены команды
действий, реализующие конкретные операции над текущим в данный
момент кортежем, например output и Delete (распечатать и удалить),
могут быть определены и другие более сложные действия.
Пример запроса 1.
Найти всех преподавателей старше 40 лет.
CREATE SCAN A ON ПРЕПОДАВАТЕЛИ BEGIN A
GET NEXT A WHERE возраст>4 0 OUTPUT A END
DPOP SCAN A
Пример запроса 2. Выдать всех преподавателей физико-математического
факультета, получающих з/п больше 15000 рублей. Удалить тех из них,
у кого стаж <2 лет.
Поскольку запрос сложный, то для удобства пронумеруем каждую строку,
чтобы затем прокомментировать.
1) CREATE SCAN A ON ФАКУЛЬТЕТЫ
2) BEGIN A
3) GET NEXT A WHERE назв='ФМФ'
4) CREATE SCAN B ON КАФЕДРЫ
5) BEGIN B
6) GET NEXT B WHERE id_фак=A.id
7) CRЕATE SCAN C ON БЫТЬ_СОТР
8) BEGIN C
9) GET NEXT C WHERE (id_каф=B.id) Л (з\п>15000)
10) CREATE SCAN D ON Преподаватели
11) BEGIN D
12) GET NEXT D WHERE id=C.id_преп
13) OUTPUT D
14) END
15) DROP SCAN D
16) CREATE SCAN E ON Преподаватели
17) BEGIN E
18) GET NEXT E WHERE ^^^_преп) AND (стаж<2)
19) DELETE E
20) END
21) DROP SCAN E
22) END
23) DROP SCAN C
24) END
25) DROP SCAN B
26) END
27) DROP SCAN A
Комментарии.
Для того, чтобы выделить преподавателей ФМФ, надо сначала вычленить
кафедры, которые относятся к ФМФ, а потом через отношение,
реализующие связи “БЫТЬ_СОТР”, определить преподавателей этих
кафедр, получающих > 15000 р. В заключение надо будет обойти только
те из них, у которых значение атрибута стаж <2. Поэтому здесь три
вложенных цикла. Внешний цикл, начинающийся в строке A, перебирает
все кафедры ФМФ. Для каждой из них организуется обход кортежей
отношения БЫТЬ_СОТР с з/п>15000 р. Этот вложенный цикл начинается в
строке 8. В нем в свою очередь вложено 2 цикла, один, начинающийся в
11-й строке, определяет преподавателя, которому соответствует
текущей кортеж в отношении БЫТЬ_СОТР, в нем идет распечатка. ругой
цикл, начинающийся в 17-й строке еще и проверяет условие стаж<2, в
нем происходит удаление.
Поддержание целостности данных при их изменении поддерживается за
счет механизма триггеров.
|