Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kursovaya_BD_14.docx
Скачиваний:
4
Добавлен:
15.11.2019
Размер:
581.01 Кб
Скачать

Листинг

Создание таблиц

CREATE TABLE DOCTOR

(

DoctorID int NOT NULL,

Name varchar(30) NOT NULL,

Dolzhnost varchar(15) NOT NULL

);

ALTER TABLE DOCTOR

ADD CONSTRAINT DoctorPK PRIMARY KEY (DoctorID);

CREATE TABLE CLIENT

(

ClientID int NOT NULL,

Name varchar(30) NOT NULL,

Adress varchar(15) NULL,

Phone varchar(15) NULL,

DoctorID int NULL

);

ALTER TABLE CLIENT

ADD CONSTRAINT ClientPK PRIMARY KEY (ClientID);

ALTER TABLE CLIENT

ADD CONSTRAINT ClientDoctorFK

FOREIGN KEY (DoctorID)

REFERENCES DOCTOR (DoctorID)

ON DELETE SET NULL;

CREATE TABLE ILLNESS

(

IllnessID int NOT NULL,

Name varchar(30) NOT NULL

);

ALTER TABLE ILLNESS

ADD CONSTRAINT IllnessPK PRIMARY KEY (IllnessID);

CREATE TABLE TALON

(

TalonID int NOT NULL,

ClientID int NOT NULL,

DoctorID int NOT NULL,

IllnessID int NOT NULL,

DateP date NOT NULL,

Recovery int NULL

);

ALTER TABLE TALON

ADD CONSTRAINT TalonPK PRIMARY KEY (TalonID);

ALTER TABLE TALON

ADD CONSTRAINT TalonClientFK

FOREIGN KEY (ClientID)

REFERENCES CLIENT (ClientID);

ALTER TABLE TALON

ADD CONSTRAINT TalonDoctorFK

FOREIGN KEY (DoctorID)

REFERENCES DOCTOR (DoctorID);

ALTER TABLE TALON

ADD CONSTRAINT TalonIllnessFK

FOREIGN KEY (IllnessID)

REFERENCES ILLNESS (IllnessID);

Заполнение таблиц данными1

Create Sequence STalonID Increment by 1 start with 100;

Create Sequence SIllnessID Increment by 1 start with 1;

INSERT INTO DOCTOR VALUES

(1, 'Semenov Victor Victorovich', 'terapevt');

INSERT INTO DOCTOR VALUES

(2, 'Kirova Irina Vladimirovna', 'terapevt');

INSERT INTO DOCTOR VALUES

(3, 'Popova Olga Alekseevna', 'terapevt');

INSERT INTO DOCTOR VALUES

(4, 'Motveev Denis Alekseevich', 'terapevt');

INSERT INTO DOCTOR VALUES

(5, 'Bolkina Anna Dmitrievna', 'terapevt');

INSERT INTO DOCTOR VALUES

(6, 'Ivanova Olga Victorovna', 'stomatolog');

INSERT INTO DOCTOR VALUES

(7, 'Uhov Oleg Dmitrievich', 'hirurg');

INSERT INTO CLIENT VALUES

(1, 'Ivanov Ivan Ivanovich', 'Karla Marksa 25', '54796', 2);

INSERT INTO CLIENT VALUES

(2, 'Petrov Petr Petrovich', 'Karla Marksa 68', '75634891255', 1);

INSERT INTO CLIENT VALUES

(3, 'Polevoy Mihail Olegovichh', 'Goncharova 5-37', '79548631455', 2);

INSERT INTO CLIENT VALUES

(4, 'Ulyanova Olga Victorovna', 'Pushkareva 2-64', '448713', 3);

INSERT INTO CLIENT VALUES

(5, 'Sarnov Kirill Borisovich', 'Kirova 38-188', '78964165523', 1);

INSERT INTO CLIENT VALUES

(6, 'Bubnov Aleksey Petrovich', 'Radisheva 26-18', '478852', 2);

INSERT INTO CLIENT VALUES

(7, 'Polovova Daria Evgenevna', 'Ryabikav 42-32', '54796', 3);

INSERT INTO CLIENT VALUES

(8, 'Popov Aleksandr Ivanovich', 'Tolbuhina 28', '78123694521', 4);

INSERT INTO CLIENT VALUES

