Программирование >>  Реляционные базы данных 

1 ... 115 116 117 [ 118 ] 119 120 121 ... 125


порождает множество ф1ыьмов, снятых до 1920 г Его типом является Set<Movie>. Еслн oldMovies - переменная главного языка такого же типа, можно записать (в С++, раеш1изен ном за счет OQL):

OldMovies = SELECT DIST NCT m FROM Movies m WHERE m year < 1920;

и значением oldMovies станет множество этих объектов класса Movie. □

8.4-2 Извлечение элементов из множества

Поскольку выражения типа seiect-Ггот-where и group-bj порождают множества илн мультимножества, для получения единственного элемента нужны дополт1 ель-ные срсдстиа. Это верно, даже когда точно известно, что мгюжество cocrotr из единственного элемента. Оператор ELEMENT в OQL преврашет одноэлементное множество НЛП мультимножество в единственный его член. Этот оператор можно применить, например, к результату запроса, которьи1 заведомо возвращает одноэлементное мультпм ножество.

Пример 8.17. Допустим, переменной gwtw типа Movie (т.е. ее типом является класс Movie) нужно присвоить объект, представляюший фильм Gone With the Wind . Результатом stmpocj

SELECT m FROM Movies m

WHERE nn.litle = Gone With the Wind

является мультимножество, содержащее один этот объект. Невозможно прямо присвоить это мультимножество переменной gwtw, так как это разные типы. Но если сначала применить оператор ELEMENT:

gwtw = ELEMENT(SELECT m

FROM Movies m

WHERE m.title =Gone With the Wind

т1[пы переменной и выражения будут соответствовать друг другу и приписывание будет допустимо □

8.4.3 Получение каждого члена множества

Получить каждый член множества или мультимножества доста очно сложно, но все же проще, чем применять основанные на курсорах алгоритмы SQL. Сначала НУЖНО превратить м1Южество или мультимножество в список с помощью выражения типа select-from where с оператором ORDER BY Результатом такого выражения будет список выбранных объектов пли значений.

Пример 8.18. Предположим, нужно по.пучить список всех объектов класса Movie Для этого можно исиользовать название и гол выпуска фильма, ibk как (title, year) является ключо.м для Movie. Выражение

movleList SELECT m

FROM Movies m

ORDER BY m.title, m year.

приписывает переменной главного языка movieUst список всех объектов кчасса Movie, упорядоченных по назгзанию и году П



Каждый элечсепт упорядоченного или неупорядоченного списка, можно получить по но.меру: /-Й элемент списка L получается как выражение L.\i- \\. Предполагается, что списки и наборы всегда нумеруются, начиная с О, как в С пли в С++.

Пример 8,19. Допусти.м, нужно написать функцию С++, печазаюшую название, гоа выпуска и прололжтельиосгь каждого фильма. Краткая запись этой функции дани на рис. ЬМО.

1) movieLlst = SELECT m

FROM Movies m

ORDER BY m.title. m.year;

2) numberOfMovies = COUNT(Movies):

3) for(i=0; i<numberOfMovies; i++) {

4) movie = movieList[i];

5) count movie.title movte.year

6) movie.length \n : . 7) )

рис. 8.10. npoeepKo и вывод но печоть каждого фильма

Строка (I) сортирует класс Movie, помещая результат сортировки в переменную movieList с типом List<Movie>. Строка (2) вычисляет количество фильмов с помощью оператора OQL COUIMT. Строки (3) - (7) - это цикл, в котором числовая переменная / пробегает по всем позициям списка. Для удобства /-й ългыьт списка приписывается неременной movie. На строках (5) и (6) печатаются соответствующие атрибуты фильма. □

8.4.4 Создание новых объектов

Выражения OQL типа select-fiom-wliere позволяют создавать новые объекты путем вычислений на множестве существующих объектов. Можно создавать объекты и объединением констант или других выражений в структуры и применением конструкторов типов к значениям. Вместо угловых скобок, применяемых при описании типов, прн конструировании значений используются круглые скобки. Соглашение проиллюстрировано в примере 8.7, где строка

SELECT DISTINCT Struct(star1: si. star2- s2)

означает, что результатом запроса является множество объектов, с типом Slruct{star1: Star, star2: Star}. Имена полей starl и star2 определяют структуру, а типы этих палей можно вывести из типов переменных si и s2.

Пример 8.20. Множества можно создать, применяя любой нз конструкторов (Ser, Bag, L st или Array) к объектам одного типа. Рассмотрим последовательность присвоений

x = Struct(a-1. b:2).

у = Bag(x. X, Slruct{a : 3, b : 4)):

Первое из ни\ присваивает переменной ж значение типа

Stmct(a : Integer, b integer)

т.е. структуру с двумя численнозначными полями а и Ь. Значения такого типа можно считать не именами полей а и Ь, а кортежами, компонентами которых являются натуральные числа. Поэтому значение х можно представить как (1,2). Второе определяет у как мультимножество, членами которого яапяются структуры того же типа, что и .\. Пара (1,2) входит в эю мультимножество два раза, а пара (3,4) - один риз. □



Если задан тип и запрос порождает множество объектов этого типа, вместо явного выражения данного типа можно использовать его имя. Пример 8.7 показал создание явным образом множества пар кинозвезд. За ключевым словом SELECT указьикиюсь выражение, и котором конструктор типов Struct применялся для построения объектов, содержащих два поля, значениями которых были объекты, представляющие кинозвезд.

Предположим, тип StarPair определеи как

Struct{star1: Star. star2: Star}

Тогда можно переписать запрос нз примера 8.7, используя этот тип в пункте SELECT:

SELECT DISTINCT StarPair(Etar1: s1, star2: s2) FROM Stars si. Stars s2

WHERE sl.addr-s2.addr AND s1 name < s2.name

Единственное изменение старого запроса состоит в том, что результат его истюго варианта имеет тип Set<StarPair> и ,\южет быть приписан переменное главного языка, илгеющей этот же тип.

Применение имени инш к аргументам особенно полезно, когда именем типа являе1х;я класс. Классы обычно имеют .множество различных форм функций-конструкторов, зависящих от того, какое свойство инициируется явным образом, а какое имеет значен le по умолчанию. Например, методы наверняка не инициируются, большинство атрибутов получает исходные значения, а связи люг! быть сначала заданы в виде пустого множества и добавлены позже. Имя каждой такой функинн-конст1уктора - это имя класса, и различаются они по именам полей, упомянутых в их яргумента.х. Детипи определения таких функций зависят от главного языка.

Пример 8.21. Рассмотрим одну из возможных функинй-конструкторов для объектов класса Movie. Из значений атрибутов title, year, length и ownedBy она порояшает объект, имеющий эти значения в перечисленных полях и пустое множество кинозвезд. Если mgm - переменная, значением которой является объект МСМ Studio, хюжио создать объект Gone With the Wind с помошью выражения:

gwtw = Movie(tltle: Gone With the Wind , yesr: 1939, length: 239 ownedBy: mgm);

Этот оператор дает два результата.

I. Создается новый объект класса Movie, который стгшовнтся частью степени Movies.

Этот объект становится значением переменной главного языка gvjt/j. О

8.4-5 Упражнения к разделу 8.4

Упражнение 8.4.1. Присвойте переменной главного мзьиса х консг<1Нты; а) Множество {I. 2, 3J.

b) Мультимножество {I, 2, 3, 1.

c) Список (I. 2. 3, li.



1 ... 115 116 117 [ 118 ] 119 120 121 ... 125

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика