|
Программирование >> Реляционные базы данных
8.2.1 Объектно-ориентированный пример Для иллюс раиии выражений OQL в качестве примера возьмем знакомые luiaccbi Movie. Star и Studio н используем определение Movie из рис. 8.1. Определення Star и Studio, введенные иа рис. 2.6, дополняются ютючом и описанием степени, но в них не вводятся методы (см. рис. 8.4). interface Star (extent Stars ley name) attribute string name; attribute Struct Addr {string street, string city) address; relationship Set<Movie=> starredin inverse Movie;:stars; interface Studio (extent Studios key name) attribute string name; attribute string address; relationship Set<Movie> owns inverse Movie::ownedBy; Рис. 8.4. Чостъ объвнтио-ориентировоиной БД фильмов 8.2.2 Система типов OQL Типы в OQL строятся во многом так же, как и в описаниях ODL (см. радоел 2.1.7). Однако в OQL сушествует предел вложения конструкторов типов. Рассматривая систему типов языка профаммирования, нужно различать описание типа переменной (иногда называемая изменчивым обьектом) и выражение постоянного значения (иногда называемого неизменным объектом). Переменные, используемые в операторах OQL, описываются в окружающем главном языке с помощью нотации ODL (раздел 2,1.7) или чего-то подобного. Как язык определения данных ODL не нуясдается в константах, но в программах OQL они нужны. Поэтому необходимо знать, как в OQL создаются константы произвольного типа Они строятся на описанном да.пее базисе с помошью конструкторов типов. 1. Базовые типы (a) Натуральные числа, числа с плавающей точкой, символы, строки н булеаны. Все онн представляются так же, как в SQL, только строки заключаются и двойные кавычки. (b) Перечисления. Значения в перечислениях реально описываются с ODL Любое нз этих значений можно использовать в качестве константы 2. Сложные типы строятся нз следующих конструкторов типов (a) Set(...) (b) Вад(..) (c) List(..) (d) Array(...) (e) Stnjct(..) i Стрелки вместо точек j в OQL стрелка -> - синоним точки. Это соглашение частично соответст- } вует духу языка С, в котором точка и стрелка применяются для получения \ компонентов структуры. Однако в языке С стрелка и точка имеют разные зна- I чения, а в OQL - одно и то же. В С предполагается, что в выражении a.f бук- \ ва а обозначает структуру, а в выражении р -> f буква р обозначает указатель на структуру. Оба выражения порождают значение поля f этой структуры. Пример 8.4. Пусть nryMovie - переменная главного языка, значением которой яатяется объект класса Movie. Значением myMovie.length является продолжительность фильма, т.е. значение атрибчта length для объекта Movie, обозначенного как myMovie. Значением myMovie lengtlilnHours() является действительное число, т.е. Продолжительность фильма в часах, вычисленная путем применения метода lengtmnHours к объект) myMovie. Значение myMovie.stars ~ это множество объектов класса Star, соединенных с фильмом myMovie связью stars. Выражение myMovie.starNames(myStars) не возвращает никакого значения (г.е. в С++ типом этого выражения является void). Однако в качестве побочного эффекта оно делает множество строк значением выходной переменной myStars метола startJames; эти строки обозначают имена кинозвезд, играющих в фильме. П Первые четыре называются типами множества. Ич и Struct можно применять к любым значениям подходящих базовых или сложных типов. Используя Struct надо определить полей и соответствующие им значения. За каждым именем поля следует двоеточие и значение, а пары значений полей разделяются запяты.чт. Пример 8.3. Выражение bag(2.1,2) обозначает мультимножество, в которое mkcjIo 2 входит дважды, а чиспо I - одни раз. Выражение strucl(foo: bag(2, i, 2), bar; baz ) обозначает структуру с двумя полями. Одно поле с именем foo в качестве своего значения имеет упомянутое выще мультимножесгво, а значением второго поля baz является строка baz. □ 8.2.3 Выражения с путем доступа Для доступа к компонентам переменных со сложным типом используется точечная нотация, аналогичная точкам, применяемым в языке С, и связанная с точками в SQL. Общее правило выглядит следующим образом. Если а обозначает объект, принадлежащий классу С, а р - некоторое свойство класса (атрибут, связь или метод), то а.р обозначает резульзж применения /> к о. L Если р - атрибут, то а.р - значение этого атрибута в объекте а. 2. Если р - свизь, то о.р - объект или множество объектов, соединенных с а связью р. 3. Если р - метод (возможно, с параметрами), то а.р - результат применения р к £7. Выражение можно формулировать с множеством точек, если это имеет смысл. Например, если myWlovle обозначает объект Movie, то myMovie.ownedBy обозначает объект Studio, который влшеет фильмом, а myMovie.ow/nedBy.name обозначает строку, выражающую имя этой студии. 8.2.4 Выражения типа select-from-where в OQL OQL позволяет записывать выражения с помошью синтаксиса select-fiom-wlicre, -ан;1логичного известно!! форме запроса SQL. Приведем пример запроса о годе выпуска фильма Сапе Wiih the Wind : SELECT m.year FROM Movies m WHERE m.title = Gone With the Wind Если исключить двойные кавычки, в которые заключена строка-константа, то этот запрос будет запросом SQL, а не OQL Единсгвенным несоответствием является то, что пункт FROM запроса SQL обычно записывается как FROM Movies AS m Однако в OQL ключевое слово AS применяется по выбору, как и в SQL. Оказь па-ется. что в OQL вполне разумно пропускать это слово, так как выражение Movies m означает, что m - переменная, указывающая на каждый объект из степени Movies, т.е. из текущего множества объектов класса Movie. В общем случае в выражение OQL типа seleci-from-where входят следующие элементы: 1. Ключевое слово SELECT, за которым следует список выражений. 2. Ютючевое сл01Ю FROM, за которым следует список описаний переменных. Переменная описывается с помощью (a) выражения, значение которого имеет тип множества, например множества luiH мультимножества; (b) применяемого по выбору ключевого слова AS; (c) имени переменной. Обычно выражением в пункте (а) является экстент некоторого класса, скажем Movies для класса Movie. Экстент - аналог отношения в пункте FROM запроса SQL. Но в описании переменной применимо любое выражение, порождающее множество, например другое выражение типа select-from-where. В SQL2 нет прямого аналога такой возможности, хотя некоторые коммерческие системы SQL допускают подзапросы в пунктах FROM. 3. Ключевое слово WHERE и булевозначное выражение. В нем как и в выражении, следующем за SELECT, в качестве операндов используются только константы и переменные, указанные в пункте FROM. Операторы сравнения тс, что и в SQL. [10 для выражения применяется символ ! =, а не <>. Логические операторы AND, OR и NOT имеют такой же смысл, как и в SQL. Запрос порождает мульти1\1ножество объектов. Оно вычисляется путем рассмотрения возможных значений переменных в предложении FROM во вложенных циклах. Если любая комбинация значений этих переменных удовлетворяет условию предложения WHERE, то объект, описанный предложением SELECT, добавляется к мультимножеству, яатяюшсмуся результатом оператора типа seleci-from-wiiere. Пример 8.5. Запишем более сложньп1 запрос OQL. иллюстрирующий стлктуру sclecc-from-wherc: SELECT s.name FROM Movies m, m.stars s WHERE m.title = Casablanca
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |