Три манифеста баз данных ретроспектива и перспективы

       

Входные данные и результаты запросов


Как утверждается в стандарте ODMG 3.0, “OQL -запрос является функцией, вырабатывающей объект, тип которого может быть выведен на основе операций, которые участвуют в выражении запроса”.

34

Вот несколько примеров простых OQL -запросов (мы будем использовать в этих примерах определенные в предыдущем подразделе классы DEPT и EMP в предположении, что DEPARTMENTS и EMPLOYEES являются именами экстентов этих классов).

Пример 2.1. Найти даты рождения служащих, зарплата которых превышает 20000 руб.

SELECT DISTINCT E.EMP_BDATE

  

FROM EMPLOYEES E

  

WHERE E.EMP_SAL > 20000.00

Легко видеть, что этот запрос по своему виду ничем не отличается от соответствующего запроса к таблице EMP , выраженного на языке SQL . В данном случае результатом запроса будет литеральное значение типа set < date > , т.е. литеральное значение-множество, элементами которого являются значения типа date.

Пример 2.2. Найти имена и даты рождения служащих, зарплата которых превышает 20000 руб.

SELECT DISTINCT STRUCT (name: E.EMP_NAME, bdate: E.EMP_BDATE)

  

FROM EMPLOYEES E

 

WHERE E.EMP_SAL > 20000.00

Запрос снова очень похож на соответствующий запрос на языке SQL, а результатом запроса является литеральное значение-множество, элементами которого являются значения типа struct { string <20> name ; date bdate }. Наверное, для конечного пользователя языка OQL строгий вывод типа результата запроса может показаться избыточным, но для программистов приложений это свойство является очень важным.



Если предположить, что в классе EMP определена операция age , значением которой является возраст соответствующего служащего, то результатом запроса

SELECT DISTINCT STRUCT (name: E.EMP_NAME, age: E.age)

    

FROM EMPLOYEES E

    

WHERE E.EMP_SAL > 20000.00

будет литеральное значение-множество, элементами которого являются значения типа struct { string <20> name ; interval age } (пример 2.2a ).

Пример 2.3. Получить номера менеджеров отделов и тех сотрудников их отделов, зарплата которых превышает 20000 руб.


SELECT DISTINCT STRUCT ( mng: D.DEPT_MNG,

                        DHS: ( SELECT E

  FROM D.CONSISTS_OF AS E

WHERE E.EMP_SAL > 20000.00 ) )

FROM DEPARTMENTS D

Внешне этот запрос снова похож на SQL -запрос со вложенным подзапросом, но это только внешнее сходство. Во-первых, в разделе FROM “подзапроса” мы имеем дело с переходом по связи CONSISTS _ OF от экземпляра объектного типа DEPT ко множеству экземпляров объектного типа EMP . Во-вторых, результатом запроса является литеральное значение-множество, элементами которого являются значения-структуры с двумя литеральными значениями, первое из которых есть атомарное литеральное значение типа INTEGER , а второе – литеральное значение-множество с элементами-объектами типа EMP. Более точно, результат запроса имеет тип set < struct { integer mng ; bag < EMP > DHS } >. Конечно, в “классическом” SQL такого быть не может, хотя в следующем разделе мы обсудим возможности объектно-реляционных расширений этого языка.

В OQL предполагается, что хранимые в базе данных объекты могут иметь индивидуальные имена. 35

Пример 2.4. Если, например, в базе данных сохраняется объект типа DEPT с именем main _ department, то результатом запроса

main _ department

будет являться соответствующий объект. Результатом запроса

main_department.CONSISTS_OF

будет литеральное значение-множество, состоящее из объектов типа EMP , ассоциированных через связь CONSISTS _ OF с объектом main _ department

36.

Наконец, в контексте OQL имя каждого экстента можно трактовать как имя объекта-множества. Поэтому результатом запроса

EMPLOYEES

будет литеральное множество, состоящее из всех объектов, которые содержаться в указанном экстенте.


Содержание раздела