लूप के कारण (जिसमें एक एक्जिट क्लॉज गायब है - उम्मीद है कि आपने इसे एक प्रश्न में अनुवाद करने के लिए खो दिया है) आप pstn_matrix
में एक रिकॉर्ड डालने का प्रयास करने जा रहे हैं। हर . के लिए कर्सर रिटर्न रिकॉर्ड करें, चाहे कोई मिलान हो :new.person_id
या नहीं; और अगर मैच है तो आप update
. भी करेंगे . जो शायद आप नहीं चाहते हैं, और आपको अन्य चीजों के साथ एक बाधा उल्लंघन मिल सकता है। आप अपना काउंटर फ़ील्ड भी सेट नहीं कर रहे हैं - यदि वह अशक्त नहीं है तो वह त्रुटि होगी। लेकिन आपने यह नहीं बताया कि आपको क्या त्रुटियां हो रही हैं, यदि कोई हो।
यदि आपको इसे ट्रिगर के माध्यम से करना है तो आप या तो जांच सकते हैं कि नए व्यक्ति के लिए कोई पंक्ति है या नहीं:
DECLARE
v_temp postn_matrix.person_id%TYPE;
BEGIN
IF INSERTING THEN
select max(person_id) into v_temp
from postn_matrix
where person_id = :new.person_id;
if v_temp is null then
-- no record found, so insert one
insert into postn_matrix (person_id, position_count)
values (:new.person_id, 1);
else
-- record exists, so update
update postn_matrix ...
end if;
...
... या merge
का इस्तेमाल करें
।
लेकिन मुझे यह मॉडल पसंद नहीं है, और आप आधार तालिका में समवर्ती संशोधनों के साथ डेटा विसंगतियों की संभावना स्थापित कर रहे हैं। इस तरह की गिनती बनाए रखने की कोशिश करना उतना आसान नहीं है जितना लगता है।
मैं आमतौर पर इसे एक दृश्य बनाना पसंद करूंगा, जो हमेशा अप टू डेट रहेगा और इसके लिए ट्रिगर जटिल चीजों की आवश्यकता नहीं होगी:
create view postn_matrix as
select person_id, count(*)
from basetable
group by person_id;
बेशक, हो सकता है कि मैं आपकी आधार तालिका (तालिकाओं) की गलत व्याख्या कर रहा हो या इसकी निगरानी कर रहा हो और आपको postn_matrix
की क्या आवश्यकता है। के लिये। देखने में भी यह थोड़ा तुच्छ लगता है। अगर आपके पास अलग person
है और person_position
टेबल, कहें, तो आप बिना स्थिति वाले लोगों को देखने के लिए बाहरी जुड़ाव में जोड़ सकते हैं:
create view postn_matrix as
select p.person_id, count(pp.position_id)
from person p
left join person_position pp on pp.person_id = p.person_id
group by p.person_id;