Oracle PL / SQL में एक चर में कई कॉलम के साथ माइनस क्वेरी का स्टोर परिणाम

Aug 18 2020

मैं TABLE_TWO की तुलना में TABLE_ONE में मौजूद अतिरिक्त प्रोजेक्ट ID को लाने के लिए नीचे दिए गए कोड का उपयोग कर रहा हूं (Oracle PL / SQL में एक चर में शून्य क्वेरी की सूची स्रोत (varchars की सूची )

DECLARE 
  l_missing_id_list SYS.ODCINUMBERLIST;
BEGIN
  SELECT project_id
  BULK COLLECT INTO l_missing_id_list
  FROM 
    (
    SELECT t1.project_id FROM table_one t1
    MINUS
    SELECT t2.project_id FROM table_two t2 );
    
  FORALL i IN l_missing_id_list.FIRST..l_missing_id_list.LAST
    INSERT INTO table_two VALUES ( l_missing_id_list(i) );
    
  COMMIT;
  
  -- Values are now inserted and you have the list of IDs in l_missing_id_list to add to your email.
END;

अब मैं इसी परियोजना के नाम को भी दूसरी तालिका में जोड़ना चाहता हूं। TABLE_TWO की तुलना में TABLE_ONE में जो भी अतिरिक्त Project_ids मौजूद हैं, उन्हें संबंधित प्रोजेक्ट नामों के साथ TABLE_TWO में सम्मिलित किया जाना चाहिए। यह कैसे करना है? कृपया ध्यान दें कि मुझे एक चर में शून्य क्वेरी परिणाम को संग्रहीत करने की आवश्यकता है क्योंकि मैं परिणाम के साथ कई चरणों का प्रदर्शन करूंगा।

जवाब

1 MatthewMcPeak Aug 18 2020 at 21:11

SYS.ODCINUMBERLISTसिर्फ एक सूची है जहां प्रत्येक रिकॉर्ड में एक ही संख्या है। आपको प्रत्येक पंक्ति में कई फ़ील्ड्स को संग्रहीत करने के लिए एक नए रिकॉर्ड प्रकार का उपयोग करने की आवश्यकता है।

आप के स्थान पर उपयोग करने के लिए एक रिकॉर्ड प्रकार को परिभाषित कर सकते हैं SYS.ODCINUMBERLIST। लेकिन मैं SELECTएक स्पष्ट कर्सर होने के लिए बयान को स्थानांतरित करने के लिए इच्छुक हूं , ताकि आप एक नए प्रकार को कर्सर के रूप में परिभाषित कर सकें %ROWTYPE। इस तरह, आपका रिकॉर्ड प्रकार और चयन कथन हमेशा संगत होते हैं, लेकिन यह आपके कोड की संरचना को थोड़ा बदल देता है।

यहाँ वह दृष्टिकोण है:

DECLARE 

  CURSOR c_select IS
      SELECT project_id, project_name
      FROM 
        (
          SELECT t1.project_id, t1.project_name FROM table_one t1
          MINUS
          SELECT t2.project_id, t2.project_name FROM table_two t2 );

  TYPE l_missing_row_list_typ IS TABLE OF c_select%ROWTYPE;
  l_missing_row_list l_missing_row_list_typ;
  
BEGIN
  OPEN c_select;
  FETCH c_select BULK COLLECT INTO l_missing_row_list;
  CLOSE c_select;
  
  FORALL i IN l_missing_row_list.FIRST..l_missing_row_list.LAST
    INSERT INTO table_two VALUES ( l_missing_row_list(i).project_id, l_missing_row_list(i).project_name );
    
  COMMIT;
  
  -- Values are now inserted and you have the list of IDs in l_missing_row_list to add to your email.
END;

के बारे में एक नोट BULK COLLECT(यहां और आपके मूल पोस्ट में) - आपके द्वारा एकत्र किया जा रहा डेटा पीजीए मेमोरी में संग्रहीत है। इसलिए इस कोड का उपयोग न करें क्योंकि यदि कोई परिवर्तन होता है तो नए रिकॉर्ड की संख्या अनुचित होगी (शायद कुछ हजार से अधिक)।