Объектно-реляционные субд. Введение в объектно-реляционные субд



Скачать 284.92 Kb.
страница6/6
Дата07.07.2013
Размер284.92 Kb.
ТипДокументы
1   2   3   4   5   6

SELECT trigger_body


FROM user_triggers

WHERE name = 'REORDER';
TRIGGER_BODY

---------------------------------------------
DECLARE

x NUMBER;

BEGIN

SELECT COUNT(*) INTO x

FROM pending_orders

WHERE part_no = :new.part_no;

IF x = 0 THEN

INSERT INTO pending_orders

VALUES (:new.part_no, :new.reorder_quantity, sysdate);

END IF;

END;

Ограничения и триггеры.


Теперь приведу в качестве примера решение проблемы с ограничениями. Ниже процедура вставки персонала, где проверяется наличие его в таблице и правильность заполнения поля type.

CREATE OR REPLACE PROCEDURE ser_insert(

snum IN int,

fio IN varchar2,

adr IN varchar2,

tel IN varchar2,

tp IN varchar2,

res OUT number) IS

DECLARE

cnt int;

BEGIN

res:=1;

SELECT count(*) AS coun INTO cnt

FROM service ss

WHERE ss.service.fio=fio AND

ss.service.address=adr AND

ss.service.tel=tel AND

ss.service.type=pl;

IF((tp='cond' OR tp='driv') AND cnt=0) THEN

INSERT INTO carriage VALUES

(ser_id.nextval, service_type(fio, adr, tel, tp));

ELSE

res:=-1;

END IF;

END;

/

Пример вызова этой процедуры:

DECLARE p number;

BEGIN

ser_insert('Иванов','Чуйкова дом 45 кв.21', '56-78-90', ’driv’, p);

END;

/

Если такого нет, то вставится одна строка, если не правильно задан тип или уже имеется уже такой машинист, точно такими же данными, то на экране появится сообщения об успешно выполненной процедуре.

И еще один пример на создание триггера на обновление размера скидки, в этом случае должна пересчитаться цена у всех забронированных билетов (flag=2);

CREATE OR REPLACE TRIGGER price_up AFTER UPDATE on advantage

FOR EACH ROW

DACLARE

newp buying.price%type;

CURSOR b IS

SELECT *

FROM buying

WHERE adv_num=:old.
id AND flag=2


FOR UPDATE;

str b%rowtype;

BEGIN

OPEN b;

LOOP

FETCH b INTO str;

EXIT WHEN b%NOTFOUND;

newp:=str.price/(1-:old.adv.persent)-:new.adv.persent*str.price/(1-:old.adv.persent);

UPDATE buying SET price=newp WHERE CURRENT OF b;

END LOOP;

CLOSE b;

END;

.

run
UPDATE advantage aa SET aa.adv.persent=0.20 WHERE aa.adv.grup='Pensioners';

Запросы.


Ниже приведены несколько простых запросов к созданной базе данных:

//Выдать все поезда, идущие в определенную дату

SELECT data, tt.train.marshrut AS marshrut

FROM train tt, t_m

WHERE tt.id=t_m.id AND data='09/10/02';

DATA MARSHRUT


------------- ---------------------------

01.09.02 Kazan-Moscow

01.09.02 Kazan-Moscow


//Выдать все свободные места на определенный маршрут

SELECT DISTINCT(pp.place.num) AS place,

pp.place.car_num AS carge,

cc.carriage.type AS type

FROM carriage cc, place pp, buying bb, t_m

WHERE cc.carriage.tr_num=1 AND

t_m.tr_num=1 AND

t_m.data='01/09/02' AND

pp.place.car_num=cc.carriage.id AND

pp.place.id NOT IN(SELECT pl_num

FROM buying);
PLACE CARGE TYPE MARSHRUT

------------ -------------- ---------- --------------------------

1 2 plas Kazan-Moscow

1 3 comp Kazan-Moscow

2 1 comp Kazan-Moscow

2 2 plas Kazan-Moscow

2 3 comp Kazan-Moscow
//Узнать по забронированным билетам, куда едут

SELECT DISTINCT(place.num) AS place,

pp.place.car_num AS carge, kuda

FROM carriage cc, t_m, place pp, buying

WHERE cc.carriage.tr_num=t_m.tr_num AND

pp.place.car_num=cc.carriage.id AND

type=2;

OTKUDA KUDA PASSPORT


--------------- ------------------ -----------------------

Kazan Moscow X1X-KB 456890

Kazan G.Hrustalny XIX-KB 234867

Объектно-реляционный подход.


Этот подход отличается тем, что здесь не выделяется отдельное поле для ключа, поле

id int включается в описание типа. В данном подходе разработчик должен учитывать, что нет ключей и это всегда проверять, хотя сами коды программ, процедур и триггеров сильно отличаться не будут. В этом случае будет больше по количеству триггеров, поскольку нет такой возможности как on delete cascade/on update… и т.д. Я приведу лишь само создание, вставки, некоторые программы, процедуры и запросы. Хотя они очень похожи.