(10, 'Gluhov Dmitrii Anatolevich', 'Minaeva 25-19', '78354589963', 5);

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'ORVI');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Gripp');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Angina');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Astma');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Otravlenie');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Pnevmoniya');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Psihoz');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Volchanka');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Kor');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Zheltuha');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Nevrit');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Katarakta');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Gepatit');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Gribok');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Meningit');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Stolbnyak');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Ospa');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Otit');

INSERT INTO ILLNESS VALUES

(SIllnessID.NextVal, 'Chesotka');

INSERT INTO TALON VALUES

(STalonID.NextVal, 10, 5, 5, TO_DATE('12/02/2012','DD/MM/YYYY'), 0);

INSERT INTO TALON VALUES

(STalonID.NextVal, 10, 5, 5, TO_DATE('24/02/2012','DD/MM/YYYY'), 1);

INSERT INTO TALON VALUES

(STalonID.NextVal, 1, 3, 13, TO_DATE('01/03/2012','DD/MM/YYYY'), 0);

INSERT INTO TALON VALUES

(STalonID.NextVal, 6, 2, 9, TO_DATE('12/03/2012','DD/MM/YYYY'), 0);

INSERT INTO TALON VALUES

(STalonID.NextVal, 2, 7, 18, TO_DATE('12/01/2012','DD/MM/YYYY'), 0);

INSERT INTO TALON VALUES

(STalonID.NextVal, 2, 7, 18, TO_DATE('16/01/2012','DD/MM/YYYY'), 1);

INSERT INTO TALON VALUES

(STalonID.NextVal, 7, 4, 5, TO_DATE('09/03/2012','DD/MM/YYYY'), 0);

INSERT INTO TALON VALUES

(STalonID.NextVal, 4, 1, 11, TO_DATE('20/03/2012','DD/MM/YYYY'), 0);

INSERT INTO TALON VALUES

(STalonID.NextVal, 3, 2, 5, TO_DATE('19/03/2012','DD/MM/YYYY'), 0);

Выполнение запросов к таблицам (файл 3.sql)

SELECT *

FROM CLIENT

WHERE DoctorID=5;

SELECT DoctorID, DateP

FROM TALON

WHERE Recovery=1;

SELECT *

FROM CLIENT

ORDER BY Name ASC;

SELECT DoctorID, COUNT(*)

FROM TALON

GROUP BY DoctorID;

SELECT Name, DateP

FROM CLIENT, TALON

WHERE CLIENT.ClientID = TALON.ClientID;

SELECT DateP, Name

FROM DOCTOR JOIN TALON

ON DOCTOR.DoctorID = TALON.DoctorID

AND Talon.DateP>'01/03/2012'

AND TALON.DateP<'01/04/2012';

SELECT Name, COUNT(*) FROM

(

SELECT DateP, Name

FROM DOCTOR JOIN TALON

ON DOCTOR.DoctorID = TALON.DoctorID

AND Talon.DateP>'01/03/2012'

AND TALON.DateP<'01/04/2012'

)

GROUP BY Name;

Создание курсоров

SET SERVEROUTPUT ON

DECLARE

CURSOR get_client IS

SELECT * FROM CLIENT;

cl_gt get_client%ROWTYPE;

BEGIN

DBMS_OUTPUT.enable;

OPEN get_client;

LOOP

DBMS_OUTPUT.put_line('Vyvod: '||cl_gt.Name||' '||cl_gt.Adress);

FETCH get_client INTO cl_gt;

EXIT WHEN get_client%NOTFOUND;

END LOOP;

CLOSE get_client;

END;

/

SET SERVEROUTPUT ON

DECLARE

CURSOR get_client2(idcl CLIENT.DoctorID%type) IS

SELECT * FROM CLIENT

WHERE DoctorID=idcl;

cl_gt get_client2%ROWTYPE;

BEGIN

DBMS_OUTPUT.enable;

OPEN get_client2(2);

LOOP

DBMS_OUTPUT.put_line('Vyvod: '||cl_gt.Name||' '||cl_gt.Adress);

FETCH get_client2 INTO cl_gt;

EXIT WHEN get_client2%NOTFOUND;

END LOOP;

CLOSE get_client2;

END;

/

SET SERVEROUTPUT ON

DECLARE

