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, в нем происходит удаление.
Поддержание целостности данных при их изменении поддерживается за счет механизма триггеров.