ПБД (9) - Лекция №8 - OQL: различия между версиями

Материал из Кафедра ИУ5 МГТУ им. Н.Э.Баумана, студенческое сообщество
Перейти к навигации Перейти к поиску
мНет описания правки
мНет описания правки
Строка 225: Строка 225:
[[Категория:Постреляционные базы данных (9 семестр)]]
[[Категория:Постреляционные базы данных (9 семестр)]]
[[Категория:Конспекты лекций и семинаров]]
[[Категория:Конспекты лекций и семинаров]]
[[Категория:Незаконченные конспекты]]

Версия от 10:34, 21 апреля 2013

Этот конспект ещё не дописан.
Здесь не хватает:
   - примеров запросов на языке OQL.


SQL

Пользовательские типы данных

User Defined Types - UDT.

Создаём свой тип:

CREATE TYPE Addr as
(
    city char(20),
    street varchar(100)
)
-- объявление метода
method fullad() returns varchar(130);

-- определение метода
CREATE method fullad() returns varchar(130)
for Addr
begin
    return self.city || self.street
end;

Используем его при описании других:

CREATE TYPE Studia as
(
    sname varchar(50),
    addr Addr
);

CREATE TYPE Actor as
(
    inn int,
    fio varchar(50),
    addr Addr
);

Создаём таблицы со ссылками:

CREATE TABLE Tact of Actor
(
    primary key (inn),
    ref is Ida system generated
);

CREATE TABLE TSt
(
    ref is Ids system generated
)

Создаём тип со ссылками:

CREATE TYPE Film as
(
    title varchar(80),
    year unt,
    len int,
    type char(2),
    st REF(Studia) [SCOPE TSt] -- SCOPE показывает, что это на конкретную талицу
);

Ещё таблицы:

CREATE TABLE FA
(
    act REF(Actor) SCOPE TAct,
    film REF(Film) SCOPE TF
);

CREATE TABLE TF of Film
(
    ref is Idf system generated
);

Запросы к UDT

-- один ко многим
SELECT year, len st->sname, st->addr.city, st->addr.fullad()
FROM TF
WHERE title = 'The Matrix'

-- многие ко многим (обращение к одной таблице, которая её реализует)
SELECT film->title, film->year, film->st->name
FROM FA
WHERE act->fio='Иванов'

-- разыменование ссылок
SELECT deref(act)
FROM FA
WHERE film->title='The Matrix' -- выведет всех актёров этого фильма

Методы

Создаются системой автоматически.

Методы обозреватели

Они же getter. Совпадают с названием поля, не имеют параметров. Нужны для получения значений полей.

SELECT f.title(), f.len()
FROM TF
WHERE f.type='BW'
Методы модификаторы

Они же setter. Для изменения значения полей.

Методы генераторы

Они же конструкторы.

DECLARE newA Addr;
DECLARE newS Stud;

set newA = Addr();   -- вызов конструктора
newA.city('Москва');
newA.street('Ленина, 2');

set newS = Studia(); -- вызов конструктора
newS.sname('Мосфильм');
news.addr(newA);

INSERT INTO TSt VALUES(newS);

Сравнение типов

CREATE ORDERING for Addr
<EQUALS ONLY | ORDER FULL | RELATIVE WITH f> BY STATE
-- f - это функция, выполняющая сравнение двух параметров
-- она не стандартная, её надо создать
CREATE FUNCTION f(x1 Addr, x2 Addr) returns int
    IF x1.city > x2.city TNEN return 1;
    ELSE IF x1.city < x2.city TNEN return -1;
    ELSE IF x1.street > x2.street TNEN return 1;
    ELSE IF x1.street < x2.street TNEN return -1;
    ELSE return 0;
    END IF;

Производные типы

CREATE TYPE имя UNDER базовый тип as
(
    поле тип,
    ...
    [[not] instantiable] -- можно ли на его основе создать ещё тип
    [not] final          -- можно ли его переопределять
    <ref is system generated | ref using тип | ref using (атрибут)>
);

[overriding]
[<instance | static | constructor>]
method название(параметры) returns тип
[self as <result | locator>]
[parameter style <SQL | Java | ...>]
[[not] deteministic]
[no SQL | contains SQL | ...]
[return <NULL on NULL input | called on NULL input>]

OQL

Object Query Language.

class Film(extent EF)
{
    attribute string title;
    attribute string year;
    attribute string len;
    attribute string type;
    
    relationship Stud st inverse Stud::fl;
    relationship set <Actor> acts inverse Actor::films;
    
    set <Stud> StofFl();
    
    -- метод
    int firstFilm();
}

class Actor(extent EA)
{
    attribute string fio;
    attribute int inn;
    
    relationship set <Film> films inverse ... ;
    
    -- атрибут-структура
    attribute Struct{string city, string street} addr;
}

Запросы на OQL

SELECT f.title
FROM EF f, f.acts a
WHERE a.fio="Иванов" AND f.year < 1950

SELECT a.fio, a.addr
FROM EA a
WHERE for all f in a.films : f.st.sname="Мосфильм"

и другие. Много.