CURSOR get_client3(idclient CLIENT.DoctorID%type) IS

SELECT * FROM CLIENT

WHERE DoctorID = idclient

for update of CLIENT.Phone;

begin

FOR get_Phone IN get_client3(2) LOOP

UPDATE CLIENT

SET CLIENT.DoctorID = 1

WHERE CURRENT OF get_client3;

END LOOP;

COMMIT;

END;

/

Создание хранимых процедур и функций

create or replace procedure proc1(date_1 in date, date_2 in date, id in number)

is

rowcount integer;

name_doc varchar(30);

begin

select COUNT(id) into rowcount from TALON

where TALON.DoctorID = id AND TALON.DateP > date_1 AND TALON.DateP < date_2;

select Name into name_doc from DOCTOR

where DoctorID = id;

if rowcount > 0 then

DBMS_OUTPUT.enable;

DBMS_OUTPUT.PUT_LINE('Kolichestvo talonov u vracha '||name_doc||' v priod s '||date_1||' po '||date_2||' : '||rowcount);

end if;

end;

/

create or replace function kol_client (date_1 in date, date_2 in date, id in number)

return number

is

kolvo number;

BEGIN

select COUNT(*) into kolvo from TALON

where TALON.DoctorID = id AND TALON.DateP > date_1 AND TALON.DateP < date_2;

return kolvo;

END kol_client;

/

create or replace function procentVyz (date_1 in date, date_2 in date, id in number)

return number

is

kolvoALL number;

kolvoREC number;

kolvo number(10,2);

BEGIN

select COUNT(*) into kolvoALL from TALON

where TALON.DoctorID = id AND TALON.DateP > date_1 AND TALON.DateP < date_2;

select COUNT(*) into kolvoREC from TALON

where TALON.DoctorID = id AND TALON.DateP > date_1 AND TALON.DateP < date_2 AND TALON.Recovery = 1;

kolvo := kolvoREC/kolvoALL*100;

return kolvo;

END procentVyz;

/

create or replace function retdocname (id in number)

return varchar

is

docname varchar(50);

BEGIN

select Name into docname from DOCTOR

where DOCTOR.DoctorID = id;

return docname;

END retdocname;

/

Запуск хранимых процедур и функций

set serveroutput on

begin

proc1('01/01/2012','15/01/2012', 7);

end;

/

set serveroutput on

declare

id NUMBER := 5;

date_1 date := '01/01/2012';

date_2 date := '15/02/2012';

docname varchar(50);

ret1 NUMBER;

ret2 NUMBER;

begin

ret1 := procentVyz(date_1, date_2, id);

ret2 := kol_client(date_1, date_2, id);

docname := retdocname(id);

dbms_output.enable;

dbms_output.put_line('kolichestvo pacientov: ' || to_char(ret2) || ' (' || to_char(date_1, 'DD.MM.YY') || ', ' || to_char(date_2, 'DD.MM.YY') ||', ' || docname || ')');

dbms_output.put_line('Procent vyzdorovlenii: ' || to_char(ret1));

END;

/

Создание триггеров

set serveroutput on

create or replace trigger on_ins_doctor

AFTER INSERT ON DOCTOR

for each row

begin

insert into log

values(USER,SYSDATE,'Dobavlenie zapisi v tablicu DOCTOR');

end on_ins_doctor;

/

create or replace trigger on_ins_talon

BEFORE INSERT ON TALON

for each row

declare

clientname varchar(40);

illnessname varchar(30);

begin

insert into log

values(USER,SYSDATE,'Dobavlenie zapisi v tablicu TALON');

if (:new.Recovery = 1) THEN

select Name into clientname from CLIENT where ClientID = :new.ClientID;

select Name into illnessname from ILLNESS where IllnessID = :new.IllnessID;

dbms_output.put_line('Client '||clientname||' s zabolevaniem '||illnessname||' vyzdorovel');

end if;

end on_ins_talon;

/

create table log

(

loguser varchar(10),

logdate date,

logtext varchar(40)

);

INSERT INTO DOCTOR VALUES

(15, 'Ivanova', 'dermatolog');

INSERT INTO TALON VALUES

(STalonID.NextVal, 6, 2, 9, TO_DATE('12/02/2012','DD/MM/YYYY'), 1);

SELECT * FROM log;