(नोट:इस कोड का परीक्षण नहीं किया गया है और मैं यहां अल्पविराम या वहां कोष्ठक से बाहर हो सकता हूं...)
वे दो ब्लॉक केवल एक्शन कॉलम और एक जॉइन में भिन्न प्रतीत होते हैं, इसलिए आप 2 IF लेग्स को खत्म कर सकते हैं और p_update_mode की जाँच को इस तरह CASE स्टेटमेंट में स्थानांतरित कर सकते हैं:
CREATE OR REPLACE PROCEDURE update_dynamic_entity(p_entity_type VARCHAR2 DEFAULT NULL,
p_update_mode VARCHAR2) IS
BEGIN
INSERT INTO dynamicentitygtt
(entity_type, entity_id, entity_code, synonyms, action)
WITH data_view AS
( -- ITEM table
SELECT 'ITEM' entity_type, -- This separates inserted values
item_id data_id,
item_name data_name,
item_desc data_desc,
creation_date
FROM itemde
UNION ALL
-- ORG table
SELECT 'ORG' entity_type, -- This separates inserted values
org_id,
org_name,
org_desc,
creation_date
FROM orgde
-- NEXT entity table
)
SELECT upper(t.entity_type),
t.data_id,
t.data_name,
t.data_desc,
CASE lower(p_update_mode)
WHEN 'incremental' THEN
CASE
WHEN t.creation_date > b.max_last_update_date THEN
'update'
WHEN t.creation_date < b.max_last_update_date THEN
'add'
END
WHEN 'full' THEN
'add'
END action
FROM data_view t
LEFT JOIN batch_run_details b
ON b.entity_type = t.entity_type
AND lower(p_update_mode )='incremental'
WHERE (upper(p_entity_type) = t.entity_type OR p_entity_type IS NULL)
AND (lower(p_update_mode) = 'full'
OR (lower(p_update_mode) = 'incremental' AND b.entity_type IS NOT NULL)
);
END update_dynamic_entity;
आपके FULL ब्लॉक में क्वेरी कहती है कि हमें इस मोड में B से नहीं जुड़ना चाहिए। इसलिए LEFT JOIN क्लॉज केवल पंक्तियों को वापस लाता है जब वृद्धि मोड में होता है, लेकिन पूर्ण मोड के लिए कोई पंक्तियाँ नहीं बनानी चाहिए।
इसे LEFT जॉइन करने की आवश्यकता है या हो सकता है कि हमें आपके data_view से ऐसी कोई पंक्ति न मिले जो पूर्ण मोड के लिए B में इकाइयों के अनुरूप न हो। दूसरे शब्दों में, यदि यह एक नियमित जॉइन बना रहता है, तो आपकी समग्र क्वेरी को AND क्लॉज़ के कारण पूर्ण मोड में शून्य पंक्तियाँ मिलेंगी।
अंत में, नीचे WHERE क्लॉज में AND फ़िल्टर अब आवश्यक हो जाता है जब एक LEFT JOIN होता है। इसके बिना, इंक्रीमेंटल मोड में चलने पर, आपको अपने डेटा_व्यू में हर पंक्ति मिलेगी, भले ही बी में एक संबंधित इकाई पंक्ति हो या नहीं। भले ही आप entity_id पर शामिल हो रहे हों, लेफ्ट जॉइन T में प्रत्येक पंक्ति के लिए एक पंक्ति को वापस लाने जा रहा है, भले ही B में एक मिलान पंक्ति न हो, क्योंकि LEFT JOIN को ऐसा करने के लिए डिज़ाइन किया गया था।
जो कुछ भी कहा गया है, आपको यह तय करना होगा कि इन दो ब्लॉकों को सम्मिश्रण करना उचित है या नहीं। सिर्फ इसलिए कि आप कर सकते हैं, इसका मतलब यह नहीं है कि आपको चाहिए। आपका प्रदर्शन इसे वैसे ही छोड़ कर बेहतर हो सकता है जैसे आपके पास है - कुछ परीक्षण चलाएं। केवल आप डेटा की मात्रा और प्रसंस्करण की आवृत्ति जानते हैं। आपको अपने कोड के रखरखाव पर भी विचार करना होगा, क्योंकि अगले लड़के/लड़की को यह पता लगाना होगा कि यहां क्या हो रहा है।