अपनी 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;
नोट:मैंने इस कोड का परीक्षण नहीं किया है। सिद्धांत सही है लेकिन विवरण में डिबगिंग की आवश्यकता हो सकती है;)