Создание типов:

CREATE TYPE carriage_type AS object( id INT,

tr_num INT,

made_in VARCHAR2(100),

type VARCHAR2(50));

/

CREATE TYPE car_type AS object( id INT,

made_in VARCHAR2(100),

type VARCHAR2(50));

/

CREATE TYPE car_table_type AS TABLE OF car_type;

/

CREATE TYPE station_type AS object( point VARCHAR2(100),

railst VARCHAR2(100),

time_ar DATE,

time_st VARCHAR2(20)

type VARCHAR2(50));

/

CREATE TYPE station_table_type AS TABLE OF station_type;

/

CREATE TYPE train_type AS OBJECT( id INT,

type VARCHAR2(50),

stations station_table_type,

carriages car_table_type);

/

CREATE TYPE service_type AS OBJECT( id INT,

fio VARCHAR2(200),

address VARCHAR2(200),

tel VARCHAR2(30),

type VARCHAR2(50));

/

CREATE TYPE place_type AS OBJECT( id INT,

car_num REF carriage_type

num INT);

/

CREATE TYPE adv_type AS OBJECT( group VARCHAR2(100),

persent REAL);

/
Создаем таблицы:

CREATE TABLE carriage OF carriage_type;

/

CREATE TABLE train OF train_type

NESTED TABLE stations STORE AS station_table

NESTED TABLE carriages STORE AS car_table;

/

CREATE TABLE service OF service_type;

/

CREATE TABLE place OF place_type;

/

CREATE TABLE advantage OF advantage _type;

/

CREATE TABLE t_m( id INT PRIMARY KEY,

data DATE,

tr_num REF train_type,

mar_num REF marshrut_type);
CREATE TABLE t_s( id INT PRIMARY KEYy,

data DATE,

tr_num REF train_type,

ser_num REF service_type);
CREATE TABLE c_s( id INT PRIMARY KEY,

data DATE,

car_num REF carriage_type,

ser_num REF service_type);

CREATE TABLE buying( id INT PRIMARY KEY,

data DATE,

otkuda station_type,

kuda station_type,

pl_num REF place_type,

advantage REF advantage_type,

passport VARCHAR2(30),

price REAL,

flag INT CHECK(flag=1 OR flag='null'));

Вставки по одному кортежу в каждую таблицу.

