【发布时间】:2019-10-25 12:25:21
【问题描述】:
我有以下表格:
CREATE TABLE review
(
review_id NUMBER(2) NOT NULL,
review_date DATE NOT NULL,
review_rating NUMBER(1) NOT NULL,
driver_no NUMBER(2) NOT NULL,
vehicle_id NUMBER(3) NOT NULL
);
CREATE TABLE testing
(
testing_id NUMBER(2) NOT NULL,
testing_start DATE NOT NULL,
testing_end DATE NOT NULL
driver_no NUMBER(2) NOT NULL,
vehicle_id NUMBER(3) NOT NULL
);
基本上,驾驶员会在两个日期之间对车辆进行测试。测试完成后,驾驶员对车辆进行检查。
我想创建一个触发器,以防止添加无效评论。如果驾驶员在测试结束日期之前对车辆进行了审查,则该审查无效。如果驾驶员对他没有驾驶过的车辆进行评论,则该评论也无效。
例如,驾驶员 1 在 2019 年 2 月 1 日至 2019 年 2 月 7 日期间测试车辆 7。如果添加了 2019 年 2 月 5 日的评论,我希望触发器阻止插入此评论。此外,如果添加了对车辆 5 的评论(当车辆 7 是正在测试的车辆时),我希望触发器防止插入。
这是我目前所拥有的:
CREATE OR REPLACE TRIGGER review_check_validity
AFTER INSERT ON review
FOR EACH ROW
BEGIN
SELECT testing_start
FROM testing
WHERE driver_no = :new.driver_no;
SELECT vehicle_id
FROM testing
WHERE driver_no = :new.driver_no;
IF :new.review_date < testing_end THEN
raise_application_error(-20000, 'Review date cannot be before
testing end date');
END IF;
IF :new.vehicle_id != vehicle_id THEN
raise_application_error(-20000, 'Driver has never driven this
vehicle');
END IF;
END;
/
触发器编译没有任何错误 - 但是当我尝试通过在 REVIEW 表中插入无效行来测试它时,我收到一条错误消息,指出
精确提取返回的行数超过请求的行数
谁能指出我需要对我的代码进行哪些更改才能达到预期的结果?
【问题讨论】:
-
首先,您选择必须返回 INTO 某个变量。 - oracletutorial.com/plsql-tutorial/plsql-select-into 此外,如果您的查询返回多于一行,则不能这样做。
-
如果司机多次检查或测试同一辆车会怎样?
-
@GordonLinoff 假设驾驶员不会两次测试同一辆车。当然,这不是一个现实的假设,但它是问题中给我的限制之一。
标签: sql oracle database-trigger