Với lời nói đầu tiêu chuẩn rằng đây không phải là cách bạn thực sự sẽ làm điều này trong thế giới thực ...
Thực tế, bạn sẽ cần sử dụng trình kích hoạt cấp câu lệnh tại đây. Nếu bạn không bận tâm về hiệu suất của việc kiểm tra mọi phòng mọi lúc
CREATE OR REPLACE TRIGGER Living_AIUD
AFTER INSERT OR UPDATE OR DELETE
ON Living
DECLARE
Count NUMBER;
BEGIN
FOR x IN (SELECT rid, count(*) cnt
FROM living
GROUP BY rid
HAVING COUNT(*) < 3)
LOOP
RAISE_APPLICATION_ERROR(-20002, 'Too few people in room ' || x.rid);
END LOOP;
END Living_AIUD;
Nếu bạn không muốn kiểm tra thông tin này cho mọi phòng mỗi lần, bạn cần một gói có bộ sưu tập rid
giá trị, trình kích hoạt câu lệnh trước khởi tạo bộ sưu tập và trình kích hoạt cấp hàng đã thêm :new.rid
giá trị của bộ sưu tập. Sau đó, trình kích hoạt câu lệnh sau của bạn sẽ lặp lại các phần tử trong bộ sưu tập và kiểm tra số lượng người chỉ trong các phòng đó.