INSERT INTO carriage VALUES(carriage_type(1,1,'Kazan','comp');
INSERT INTO train VALUES (train_type(1,'pas',

station_table_type(station_type('Kazan','center',to_date(‘18.30’, ‘hh24:mi:ss’),'10 min',1),

station_type('Kanash','center',to_date(‘23.00’, ‘hh24:mi:ss’),'3 min'),

station_type('Novgorod','center',te_date(‘1.00’, ‘hh24:mi:ss’),'10 min'),

station_type('Moscow','Kazan',to_date(‘7.00’, ‘hh24:mi:ss’),'10 min',2)),

CAST(MULTISET(

SELECT cc.id, cc.made_in, cc.type

FROM carriage cc

WHERE cc.tr_num=1

)AS car_table_type)));
INSERT INTO t_m VALUES (1,to_date('01.09.02','dd.mm.yy'),

(SELECT REF(tr) FROM train tr WHERE tr.id=1));
INSERT INTO service VALUES(

service_type(1,'Stiven Karten','Dubrovka 134','23-56-89','con'));

INSERT INTO service VALUES (

service_type(2,'Julia Sokol','Dubrovka 100','74-56-89','driv'));
INSERT INTO place VALUES (

place_type(1,(SELECT REF(car) FROM carriage car WHERE car.id=1),1),

place_type(1,( SELECT REF (car) FROM carriage car WHERE car.id=1),2));
INSERT INTO advantage VALUES (advantage_type(1,'students',0.50));
INSERT INTO t_s VALUES (1,to_date('01.09.02','dd.mm.yy'),

(SELECT REF (tr) FROM train tr WHERE tr.id=1),

(SELECT REF (ser) FROM service ser WHERE ser.id=1));
INSERT INTO c_s VALUES (1,to_date('01.09.02','dd.mm.yy'),

(SELECT REF (car) FROM carriage car WHERE car.id=1),

(SELECT REF (ser) FROM service ser WHERE ser.id=2));
INSERT INTO buying VALUES (1,to_date('31.08.02','dd.mm.yy'),

station_type('Kazan','center',18.30,'10 min'),

station_type('Moscow','Kazan',7.00,'10 min'),

(SELECT REF (pl) FROM place pl WHERE pl.id=1),

(SELECT REF (aa) FROM advanture aa WHERE aa.id=1),

'X1X 67845-BK',

300,1);
Пример заполнения таблицы train из другой таблицы:

DECLARE

id_tr train2.id%type;

tp train2.typ%type;

CURSOR cur is

SELECT id, typ

FROM train2;

BEGIN

OPEN cur;

LOOP

FETCH cur INTO id_tr, tp;

EXIT WHEN cur%NOTFOUND;

INSERT INTO train VALUES (train_type(id_tr, tp,

station_table_type(station_type(0,0,0,0)),

(CAST(MULTISET(

SELECT cc.id, cc.made_in, cc.type

FROM carriage cc

WHERE cc.tr_num=id_tr

)AS car_table_type))));

END LOOP;

CLOSE cur;

END;

.

RUN;
CREATE OR REPLACE PROCEDURE insert_stations(

id_tr IN int,

point IN varchar2,

railst IN varchar2,

time_ar IN float,

time_st IN varchar2,

type IN varchar2

) AS

BEGIN

INSERT INTO THE(SELECT stations FROM train WHERE id=id_tr)

VALUES (train_type(station_type(point,railst,time_ar,time_st,type)));

END;

.

RUN;
Запросы, что и в предыдущей части, для этого варианта результаты получаются аналогичные:

//Выдать все поезда, идущие в определенную дату

SELECT data, tt.marshrut AS marshrut

FROM train tt, t_m

WHERE tt.id=t_m.id AND data='09/10/02';

//Выдать все свободные места на определенный маршрут

SELECT distinct(pp. num) AS place,

pp. car_num AS carge,

cc. type AS type

FROM carriage cc, place pp, buying bb, t_m

WHERE cc. tr_num=1 AND

t_m.tr_num=1 AND

t_m.data='01/09/02' AND

pp.car_num=cc.id AND

pp.id NOT IN(SELECT pl_num

FROM buying);
//Узнать по забронированным билетам, куда едут

SELECT DISTINCT(pp.num) AS place,

pp.car_num AS carge, kuda

FROM carriage cc, t_m, place pp, buying

WHERE cc.tr_num=t_m.tr_num AND

pp.car_num=cc.id AND

type=2;




1   2   3   4   5   6

Похожие:

Объектно-реляционные субд. Введение в объектно-реляционные субд iconПодсистема управления схемами баз данных в объектно-ориентированной субд
Для этого целесообразно использовать объектно-ориентированную субд. Одной из ключевых подсистем такой субд является подсистема управления...
Объектно-реляционные субд. Введение в объектно-реляционные субд iconРеляционные субд
...
Объектно-реляционные субд. Введение в объектно-реляционные субд iconБазы данных Лектор 2010/11 уч года: д ф. м наук, профессор Кумсков М. И
В курсе обсуждаются общие вопросы систем управления базами данных (субд) и основы реляционных баз данных: введение в реляционные...
Объектно-реляционные субд. Введение в объектно-реляционные субд iconЛекция Тема: Внутренняя организация реляционных субд cтруктуры внешней памяти, методы организации индексов
Реляционные субд обладают рядом особенностей, влияющих на организацию внешней памяти. К наиболее важным особенностям можно отнести...
Объектно-реляционные субд. Введение в объектно-реляционные субд iconОбъектно-ориентированные системы
Объектно-ориентированные субд использует класс как фундаментальную абстракцию и рассматривает отношение как один из многих типов
Объектно-реляционные субд. Введение в объектно-реляционные субд iconКраткое содержание курса Теория баз данных Модели данных и языки запросов Транзакции и согласованность
Субд в прикладных системах. Основные функции субд. Взаимодействие субд с другими компонентами программного обеспечения. История развития...
Объектно-реляционные субд. Введение в объектно-реляционные субд iconУдаление субд «Yaffil» Перед установкой субд
Обращаем ваше внимание на то, что субд следует заменить на всех рабочих местах
Объектно-реляционные субд. Введение в объектно-реляционные субд iconСписок использованных источников
Аткинсон М. и др. Манифест систем объектно-ориентированных баз данных/ Аткинсон М., Бансилон Ф., ДеВитт Д., Дитрих К., Майер Д.,...
Объектно-реляционные субд. Введение в объектно-реляционные субд iconПеренос схемы базы данных и данных из субд oracle в субд ibm db2
В докладе рассматривается переход с субд oracle на субд ibm db2 в рамках разработки модуля администрирования для SmartVista Front...
Объектно-реляционные субд. Введение в объектно-реляционные субд iconPreparedStatement vs. Statement 8 CallableStatement 8 Вопросы, которые не обсуждены 9
Субд. В реальности оказывается, что некоторые объектные субд и иногда даже совсем не субд предоставляют jdbc интерфейс для работы...
Разместите кнопку на своём сайте:
ru.convdocs.org


База данных защищена авторским правом ©ru.convdocs.org 2016
обратиться к администрации
ru.convdocs.org