Advertisement
Robruizr

Untitled

May 3rd, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 8.30 KB | None | 0 0
  1. CREATE TYPE PersonUdt AS OBJECT(
  2.     personId NUMBER(10),
  3.     firstName VARCHAR(20),
  4.     lastName VARCHAR(30),
  5.     dob DATE,
  6.     gender VARCHAR(10)
  7. )INSTANTIABLE NOT FINAL;
  8.  
  9.  
  10. CREATE OR REPLACE TYPE PatientUdt under PersonUdt(
  11.     insurancePlan VARCHAR(100)
  12. );
  13.  
  14. CREATE OR REPLACE TYPE DoctorUdt under PersonUdt(
  15.     speciality VARCHAR(20),
  16.     yearsExperience NUMBER(2),
  17.   salary NUMBER(10,2)
  18. );
  19.  
  20. CREATE TABLE Person OF PersonUdt(
  21.     personId PRIMARY KEY
  22. )OBJECT IDENTIFIER IS SYSTEM GENERATED;
  23.  
  24. CREATE TABLE Patient OF PatientUdt;
  25.  
  26. CREATE TABLE Doctor OF DoctorUdt;
  27.  
  28. CREATE TYPE TreatmentUdt AS object(
  29.     tid NUMBER(10),
  30.     duration NUMBER(3),
  31.     medicaments VARCHAR(35),
  32.     description VARCHAR(200),
  33.     patientId REF PatientUdt,
  34.     doctorId REF DoctorUdt
  35. );
  36.  
  37. CREATE TABLE Treatment OF TreatmentUdt(
  38.     CONSTRAINT treatmentPK PRIMARY KEY (tid),
  39.     patientId SCOPE IS Patient,
  40.     doctorId SCOPE IS Doctor
  41. );
  42.  
  43. CREATE TYPE AreaUdt AS object(
  44.     aid NUMBER(2),
  45.     name VARCHAR(30),
  46.     location VARCHAR(30)
  47. );
  48.  
  49. ALTER TYPE AreaUdt add ATTRIBUTE(
  50.     leads REF DoctorUdt
  51. )CASCADE;
  52.  
  53.  
  54. ALTER TYPE DoctorUdt ADD ATTRIBUTE(
  55.     areaOfWork REF AreaUdt,
  56.     leaderOf REF AreaUdt
  57. )CASCADE;
  58.  
  59. CREATE TABLE Area OF AreaUdt(
  60.     CONSTRAINT areaPK PRIMARY KEY(aid),
  61.     leads SCOPE IS Doctor
  62. )OBJECT IDENTIFIER IS SYSTEM GENERATED;
  63.  
  64.  
  65. ALTER TABLE Doctor ADD SCOPE FOR(areaOfWork) IS Area;
  66. ALTER TABLE Doctor ADD SCOPE FOR(leaderOf) IS Area;
  67. ALTER TABLE Doctor modify (leaderof REF areaudt NULL);
  68.  
  69. ----constraints
  70.  
  71. ALTER TABLE Patient ADD CONSTRAINT InsurancePlan_Constraint1 CHECK(insurancePlan IN('Unlimited','Premium','Basic'));
  72. ALTER TABLE Doctor ADD CONSTRAINT specialityName_Constraint CHECK(speciality IN('General Med','Traumatology','Allergology','Radiology','Cardiology','Gerontology','Obstetrics','Pediatrics'));
  73.  
  74. ALTER TABLE Area ADD CONSTRAINT areaName_Constraint CHECK(name IN('General Med','Traumatology','Allergology','Radiology','Cardiology','Gerontology','Obstetrics','Pediatrics'));
  75.  
  76. ALTER TABLE Person ADD CONSTRAINT speciality_Constraint CHECK(speciality IN('General Med','Traumatology','Allergology','Radiology','Cardiology','Gerontology','Obstetrics','Pediatrics'));
  77.  
  78.  
  79.  
  80. ----inserts
  81.  
  82. INSERT INTO Person VALUES(2, 'Adriana', 'Valenzuela', TO_DATE('1993/11/24', 'yyyy/mm/dd'), 'female');
  83. INSERT INTO Person VALUES(3, 'Mayra', 'Ruiz', TO_DATE('1995/07/27', 'yyyy/mm/dd'), 'female');
  84.  
  85. INSERT INTO patient VALUES(6, 'Estefania', 'Guajardo', TO_DATE('1995/01/18', 'yyyy/mm/dd'), 'female', 'Basic');
  86. INSERT INTO patient VALUES(7, 'Carlos', 'Frutos', TO_DATE('1993/12/16', 'yyyy/mm/dd'), 'male', 'Premium');
  87.  
  88. INSERT INTO doctor VALUES(1, 'Roberto', 'Ruiz', TO_DATE('1994/04/17', 'yyyy/mm/dd'), 'male', 'General Medicine', 5, 50000, (SELECT REF(a) FROM Area a WHERE a.aid = 1), (SELECT REF(a) FROM Area a WHERE a.aid = 1));
  89. INSERT INTO doctor VALUES(4, 'Adriana', 'Amaro', TO_DATE('1993/04/07', 'yyyy/mm/dd'), 'female', 'Cardiology', 6, 90000, (SELECT REF(a) FROM Area a WHERE a.aid = 2), (SELECT REF(a) FROM Area a WHERE a.aid = 2));
  90. INSERT INTO doctor VALUES(5, 'Edgar', 'Turrubiates', TO_DATE('1993/12/19', 'yyyy/mm/dd'), 'male', 'Cardiology', 4, 25000, (SELECT REF(a) FROM Area a WHERE a.aid = 2), NULL);
  91.  
  92. INSERT INTO Treatment VALUES(1, 8, 'Clopidogrel', 'Iniciar con una dosis única de 300mg de carga oral y luego continuar con 75mg una vez al dia', (SELECT REF(p) FROM Patient p WHERE p.personID = 3), NULL);
  93. INSERT INTO Treatment VALUES(2, 15, 'Trimebutina', 'Tomar una tableta de 200mg cada 12 horas. Evitar harinas, grasas y comidas pesadas', (SELECT REF(p) FROM Patient p WHERE p.personID = 3), (SELECT REF(d) FROM Doctor d WHERE d.personID = 1));
  94. INSERT INTO Treatment VALUES(3, 5, 'Ácido Zoledrónico', 'Suministrarse dentro de un hospital e inyectarse durante 15 minutos. Debe beber 2 vasos de agua antes de inyectarse', (SELECT REF(p) FROM Patient p WHERE p.personID = 2), (SELECT REF(d) FROM Doctor d WHERE d.personID = 1));
  95.  
  96. INSERT INTO Area VALUES(1, 'General Medicine', '2rd Floor', (SELECT REF(d) FROM Doctor d WHERE d.personID = 1));
  97. INSERT INTO Area VALUES(2, 'Cardiology', '5th Floor', (SELECT REF(d) FROM Doctor d WHERE d.personID = 3));
  98.  
  99.  
  100. CREATE OR REPLACE TRIGGER SalaryIncrement
  101.   AFTER UPDATE OF YEARSEXPERIENCE ON DOCTOR
  102.   FOR EACH ROW
  103. BEGIN
  104.     IF MOD(:NEW.YEARSEXPERIENCE,2) = 0 THEN
  105.       UPDATE DOCTOR SET salary = (:old.salary * 0.10 + :old.salary)
  106.       WHERE PERSONID = :old.PERSONID;
  107.     END IF;
  108. END;
  109.  
  110. CREATE OR REPLACE TRIGGER PatientInsurancePremiumPlan
  111.    BEFORE INSERT
  112.    ON TREATMENT
  113.    FOR EACH ROW
  114. DECLARE
  115.    patientInsurance   EXCEPTION;
  116.    PRAGMA EXCEPTION_INIT (patientInsurance, -20001);
  117.    seguro VARCHAR(100);
  118.    especialidad VARCHAR(15);
  119. BEGIN
  120.   SELECT DEREF(:NEW.patientid).insuranceplan
  121.   INTO seguro
  122.   FROM TREATMENT
  123.   WHERE tid = :NEW.tid;
  124.  
  125.   SELECT DEREF(:NEW.doctorid).speciality
  126.   INTO especialidad
  127.   FROM TREATMENT
  128.   WHERE tid = :NEW.tid;
  129.  
  130.   IF seguro = 'Premium' THEN
  131.       IF especialidad = 'General Medicine' OR especialidad = 'Traumatology' OR especialidad = 'Allergology'
  132.       OR especialidad = 'Cardiology' OR especialidad = 'Gerontology' OR especialidad = 'Obstetrics' OR especialidad = 'Pediatrics' THEN
  133.         RAISE patientInsurance;
  134.       END IF;
  135.     END IF;
  136. EXCEPTION
  137.       WHEN patientInsurance THEN
  138.             raise_application_error (-20001, 'Premium Plan does not include Radiology');    
  139. END;
  140.  
  141.  
  142. CREATE OR REPLACE TRIGGER PatientInsuranceBasicPlan
  143.    BEFORE INSERT
  144.    ON TREATMENT
  145.    FOR EACH ROW
  146. DECLARE
  147.    patientInsurance   EXCEPTION;
  148.    PRAGMA EXCEPTION_INIT (patientInsurance, -20001);
  149.    seguro VARCHAR(100);
  150.    especialidad VARCHAR(30);
  151. BEGIN
  152.   SELECT DEREF(:NEW.patientid).insuranceplan
  153.   INTO seguro
  154.   FROM TREATMENT
  155.   WHERE tid = :NEW.tid;
  156.  
  157.   SELECT DEREF(:NEW.doctorid).speciality
  158.   INTO especialidad
  159.   FROM TREATMENT
  160.   WHERE tid = :NEW.tid;
  161.  
  162.   IF seguro =  'Basic' THEN
  163.       IF especialidad  = 'General Medicine' OR especialidad = 'Obstetrics' OR especialidad = 'Pediatrics' THEN
  164.         RAISE patientInsurance;
  165.       END IF;
  166.     END IF;
  167. EXCEPTION
  168.       WHEN patientInsurance THEN
  169.             raise_application_error (-20001, 'Basic Plan can only include General Medicine, Obstetrics and Pediatrics');    
  170. END;
  171.  
  172. CREATE OR REPLACE TRIGGER OnChangeAreaUpdateLeader
  173.    After UPDATE
  174.    ON DOCTOR
  175.    FOR EACH ROW
  176. DECLARE
  177.    varLeader VARCHAR(30);
  178.    maxDoctor NUMBER(3);  
  179. BEGIN
  180.  
  181.   SELECT DEREF(:old.leaderof).name
  182.   INTO varLeader
  183.   FROM Doctor
  184.   WHERE personid = :old.personid;
  185.  
  186.   SELECT PERSONID
  187.   INTO maxDoctor
  188.   FROM DOCTOR
  189.   WHERE YEARSEXPERIENCE >= (SELECT MAX(YEARSEXPERIENCE) FROM doctor);
  190.  
  191.   IF varLeader IS NOT NULL THEN
  192.     UPDATE AREA SET LEADS = (SELECT REF(doc) FROM Doctor doc WHERE doc.Personid = maxDoctor) WHERE aid = DEREF(:old.areaofwork).aid;
  193.   END IF;
  194.  
  195. END;
  196.  
  197. CREATE OR REPLACE TRIGGER DoctorAreaWork
  198.    BEFORE INSERT
  199.    ON DOCTOR
  200.    FOR EACH ROW
  201. DECLARE
  202.    doctorAreaWorkEx   EXCEPTION;
  203.    PRAGMA EXCEPTION_INIT (doctorAreaWorkEx, -20001);
  204.    areaName VARCHAR(30);
  205.    doctorSpeciality VARCHAR(30);
  206. BEGIN
  207.  
  208.   IF areaName IS NULL THEN
  209.     RAISE doctorAreaWorkEx;
  210.   END IF;
  211.  
  212.   SELECT DEREF(:NEW.areaofwork).name
  213.   INTO areaName
  214.   FROM DOCTOR
  215.   WHERE personid = :NEW.personid;
  216.  
  217.   SELECT :NEW.speciality
  218.   INTO doctorSpeciality
  219.   FROM DOCTOR
  220.   WHERE personid = :NEW.personid;
  221.    
  222.       IF areaName = doctorSpeciality THEN
  223.         RAISE doctorAreaWorkEx;
  224.     END IF;
  225.  
  226. EXCEPTION
  227.       WHEN doctorAreaWorkEx THEN
  228.             raise_application_error (-20001, 'A doctor only works on his area of speciality');    
  229. END;
  230.  
  231. CREATE OR REPLACE TRIGGER DoctorLeader
  232.    BEFORE INSERT
  233.    ON DOCTOR
  234.    FOR EACH ROW
  235. DECLARE
  236.    doctorLeaderEx   EXCEPTION;
  237.    PRAGMA EXCEPTION_INIT (doctorLeaderEx, -20001);
  238.    areaName VARCHAR(30);
  239.    doctorLeads VARCHAR(30);
  240. BEGIN
  241.   SELECT DEREF(:NEW.areaofwork).name
  242.   INTO areaName
  243.   FROM DOCTOR
  244.   WHERE personid = :NEW.personid;
  245.  
  246.   SELECT DEREF(:NEW.leaderof).name
  247.   INTO doctorLeads
  248.   FROM DOCTOR
  249.   WHERE personid = :NEW.personid;
  250.  
  251.   IF doctorLeads IS NULL THEN
  252.     RAISE doctorLeaderEx;
  253.   END IF;
  254.  
  255.   IF doctorLeads IS NOT NULL THEN
  256.     IF areaName = doctorLeads THEN
  257.         RAISE doctorLeaderEx;
  258.     END IF;
  259.   END IF;
  260. EXCEPTION
  261.       WHEN doctorLeaderEx THEN
  262.             raise_application_error (-20001, 'A doctor only can lead the area he works on');    
  263. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement