2017-09-07 2 views
1

Ce sont les 2 tables et 2 séquences que j'ai créé et inséré leurs valeurs ainsi:PL/trigger SQL pour vérifier si si screening_start_hh24 est entre plan_min_start_hh24 et plan_max_start_hh24

CREATE TABLE Screening_Plan 
    (
    plan_id NUMBER(4) PRIMARY KEY, 
    CONSTRAINT check_plan_id CHECK(plan_id > 0), 
    movie_id NUMBER(4) NOT NULL, 
    plan_start_date DATE DEFAULT NEXT_DAY(SYSDATE,'MON') NOT NULL, 
    plan_end_date DATE DEFAULT NEXT_DAY(SYSDATE + 6,'MON') NOT NULL, 
    plan_min_start_hh24 NUMBER(2) DEFAULT 9 NOT NULL, 
    CONSTRAINT check_plan_min_start_hh24 CHECK(plan_min_start_hh24 BETWEEN 9 AND 22), 
    plan_max_start_hh24 NUMBER(2) DEFAULT 22 NOT NULL, 
    CONSTRAINT check_plan_max_start_hh24 CHECK((plan_max_start_hh24 BETWEEN 9 AND 22) AND (plan_max_start_hh24 >= plan_min_start_hh24)), 
    plan_no_of_screenings NUMBER(2) NOT NULL, 
    CONSTRAINT check_plan_no_of_screenings CHECK(plan_no_of_screenings >= 1), 
    CONSTRAINT unique_movie_id_plan_start_date UNIQUE(movie_id,plan_start_date) 
    ); 


    CREATE TABLE Screening 
    (
    screening_id NUMBER(6) PRIMARY KEY, 
    CONSTRAINT check_screening_id CHECK(screening_id > 0), 
    plan_id NUMBER(4) NOT NULL, 
    CONSTRAINT fk_plan_id FOREIGN KEY(plan_id) REFERENCES Screening_Plan(plan_id), 
    theatre_id NUMBER(1) NOT NULL, 
    screening_date DATE DEFAULT CURRENT_DATE NOT NULL, 
    screening_start_hh24 NUMBER(2) NOT NULL, 
    CONSTRAINT check_start_hh24 CHECK(screening_start_hh24 BETWEEN 9 AND 22), 
    screening_start_mm60 NUMBER(2) NOT NULL, 
    CONSTRAINT check_start_mm60 CHECK(screening_start_mm60 BETWEEN 0 AND 59), 
    CONSTRAINT unique_theatre_id_screening_date_screening_start_hh24_screening_start_mm60 UNIQUE(theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
); 

CREATE SEQUENCE screening_plan_seq 
START WITH 1 
INCREMENT BY 1 
NOCACHE NOCYCLE; 

CREATE SEQUENCE screening_seq 
START WITH 1 
INCREMENT BY 1 
NOCACHE NOCYCLE; 

INSERT INTO Screening_Plan (plan_id,movie_id,plan_start_date,plan_end_date,plan_min_start_hh24,plan_max_start_hh24,plan_no_of_screenings) 
VALUES (screening_plan_seq.NEXTVAL,1,TO_DATE('11/9/2017','DD/MM/YYYY'),TO_DATE('08/10/2017','DD/MM/YYYY'),9,17,6); 
INSERT INTO Screening_Plan (plan_id,movie_id,plan_start_date,plan_end_date,plan_min_start_hh24,plan_max_start_hh24,plan_no_of_screenings) 
VALUES (screening_plan_seq.NEXTVAL,2,TO_DATE('11/9/2017','DD/MM/YYYY'),TO_DATE('08/10/2017','DD/MM/YYYY'),9,17,5); 
INSERT INTO Screening_Plan (plan_id,movie_id,plan_start_date,plan_end_date,plan_min_start_hh24,plan_max_start_hh24,plan_no_of_screenings) 
VALUES (screening_plan_seq.NEXTVAL,3,TO_DATE('11/9/2017','DD/MM/YYYY'),TO_DATE('08/10/2017','DD/MM/YYYY'),9,21,4); 
INSERT INTO Screening_Plan (plan_id,movie_id,plan_start_date,plan_end_date,plan_min_start_hh24,plan_max_start_hh24,plan_no_of_screenings) 
VALUES (screening_plan_seq.NEXTVAL,4,TO_DATE('11/9/2017','DD/MM/YYYY'),TO_DATE('08/10/2017','DD/MM/YYYY'),9,21,4); 

INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,1,3,TO_DATE('11/9/2017','DD/MM/YYYY'),9,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,1,3,TO_DATE('11/9/2017','DD/MM/YYYY'),11,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,1,3,TO_DATE('11/9/2017','DD/MM/YYYY'),13,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,1,2,TO_DATE('11/9/2017','DD/MM/YYYY'),13,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,1,3,TO_DATE('11/9/2017','DD/MM/YYYY'),15,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,1,3,TO_DATE('11/9/2017','DD/MM/YYYY'),17,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,2,1,TO_DATE('11/9/2017','DD/MM/YYYY'),9,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,2,1,TO_DATE('11/9/2017','DD/MM/YYYY'),12,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,2,1,TO_DATE('11/9/2017','DD/MM/YYYY'),15,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,2,2,TO_DATE('11/9/2017','DD/MM/YYYY'),9,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,2,2,TO_DATE('11/9/2017','DD/MM/YYYY'),15,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,3,4,TO_DATE('11/9/2017','DD/MM/YYYY'),9,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,3,4,TO_DATE('11/9/2017','DD/MM/YYYY'),12,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,3,4,TO_DATE('11/9/2017','DD/MM/YYYY'),15,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,3,4,TO_DATE('11/9/2017','DD/MM/YYYY'),18,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,4,1,TO_DATE('11/9/2017','DD/MM/YYYY'),18,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,4,2,TO_DATE('11/9/2017','DD/MM/YYYY'),18,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,4,3,TO_DATE('11/9/2017','DD/MM/YYYY'),19,0); 
INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,4,4,TO_DATE('11/9/2017','DD/MM/YYYY'),21,0); 

