Я пытаюсь написать триггер, который запрещает любой комнате в больнице иметь более 3 служб. В таблице RoomServices указан номер комнаты и служба, которая в ней есть. Таким образом, единственный способ определить это — сгруппировать комнаты по номерам и подсчитать услуги. Я пробовал код:
CREATE TRIGGER RoomServiceLimit
BEFORE INSERT OR UPDATE ON RoomServices
FOR EACH ROW
DECLARE
numService NUMBER;
CURSOR C1 IS SELECT count(*) AS RoomCount FROM RoomServices WHERE roomNumber = :new.roomNumber;
BEGIN
IF(inserting) THEN
SELECT count(*) into numService FROM RoomServices WHERE roomNumber = :new.roomNumber;
if(numService > 2) THEN
RAISE_APPLICATION_ERROR(-20001,'Room ' || :new.roomNumber || ' will have more than 3 services.');
END IF;
END IF;
IF(updating) THEN
FOR rec IN C1 LOOP
IF(rec.RoomCount > 2) THEN
RAISE_APPLICATION_ERROR(-20001,'Room ' || :new.roomNumber || ' will have more than 3 services.');
END IF;
END LOOP;
END IF;
END;
/
Я пробовал запускать каждый метод отдельно с помощью вставки и обновления, и вставка всегда работает, а обновление всегда будет приводить к ошибке мутирующей таблицы. Я не знаю, как еще решить эту проблему, поэтому любой совет будет принят с благодарностью.
Спасибо!
MySql
наOracle
. - person krokodilko   schedule 13.12.2013FOR EACH ROW
и попробуйте снова запустить DML. - person Rachcha   schedule 13.12.2013