IBK*_*IBK 5 sql database oracle triggers oracle10g
我有两个表,COURSE和OFFERING。他们的专栏是:
COURSE (
courseId,
title,
cost,
duration
)
Run Code Online (Sandbox Code Playgroud)
和
OFFERING (
offeringID,
instructor,
startDate,
endDate,
courseId,
locationId
).
Run Code Online (Sandbox Code Playgroud)
我想配置一个触发器,它确保了有5天(从时间列时间课程COURSE表)不能在十二月提供的(从startDate列OFFERING表)。我提出了以下SQL查询:
CREATE OR REPLACE TRIGGER checkDuration
BEFORE INSERT OR UPDATE ON
(course c JOIN offering o
ON
c.courseId = o.courseId)
FOR EACH ROW
BEGIN
IF ((to_char(:new.startDate, 'fmMONTH') = 'DECEMBER') AND duration = 5)
THEN
raise_application_error(-20001, 'Courses of five days duration cannot be run in December');
END IF;
END;
Run Code Online (Sandbox Code Playgroud)
触发器已创建,但有错误。
这非常有效。
CREATE OR REPLACE TRIGGER checkDuration
BEFORE INSERT OR UPDATE on offering
FOR EACH ROW
DECLARE
isFound NUMBER;
BEGIN
SELECT 1 INTO isFound FROM DUAL WHERE EXISTS (
SELECT * FROM Course c
WHERE c.courseId = :new.courseId AND c.duration = 5);
IF EXTRACT(MONTH FROM :new.startDate) = 12
THEN RAISE_APPLICATION_ERROR(-20001, 'Courses of five days duration cannot be run in December');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
END;
Run Code Online (Sandbox Code Playgroud)