Dengan kata pengantar standar bahwa ini bukan bagaimana Anda benar-benar melakukan hal semacam ini di dunia nyata...
Anda secara realistis perlu menggunakan pemicu tingkat pernyataan di sini. Jika Anda tidak keberatan dengan kinerja memeriksa setiap kamar setiap saat
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;
Jika Anda tidak ingin memeriksa ini untuk setiap kamar setiap saat, Anda memerlukan paket dengan koleksi rid
nilai, pemicu pernyataan sebelumnya yang menginisialisasi koleksi, dan pemicu tingkat baris yang menambahkan :new.rid
nilai untuk koleksi. Pemicu pernyataan setelah Anda kemudian akan mengulangi elemen dalam koleksi dan memeriksa jumlah orang hanya di ruangan tersebut.