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

तालिका की किसी भी पंक्ति पर ओवरलैप की गई तिथियों की जाँच करें Oracle SQL

मुझे लगता है कि आपको इस तरह के ट्रिगर की आवश्यकता होगी:

CREATE OR REPLACE TRIGGER TRGEPOCASNAOSOBREPOSTAS
    AFTER INSERT OR UPDATE
    ON EPOCA
  c INTEGER;
BEGIN
    SELECT COUNT(*)
    INTO c
    FROM EPOCA e
    WHERE EXISTS (
        SELECT 1
        FROM EPOCA ee 
        WHERE (e.DATA_INI BETWEEN ee.DATA_INI AND ee.DATA_FIM 
              OR e.DATA_FIM BETWEEN ee.DATA_INI AND ee.DATA_FIM) 
           AND ee.ROWID <> e.ROWID);

    IF c > 0 THEN
            RAISE_APPLICATION_ERROR(-20021, 'INSERT FAILED BECAUSE SELECTED DATES OVERLAP EXISTENT ONES');
    END IF;
END;

ध्यान दें, FOR EACH ROW खंड नहीं दिया गया है!

अन्यथा ट्रिगर केवल वर्तमान में डाली गई/अपडेट की गई पंक्ति को निष्पादित करता है लेकिन किसी भी मौजूदा डेटा से तुलना नहीं करता है।

इस तरह के मामलों पर भी विचार करें:

तालिका में आपके पास 1 से 30 अगस्त तक की अवधि है, फिर आप 1 मई से 31 दिसंबर तक की अवधि जोड़ने का प्रयास करें। बेशक, ऐसी स्थितियों को भी ट्रिगर द्वारा अवरुद्ध किया जाना चाहिए। इस प्रकार आपको केवल एक कथन-स्तरीय ट्रिगर की आवश्यकता है, यानी एक पंक्ति स्तर ट्रिगर जो केवल सम्मिलित/अपडेट की गई पंक्ति की जांच करता है, पर्याप्त नहीं है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle में सभी तालिकाओं की सूची प्राप्त करें?

  2. एक जावा एप्लिकेशन में एकाधिक ओरेकल जेडीबीसी ड्राइवरों का उपयोग करना?

  3. Oracle अपवाद के साथ निर्देशिका से फ़ाइल पढ़ता है

  4. Oracle में, SQL क्वेरी के WHERE क्लॉज को 1=1 उपयोगी के साथ प्रारंभ कर रहा है?

  5. क्या आप Oracle के साथ Microsoft Entity Framework का उपयोग कर सकते हैं?