为什么我会收到警告:触发器创建时出现编译错误?
Why am I getting a Warning: Trigger created with compilation errors?
这是我第一次在 SQL*Plus 中使用 Triggers,而且我不想拥有超过电影院放映室的最大容量。
放映时间给出 max_occupancy。这是我的:
CREATE OR REPLACE TRIGGER over_capacity
BEFORE INSERT OR UPDATE ON tickets
FOR EACH ROW
WHEN (NEW.SHOWID=OLD.SHOWID)
DECLARE
nope EXCEPTION;
ti SYS_REFCURSOR;
sh SYS_REFCURSOR;
total INT;
max_oc INT;
BEGIN
OPEN sh FOR
SELECT s.max_occupancy FROM showtimes s WHERE NEW.showid=s.showid;
FETCH sh INTO max_oc;
OPEN ti FOR
SELECT COUNT(t.userid) FROM tickets t WHERE t.showid=NEW.showid;
FETCH ti INTO total;
IF total=max_oc THEN
RAISE nope;
END IF;
EXCEPTION
WHEN nope THEN
raise_application_error (-20500, 'AT CAPACITY');
END;
/
您可以只使用 select 语句,如下所示:
CREATE OR REPLACE TRIGGER over_capacity
BEFORE INSERT OR UPDATE ON tickets FOR EACH ROW
WHEN (NEW.SHOWID=OLD.SHOWID)
DECLARE
nope EXCEPTION;
total INT;
max_oc INT;
BEGIN
SELECT max_occupancy INTO total FROM showtimes WHERE showid = :new.showid;
SELECT COUNT(userid) INTO max_oc FROM tickets WHERE showid=:new.showid;
IF total=max_oc THEN
RAISE nope;
END IF;
EXCEPTION
WHEN nope THEN
raise_application_error (-20500, 'AT CAPACITY');
END;
/
这是我第一次在 SQL*Plus 中使用 Triggers,而且我不想拥有超过电影院放映室的最大容量。
放映时间给出 max_occupancy。这是我的:
CREATE OR REPLACE TRIGGER over_capacity
BEFORE INSERT OR UPDATE ON tickets
FOR EACH ROW
WHEN (NEW.SHOWID=OLD.SHOWID)
DECLARE
nope EXCEPTION;
ti SYS_REFCURSOR;
sh SYS_REFCURSOR;
total INT;
max_oc INT;
BEGIN
OPEN sh FOR
SELECT s.max_occupancy FROM showtimes s WHERE NEW.showid=s.showid;
FETCH sh INTO max_oc;
OPEN ti FOR
SELECT COUNT(t.userid) FROM tickets t WHERE t.showid=NEW.showid;
FETCH ti INTO total;
IF total=max_oc THEN
RAISE nope;
END IF;
EXCEPTION
WHEN nope THEN
raise_application_error (-20500, 'AT CAPACITY');
END;
/
您可以只使用 select 语句,如下所示:
CREATE OR REPLACE TRIGGER over_capacity
BEFORE INSERT OR UPDATE ON tickets FOR EACH ROW
WHEN (NEW.SHOWID=OLD.SHOWID)
DECLARE
nope EXCEPTION;
total INT;
max_oc INT;
BEGIN
SELECT max_occupancy INTO total FROM showtimes WHERE showid = :new.showid;
SELECT COUNT(userid) INTO max_oc FROM tickets WHERE showid=:new.showid;
IF total=max_oc THEN
RAISE nope;
END IF;
EXCEPTION
WHEN nope THEN
raise_application_error (-20500, 'AT CAPACITY');
END;
/