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

db . में किन कूटों का पत्राचार होता है?

अपनी CSV फ़ाइल पर एक बाहरी तालिका बनाएँ। ये बेहद साफ-सुथरी चीजें हैं जो हमें SQL में OS फ़ाइल की सामग्री को क्वेरी करने की अनुमति देती हैं। और जानें .

फिर यह एक प्रश्न जारी करने का एक साधारण मामला है:

select csv.id
       , case ( when tgt.id is null then 'invalid' else 'valid') end as valid_id
from your_external_tab csv
       left join target_table tgt on (csv.id = tgt.id)

प्रदर्शन संदर्भ का विषय है। इस मामले में यह इस बात पर निर्भर करता है कि सीएसवी में डेटा कितनी बार बदलता है और हमें इसे कितनी बार क्वेरी करने की आवश्यकता होती है। यदि फ़ाइल दिन में एक बार बनाई जाती है और हमें केवल डिलीवर होने के बाद मूल्यों की जांच करने की आवश्यकता होती है तो एक बाहरी तालिका सबसे कुशल समाधान है। लेकिन अगर यह डेटा सेट एक स्थायी भंडार है जिसे अक्सर पूछताछ की आवश्यकता होती है तो एक ढेर तालिका में लिखने का ऊपरी भाग स्पष्ट रूप से उचित है।

मेरे लिए, एक सीएसवी फ़ाइल जिसमें एक गुच्छा आईडी शामिल है और कुछ भी क्षणिक डेटा की तरह नहीं लगता है और बाहरी तालिकाओं के लिए उपयोग के मामले को सॉफिट करता है। लेकिन ओपी की अतिरिक्त आवश्यकताएं हो सकती हैं जिनका उन्होंने उल्लेख नहीं किया है।

यहां एक वैकल्पिक दृष्टिकोण दिया गया है जिसके लिए किसी स्थायी डेटाबेस ऑब्जेक्ट को बनाने की आवश्यकता नहीं है। नतीजतन यह कम सुरुचिपूर्ण है, और शायद खराब प्रदर्शन करेगा।

यह UTL_FILE का उपयोग करके CSV फ़ाइल को श्रमसाध्य रूप से पढ़ता है और SYSTEM.NUMBER_TBL_TYPE, एक पूर्व-निर्धारित संग्रह (NUMBER की नेस्टेड तालिका) के आधार पर एक संग्रह को पॉप्युलेट करता है जो आपके Oracle डेटाबेस में उपलब्ध होना चाहिए।

declare
    ids system.number_tbl_type;
    fh utl_file.file_handle;
    idx pls_integer := 0;
    n pls_integer;
 begin
    fh := utl_file.fopen('your_data_directory', 'your_data.csv', 'r');
    begin
        utl_file.get_line(fh, n);
        loop  
            idx := idx + 1;
            ids.extend();
            ids(idx) := n;
            utl_file.get_line(fh, n);
        end loop;
   exception
      when no_data_found then
          if utl_file.is_open(fh) then
             utl_file.fclose(fh);
          end if;
     when others then
          raise;
  end;
  for id_recs in  in  ( select csv.column_value 
              , case ( when tgt.id is null then 'invalid' else 'valid') end as valid_id
                from (select * from table(ids)) csv
            left join target_table tgt on (csv.column_value = tgt.id)
  ) loop
  dbms_output.put_line '(ID '||id_recs.column_value || ' is '||id_recs.valid_id);
  end loop;
end;

नोट:मैंने इस कोड का परीक्षण नहीं किया है। सिद्धांत सही है लेकिन विवरण में डिबगिंग की आवश्यकता हो सकती है;)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. वीबी6 एप्लीकेशन ऑरैकल 12 64 बिट कनेक्शन

  2. उदाहरण के साथ Oracle में प्राथमिक कुंजी पर शीर्ष प्रश्न

  3. ओरेकल में, सिंटैक्स के संबंध में - मैं (+) सिंटैक्स को आधुनिक पारंपरिक जॉइन में कैसे परिवर्तित करूं?

  4. Oracle DB से कनेक्ट करते समय dbplyr के माध्यम से EXTRACT का उपयोग कैसे करें

  5. काउंट (*) ठीक से काम नहीं कर रहा है