2016-12-18 2 views
0

ich diese Tabellen bekam (Oracle):Schreiben Auslöser einer Tabelle automatisch eine andere Tabelle zu aktualisieren

Doctors (Doctor_ID (PK), 
     Doctor_Name, 
     DoB, 
     Specialization) 

Doctors_At_Work (Doctor_ID (PK), 
       The_Date (PK), 
       Hour_Start (PK), 
       Hour_Stop, 
       Room) 

Consultations_Intervals (Doctor_ID (PK), 
         The_Date (PK), 
         Start_Hour_Consult (PK), 
         Stop_Hour_Consut, 
         Room) 

OBS: A consultation last for only 30 minutes. 

Meine Aufgabe ist es, die notwendigen Trigger erstellen (insert/update/delete) von Doctors_At_Work, um automatisch zu aktualisieren die Consultations_Intervals Tabelle.

Was ich bisher tat:

Create sequence seq_id_doctor START with 1 INCREMENT BY 1 ORDER NOCACHE; 

CREATE OR REPLACE trigger t_1 
     BEFORE INSERT ON Doctors_At_Work FOR EACH ROW 
BEGIN 
    :NEW.Doctor_ID:=seq_id_doctor.NextValue; 
    :NEW.The_Date:=CURRENT_TIMESTAMP; 
    :NEW.Hour_Start:=Select Extract (Hour from CURRENT_TIMESTAMP); 
END; 
/

CREATE OR REPLACE trigger t_2 
     AFTER INSERT OR UPDATE ON Consultations_Intervals FOR EACH ROW 
BEGIN 
INSERT INTO Consultations_Intervals VALUES 
(:NEW.Doctor_ID, :NEW.The_Date, :NEW.Hour_Start, :NEW.Hour_Start + 
    interval '30' minute, :NEW.Room); 
END; 
/

was falsch ist? Wie soll ich diese Aufgabe lösen? (wenn es andere Ideen gibt)

+0

Was ist das Problem? Haben Sie einen Fehler (was?) Oder ein unerwartetes Verhalten? – Aleksej

+0

Bitte geben Sie auch die Struktur der Tabellen an; Zum Beispiel, Hour_Start ist ein Datum, varchar, Nummer ?, ... – Aleksej

Antwort

1

Alles, was Sie brauchen, ist ein einfacher Trigger auf Ihrer Doctors_At_work Tabelle. Siehe Beispiel unten:

Tables:

create table Doctors_At_Work (Doctor_ID number Primary key, 
       The_Date date , 
       Hour_Start date  , 
       Hour_Stop date, 
       Room number); 

create table Consultations_Intervals (Doctor_ID number, 
         The_Date date , 
         Start_Hour_Consult number, 
         Stop_Hour_Consut number, 
         Room number); 

Trigger:

create or replace trigger t_1 
    before insert or update or delete on doctors_at_work 
    for each row 
begin 
    insert into consultations_intervals (doctor_id, 
             the_date, 
             start_hour_consult, 
             stop_hour_consut, 
             room) 
     values (:new.doctor_id, 
       current_timestamp, 
       extract (minute from current_timestamp), 
       extract (minute from current_timestamp), 
       :new.room); 
end; 
/

Ausgang:

SQL> Prompt "Before trigger" 
"Before trigger" 

SQL> select * from Doctors_At_Work; 

no rows selected 

SQL> select * from Consultations_Intervals; 

no rows selected 

SQL> create or replace trigger t_1 
    before insert or update or delete on doctors_at_work 
    2 3  for each row 
    4 begin 
    insert into consultations_intervals (doctor_id, 
    5 6           the_date, 
    7           start_hour_consult, 
    8           stop 
    . 
    . 
    . 
Trigger created. 

SQL> Insert into DOCTORS_AT_WORK 
    (DOCTOR_ID, THE_DATE, HOUR_START, HOUR_STOP, ROOM) 
Values 
    (2, TO_DATE('12/18/2016 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('12/13/2016 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), TO_DATE('12/14/2016 00:00:00', 'MM/DD/YYYY HH24:MI:SS'), 12); 
COMMIT; 
    2 3 4 
1 row created. 

SQL> 
Commit complete. 

SQL> select * from Doctors_At_Work; 

DOCTOR_ID THE_DATE HOUR_STAR HOUR_STOP  ROOM 
---------- --------- --------- --------- ---------- 
     2 18-DEC-16 13-DEC-16 14-DEC-16   12 

SQL> select * from Consultations_Intervals; 

DOCTOR_ID THE_DATE START_HOUR_CONSULT STOP_HOUR_CONSUT  ROOM 
---------- --------- ------------------ ---------------- ---------- 
     2 19-DEC-16     17    17   12 
+0

Vielen Dank! Aber wenn ich 10 Ärzte habe, möchte ich den Auslöser t1 für alle 10 Ärzte schleifen ... Ich kann nicht herausfinden, welchen Zustand ich für diese Schleife schreiben sollte ... –

+0

Machst du etwa 10 Datensätze in die Tabelle 'Doctors_At_Work'. So können Sie Insert-Statements erstellen. Datensätze werden automatisch über triger in andere Tabellen eingefügt. – XING

Verwandte Themen