forked from zanterian/HINF201_SQL_SCRIPTS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStart.sql
204 lines (193 loc) · 5.18 KB
/
Start.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
----------------------- TIME -------------------------------
CREATE TABLE Time(
t DATE
, CONSTRAINT pk_t
PRIMARY KEY(t)
);
/* People Involved */
------------------- DOCTOR --------------------------------
CREATE TABLE Doctor(
d_id CHAR(4)
, d_first_name VARCHAR2(100) NOT NULL
, d_last_name VARCHAR2(100) NOT NULL
, d_employed_date DATE
, CONSTRAINT pk_d_id
PRIMARY KEY(d_id)
, CONSTRAINT fk_d_employed_date
FOREIGN KEY(d_employed_date)
REFERENCES Time(t)
ON DELETE SET NULL
);
------------------- Patient -------------------------------
CREATE TABLE Patient(
p_id NUMBER(10)
, p_first_name VARCHAR2(100) NOT NULL
, p_middle_name VARCHAR2(100)
, p_last_name VARCHAR2(100) NOT NULL
, p_d_id CHAR(4)
, CONSTRAINT pk_p_id
PRIMARY KEY(p_id)
, CONSTRAINT fk_p_d_id
FOREIGN KEY(p_d_id)
REFERENCES Doctor(d_id)
ON DELETE SET NULL
);
------------- Additional Info -----------------------------
CREATE TABLE Patient_Additional(
pa_p_id NUMBER(10)
, pa_bd DATE
, pa_add1 VARCHAR2(200)
, pa_add2 VARCHAR2(200)
, pa_ph NUMBER(12)
, CONSTRAINT uq_pa_p_id
UNIQUE(pa_p_id)
, CONSTRAINT fk_pa_p_id
FOREIGN KEY(pa_p_id)
REFERENCES Patient(p_id)
ON DELETE SET NULL
, CONSTRAINT fk_pa_bd
FOREIGN KEY(pa_bd)
REFERENCES TIME(t)
ON DELETE SET NULL
);
/* Data Entry */
----------------------- ICD -------------------------------
CREATE TABLE ICD_10_CA(
code CHAR(50)
, code_text VARCHAR(2000)
, CONSTRAINT pk_icd_code
PRIMARY KEY(code)
);
/* Events */
----------------- Encounter -------------------------------
CREATE TABLE Encounter(
e_id CHAR(6)
, e_type VARCHAR2(1000) NOT NULL
, e_price NUMBER(6,2) NOT NULL
, CONSTRAINT pk_e_id
PRIMARY KEY(e_id)
);
----------------- Patient Visits --------------------------
CREATE TABLE Patient_Visit(
pv_id NUMBER(10)
, pv_e_id CHAR(6)
, pv_p_id NUMBER(10) NOT NULL
, pv_d_id CHAR(4) NOT NULL
, pv_t DATE NOT NULL
, pv_icd_code CHAR(50)
-- Temporarily disabling the image for now
-- , pv_image BLOB
, pv_description VARCHAR2(2000)
, CONSTRAINT pk_pv_id
PRIMARY KEY(pv_id)
, CONSTRAINT fk_pv_e_id
FOREIGN KEY(pv_e_id)
REFERENCES Encounter(e_id)
ON DELETE SET NULL
, CONSTRAINT fk_pv_p_id
FOREIGN KEY(pv_p_id)
REFERENCES Patient(p_id)
ON DELETE SET NULL
, CONSTRAINT fk_pv_d_id
FOREIGN KEY(pv_d_id)
REFERENCES Doctor(d_id)
ON DELETE SET NULL
, CONSTRAINT fk_pv_t
FOREIGN KEY(pv_t)
REFERENCES Time(t)
ON DELETE SET NULL
, CONSTRAINT fk_pv_icd_code
FOREIGN KEY(pv_icd_code)
REFERENCES ICD_10_CA(code)
ON DELETE SET NULL
);
/*************************************/
/* Functions Triggers and Procedures */
/*************************************/
/* Procedure to be used to add a time to the table Time - this makes it easier*/
CREATE OR REPLACE PROCEDURE Insert_Into_Time (date_in IN DATE) IS
BEGIN
INSERT INTO TIME (t) VALUES (date_in);
END;
/
-- Boolean-like function -- 1 for True, 0 for false
CREATE OR REPLACE FUNCTION Check_Time_Table (date_in IN DATE) RETURN NUMBER
IS
count_t NUMBER;
BEGIN
SELECT count(*)
INTO count_t
FROM Time
WHERE Time.t = date_in;
RETURN count_t;
END;
/
-- Boolean-like function -- 1 for True, 0 for false
CREATE OR REPLACE FUNCTION Check_If_Visit_Possible (date_in IN DATE, doctor_id IN CHAR) RETURN NUMBER
IS
return_value NUMBER;
doctor_employed DATE;
BEGIN
SELECT d_employed_date
INTO doctor_employed
FROM Doctor
WHERE Doctor.d_id = doctor_id;
IF doctor_employed < date_in THEN
RETURN 1;
END IF;
RETURN 0;
END;
/
/*****************************************************************************/
/************************** Doctor Table Triggers ****************************/
/*****************************************************************************/
-- Make sure that the time Primary Key exists
CREATE OR REPLACE TRIGGER Doctor_Time_Trigger
BEFORE INSERT ON Doctor
FOR EACH ROW
DECLARE
date_check NUMBER;
BEGIN
date_check := Check_Time_Table(:new.d_employed_date);
IF date_check = 0 THEN
Insert_Into_Time(:new.d_employed_date);
END IF;
END;
/
/*****************************************************************************/
/************************** Patient_Additional Table Triggers ***************/
/*****************************************************************************/
-- Make sure the time Primary Key exists
CREATE OR REPLACE TRIGGER Pat_Addi_Time_Trigger
BEFORE INSERT ON Patient_Additional
FOR EACH ROW
DECLARE
date_check NUMBER;
BEGIN
date_check := Check_Time_Table(:new.pa_bd);
IF date_check = 0 THEN
Insert_Into_Time(:new.pa_bd);
END IF;
END;
/
/*****************************************************************************/
/************************** Patient_Visit Table Triggers *********************/
/*****************************************************************************/
--
CREATE OR REPLACE TRIGGER Patient_Visit_Trigger
BEFORE INSERT ON Patient_Visit
FOR EACH ROW
DECLARE
date_check NUMBER;
appointment_check NUMBER;
BEGIN
appointment_check := Check_If_Visit_Possible (:new.pv_t,:new.pv_d_id);
IF appointment_check = 0 THEN
raise_application_error(-20001,'Appointment Cannot Be Before Doctor Employed Date');
END IF;
date_check := Check_Time_Table(:new.pv_t);
IF date_check = 0 THEN
Insert_Into_Time(:new.pv_t);
END IF;
END;
/