Triggers 为什么会收到警告:触发器是用编译错误创建的?

Triggers 为什么会收到警告:触发器是用编译错误创建的?,triggers,oracle-sqldeveloper,sqlplus,Triggers,Oracle Sqldeveloper,Sqlplus,这是我第一次在SQL*Plus中使用触发器,我不想超过电影院放映室的最大容量 演出时间为最高入住率。这就是我所拥有的: 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;

这是我第一次在SQL*Plus中使用触发器,我不想超过电影院放映室的最大容量

演出时间为最高入住率。这就是我所拥有的:

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;
/