मानक प्रस्तावना के साथ कि वास्तविक दुनिया में आप वास्तव में इस तरह का काम नहीं करेंगे...
आपको वास्तव में यहां एक स्टेटमेंट-लेवल ट्रिगर का उपयोग करने की आवश्यकता होगी। अगर आपको हर बार हर कमरे की जाँच करने के प्रदर्शन से कोई फर्क नहीं पड़ता है
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;
अगर आप हर बार हर कमरे के लिए इसकी जांच नहीं करना चाहते हैं, तो आपको rid
के संग्रह के साथ एक पैकेज की आवश्यकता होगी मान, एक पूर्व कथन ट्रिगर जिसने संग्रह को प्रारंभ किया, और एक पंक्ति-स्तरीय ट्रिगर जिसने :new.rid
जोड़ा संग्रह के लिए मूल्य। आपका आफ्टर स्टेटमेंट ट्रिगर तब संग्रह के तत्वों पर पुनरावृति करेगा और केवल उन कमरों में लोगों की संख्या की जांच करेगा।