ПБД (9) - Лекция №8 - OQL: различия между версиями
Перейти к навигации
Перейти к поиску
ILobster (обсуждение | вклад) мНет описания правки |
Bit (обсуждение | вклад) мНет описания правки |
||
Строка 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="Мосфильм"
и другие. Много.