आप पहले से ही समाधान के आधे रास्ते पर हैं:
ये आश्चर्यजनक नहीं है। आपका वर्तमान कार्यान्वयन तालिका बी में डाली गई प्रत्येक पंक्ति के लिए कई एकल पंक्ति चयन कथन निष्पादित करता है। यह अनिवार्य रूप से आपको खराब प्रदर्शन प्रोफ़ाइल देगा। SQL एक सेट-आधारित भाषा है और बहु-पंक्ति संचालन के साथ बेहतर प्रदर्शन करती है।
तो, आपको जो करने की ज़रूरत है वह सभी SELECT कथनों को प्रतिस्थापित करने का एक तरीका ढूंढता है जो अधिक कुशल विकल्प हैं। तब आप ट्रिगर्स को स्थायी रूप से छोड़ने में सक्षम होंगे। उदाहरण के लिए, डिक्शनरी के लुक-अप को टेबल ए कॉलम और रेफरेंस टेबल के बीच विदेशी कुंजियों से बदलें। संबंधपरक अखंडता बाधाएं, आंतरिक Oracle कोड होने के कारण, हमारे द्वारा लिखे जा सकने वाले किसी भी कोड की तुलना में बहुत बेहतर प्रदर्शन करती हैं (और बहु-उपयोगकर्ता वातावरण में भी काम करती हैं)।
यदि तालिका B में स्तंभों का संयोजन पहले से मौजूद है तो तालिका A में सम्मिलित न करने का नियम अधिक समस्याग्रस्त है। इसलिए नहीं कि यह करना कठिन है, बल्कि इसलिए कि यह खराब संबंधपरक डिजाइन की तरह लगता है। यदि आप तालिका A में रिकॉर्ड लोड नहीं करना चाहते हैं, जब वे पहले से ही तालिका B से बाहर निकलते हैं तो आप तालिका B में सीधे लोड क्यों नहीं कर रहे हैं? या शायद आपके पास स्तंभों का एक उप-समूह है जिसे तालिका A और . से निकाला जाना चाहिए तालिका बी और तालिका सी में गठित (जिसमें ए और बी के साथ विदेशी कुंजी संबंध होंगे)?
वैसे भी, इसे एक तरफ छोड़कर, आप एसक्यूएल * लोडर को बाहरी तालिका के साथ बदलकर सेट-आधारित एसक्यूएल के साथ ऐसा कर सकते हैं। एक बाहरी तालिका हमें एक CSV फ़ाइल को डेटाबेस में प्रस्तुत करने की अनुमति देती है जैसे कि यह एक नियमित तालिका थी। इसका मतलब है कि हम इसे सामान्य एसक्यूएल स्टेटमेंट में इस्तेमाल कर सकते हैं। और जानें।
इसलिए, शब्दकोश और बाहरी तालिका पर विदेशी कुंजी बाधाओं के साथ आप इस कथन के साथ teh SQL लोडर कोड को प्रतिस्थापित कर सकते हैं (जो भी अन्य नियमों को "... और इसी तरह" में शामिल किया गया है) के अधीन:
insert into table_a
select ext.*
from external_table ext
left outer join table_b b
on (ext.name = b.name and ext.last_name = b.last_name and ext.dept=b.dept)
where b.name is null
log errors into err_table_a ('load_fail') ;
यह सेट-आधारित फैशन में सभी पंक्तियों के लिए बाधा त्रुटियों को पकड़ने के लिए डीएमएल त्रुटि लॉगिंग सिंटैक्स को नियोजित करता है। और जानें . यह उन पंक्तियों के लिए अपवाद नहीं उठाएगा जो तालिका B में पहले से मौजूद हैं। आप मल्टी-टेबल INSERT ALL पंक्तियों को एक अतिप्रवाह तालिका में रूट करने के लिए या बाहरी तालिका में पंक्तियों को खोजने के लिए घटना के बाद एक माइनस सेट ऑपरेशन का उपयोग करें जो तालिका ए में नहीं हैं। आपके अंतिम लक्ष्य पर निर्भर करता है और आपको चीजों की रिपोर्ट करने की आवश्यकता है।
शायद आपकी अपेक्षा से अधिक जटिल उत्तर। Oracle SQL एक बहुत व्यापक SQL कार्यान्वयन है, जिसमें थोक संचालन की दक्षता में सुधार के लिए बहुत अधिक कार्यक्षमता है। यह वास्तव में हमें यह जानने के लिए कॉन्सेप्ट गाइड और एसक्यूएल संदर्भ पढ़ने के लिए भुगतान करता है कि हम ओरेकल के साथ कितना कुछ कर सकते हैं।