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.
Maintenant, il fonctionne ... vraiment apprécier pour identifier mon erreur. – stranger