Alors j'ai eu la question d'affectation suivante :

Créer un déclencheur TR_validate_screening_time qui se déclenche avant d'insérer une ligne dans la table de filtrage. Le déclencheur devrait vérifier si screening_start_hh24 est entre plan_min_start_hh24 et plan_max_start_hh24. Si ce n'est pas le cas, le déclencheur devrait déclencher une erreur d'application avec un message significatif. [Note: screening_start_hh24 est dans le tableau de dépistage et plan_min_start_hh24, plan_min_start_hh24 sont dans le tableau Screening_Plan]

Ceci est ma logique de déclenchement:

CREATE OR REPLACE TRIGGER TR_validate_screening_time 
BEFORE INSERT 
ON Screening 
FOR 
EACH ROW 
DECLARE 
v_screening_start_hh24 Screening.screening_start_hh24%TYPE; 
v_plan_min_start_hh24 Screening_Plan.plan_min_start_hh24%TYPE; 
v_plan_max_start_hh24 Screening_Plan.plan_max_start_hh24%TYPE; 
BEGIN 
SELECT screening_start_hh24 INTO v_screening_start_hh24 
FROM Screening 
WHERE screening_id = :NEW.screening_id; 
SELECT plan_min_start_hh24,plan_max_start_hh24 INTO v_plan_min_start_hh24,v_plan_max_start_hh24 
FROM Screening_Plan 
WHERE plan_id = :NEW.plan_id; 
IF (v_screening_start_hh24 < v_plan_min_start_hh24) OR (v_screening_start_hh24 > v_plan_max_start_hh24) 
THEN 
RAISE_APPLICATION_ERROR(-20001,'Screening start time should be between planned minimum start hour and planned maximum start hour'); 
END IF; 
END; 

Le déclencheur a été compilé comme indiqué avec succès ci-dessous:

Trigger TR_VALIDATE_SCREENING_TIME compiled 

Afin de m'assurer que le déclencheur s'exécute avec succès, je l'ai essayé en entrant une valeur invalide pour la colonne screening_start_hh24:

INSERT INTO Screening (screening_id,plan_id,theatre_id,screening_date,screening_start_hh24,screening_start_mm60) 
VALUES (screening_seq.NEXTVAL,1,1,TO_DATE('12/9/2017','DD/MM/YYYY'),8,0); 

Je reçu le message suivant:

Error report - 
ORA-01403: no data found 
ORA-06512: at "SCM_JC450912.TR_VALIDATE_SCREENING_TIME", line 6 
ORA-04088: error during execution of trigger 'SCM_JC450912.TR_VALIDATE_SCREENING_TIME' 

Le problème est que je reçois le message d'erreur affiché comme ORA-01403: Aucune donnée trouvée. Mais je veux que le message d'erreur soit affiché comme ORA-20001: L'heure de début de dépistage devrait être comprise entre l'heure de début minimum prévue et l'heure de début maximum prévue

Où ai-je fait l'erreur dans mon code de déclencheur?

Il serait très utile que le code de la solution soit fourni.

Répondre

1

Cette partie:

SELECT screening_start_hh24 INTO v_screening_start_hh24 
FROM Screening 
WHERE screening_id = :NEW.screening_id; 

est faux et se traduira par NO_DATA_FOUND parce que la nouvelle ligne n'est pas encore là!

Heureusement tout ce que vous avez vraiment besoin est:

v_screening_start_hh24 := :new.screening_start_hh24; 
+0

Maintenant, il fonctionne ... vraiment apprécier pour identifier mon erreur. – stranger