Листинг
Создание таблиц
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;