Скачиваний:
77
Добавлен:
02.05.2014
Размер:
2.54 Mб
Скачать

1 | Course с001 , с001 0ffs , с001 ny offs |

2 course"cooi

3 ;= 00s0ac detect : [ :cx | ( cx get course! ) = 'c001' ] .

4 c001 offs

5 := cqurse_c001 get_offerings .

6 c001 NY offs

7 :■ co01 offs select :

8 [ ;ox j ( ox get location ) = 'New York' ] .

9 * c001_ny_offs .

Пояснения

  • В строке 1 объявлены три локальные переменные: course с001, которая будет ис­пользована для хранения идентификатора объекта курса с номером 'с001'; cqoijdffs, которая будет использована для хранения идентификатора объекта "набора всех потоков" для курса с номером 'с001'; с001 ny offs, которая будет использована для хранения идентификатора набора идентификаторов для требуе­мых потоков (т.е. потоков, читаемых в Нью-Йорке).

  • В строках 2 и 3 посылается сообщение объекту (коллекции), определяемому зна­чением переменной oosoac. Это сообщение вызывает встроенный метод DETECT данной коллекции объектов с указанием следующего аргумента.

[ | р(х) ]

Здесь р(х) —условное выражение, включающее переменную х, а х— переменная диапазона, изменяющаяся в пределах всех членов коллекции, к которой применя­ется метод detect (т.е. множества объектов course в рассматриваемом примере). В результате выполнения метода detect возвращается идентификатор первого найденного объекта этого множества, для которого выражение р(х) оказывается истинным (в рассматриваемом примере это экземпляр объекта класса COURSE для курса с номером 'С001')9, Затем идентификатор этого объекта класса COURSE при­сваивается переменной COURSE_C001.

Замечание. В качестве аргумента метода DETECT можно также задать некоторый аргумент "выхода" на случай, когда выражение р(х) не будет истинным ни для одного объекта в коллекции. Однако такая детализация здесь опущена.

  • В строках 4 и 5 переменной C001_OFFS присваивается идентификатор "множества всех потоков" для курса с номером 'СООГ.

  • Строки 6-8 подобны строкам 2 и 3, поскольку встроенный метод SELECT подобен методу DETECT, за исключением того, что он возвращает идентификатор коллекции идентификаторов всех объектов (вместо того чтобы указывать только на первый найденный объект), для которых выражение р(х) является истинным. В рассматри­ваемом примере в результате выполнения этого метода переменной C001_NY_OFFS присваивается идентификатор набора идентификаторов для тех потоков курса с но­мером 'CQ01', которые читаются в городе 'New York'.

  • В строке 9 этот идентификатор возвращается пользователю.

Следует обратить внимание на некоторые особенности приведенного примера.

9 В этом примере подразумевается, что такие методы, как GET COURCEi (аналог метода GET ЕМР#, описанного в этом разделе), уже определены.


  1. Условное выражение р(х) в методах SELECT и DETECT может содержать (в самом сложном случае) некоторое количество простых скалярных операторов сравнения, которые соединяются с помощью операторов AND, т.е. сложность данного условия поиска ограничена.

  2. Квадратные скобки, окружающие выражение аргумента методов SELECT и DETECT, мож­но заменить круглыми скобками. При использовании круглых скобок в языке OPAL бу­дет предпринята попытка задействовать индекс (если соответствующий индекс сущест­вует), а при использовании квадратных скобок индексы задействованы не будут.

  3. Указание, что метод DETECT возвращает идентификатор "первого найденного" объек­та, для которого значением выражения р(х) будет истина, означает, что найденный объект будет первым найденным при использовании произвольной последовательно­сти поиска, которая будет выбрана языком OPAL для просмотра коллекции (внутри набора идентификаторов не задается никакой внутренней упорядоченности). В рас­сматриваемом примере это замечание не имеет особого смысла, поскольку "первый" объект, для которого выражение р(х) будет истинно, фактически является единст­венным таким объектом.

  4. Внимательный читатель непременно заметит выражения наподобие "метод DETECT", хотя, как отмечалось выше, методы в языке OPAL не имеют имен. Действительно, DETECT и SELECT не являются названиями методов (а потому выражения наподобие "метод DETECT" некорректны). Они, скорее всего, служат именами внешних парамет­ров для некоторых встроенных (и анонимных) методов. Однако для краткости и про­стоты далее в качестве имен методов по-прежнему будут использоваться названия DETECT и SELECT (а также другие подобные им названия для других методов).

5. Кроме того, внимательный читатель заметит, что довольно часто используется вы­ражение "метод NEW". В данном случае оно вполне корректно. В качестве исключе­ния в языке OPAL допускается применение анонимных методов, которые не со­держат каких-либо аргументов, кроме указания объекта-получателя.

Операции обновления

Объектный аналог операции вставки INSERT уже обсуждался в предыдущем подраз­деле, а аналоги операций обновления UPDATE и удаления DELETE рассматриваются ниже.

  • Обновление. Операции обновления выполняются так же, как операции извлечения, но вместо методов GET_ используются методы SET .

  • Удаление. Для удаления объектов используется встроенный метод REMOVE. Точ­нее, он используется для удаления идентификатора некоторого объекта из неко­торой коллекции. Если на данный объект больше не имеется никаких ссылок, т.е. к нему вовсе не может быть осуществлен доступ, то в языке OPAL он авто­матически удаляется системным процессом сборки мусора. Ниже приводится пример реализации операции "удаления сотрудника с номером 'Е001' из набора всех сотрудников".

Е001 := 0ID_0F_SET_0F_ALL_EMPS

DETECT : [ :ЕХ I (EX GETJMPt ) = 'E001' ]. 0ID_0F_SET_0F_ALL_EMPS REMOVE : E001 .

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

Можно прийти к заключению, что механизм реализации удаления с помощью процесса сборки мусора является всего лишь некоторой разновидностью реализа­ции правила ограничения удаления ON DELETE RESTRICT, поскольку объект не удаляется до тех пор, пока на него существует хотя бы одна ссылка. Однако в дан­ном случае это не совсем так. Например, объекты потоков (OFFERING) не содержат идентификаторов соответствующего объекта курса (COURSE), а потому потоки не накладывают "ограничений" на удаление объектов курсов. (В иерархиях вложения неявно подразумевается некоторая разновидность правила каскадного удаления, кроме случаев, когда пользователь выполняет следующее:

  • либо включает идентификатор родительского объекта в дочерний объект;

  • либо включает идентификатор дочернего объекта в какой-то другой объект.

В таких ситуация интерпретация "иерархии вложения" не имеет никакого смысла. В следующем разделе этот вопрос будет рассмотрен при обсуждении обратных переменных.)

В заключение заметим, что операция удаления REMOVE может быть использована для эмуляции реляционной операции DROP, например для удаления всего класса ENROLLMENT. Подробности оставляем читателю в качестве упражнения.

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]