Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

एक ट्रिगर में कर्सर

लूप के कारण (जिसमें एक एक्जिट क्लॉज गायब है - उम्मीद है कि आपने इसे एक प्रश्न में अनुवाद करने के लिए खो दिया है) आप 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;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PL/SQL - अनुप्रयोग त्रुटि उदाहरण उठाएँ

  2. Oracle डेटाबेस में FORALL स्टेटमेंट का परिचय

  3. SqlPlus क्वेरी समस्या (पैकेज युक्ति और मुख्य भाग)

  4. TO_DATE फ़ंक्शन समय क्षेत्र पार्स त्रुटि

  5. CLOB डेटा को एक डेटाबेस से दूसरे दूरस्थ ORACLE डेटाबेस में DBLinks वाले कैसे स्थानांतरित करें?