เก็บผลลัพธ์ของคิวรีลบด้วยหลายคอลัมน์ในตัวแปรใน Oracle PL / SQL

Aug 18 2020

ฉันใช้โค้ดด้านล่างเพื่อดึงรหัสโปรเจ็กต์พิเศษที่มีอยู่ใน TABLE_ONE เทียบกับ TABLE_TWO (ที่เก็บซอร์สผลลัพธ์ของคิวรีลบ (รายการตัวแปร) ในตัวแปรใน Oracle PL / SQL )

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;

ตอนนี้ฉันต้องการเพิ่มชื่อโครงการที่เกี่ยวข้องลงในตารางที่สองด้วย ไม่ว่า project_ids ส่วนเกินใดที่มีอยู่ใน TABLE_ONE เมื่อเทียบกับ TABLE_TWO ควรถูกแทรกใน TABLE_TWO พร้อมกับชื่อโครงการที่เกี่ยวข้อง ทำอย่างไร? โปรดทราบว่าฉันจำเป็นต้องเก็บผลลัพธ์เคียวรีลบไว้ในตัวแปรเนื่องจากฉันจะดำเนินการหลายขั้นตอนกับผลลัพธ์

คำตอบ

1 MatthewMcPeak Aug 18 2020 at 21:11

SYS.ODCINUMBERLISTเป็นเพียงรายการที่แต่ละระเบียนมีตัวเลขเดียว คุณต้องใช้ประเภทระเบียนใหม่เพื่อจัดเก็บหลายเขตข้อมูลในแต่ละแถว

SYS.ODCINUMBERLISTคุณสามารถกำหนดบันทึกประเภทการใช้งานในสถานที่ของ แต่ฉันจะมีแนวโน้มที่จะย้ายคำสั่งจะเป็นเคอร์เซอร์อย่างชัดเจนเพื่อให้คุณสามารถกำหนดรูปแบบใหม่เป็นเคอร์เซอร์SELECT %ROWTYPEด้วยวิธีนี้ประเภทระเบียนของคุณและคำสั่ง select จะสอดคล้องกันเสมอ แต่จะเปลี่ยนโครงสร้างของโค้ดของคุณเล็กน้อย

นี่คือแนวทาง:

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(ทั้งที่นี่และในโพสต์ต้นฉบับของคุณ) - ข้อมูลที่คุณกำลังรวบรวมจำนวนมากจะถูกเก็บไว้ในหน่วยความจำ PGA ดังนั้นอย่าใช้รหัสนี้เพราะหากมีการเปลี่ยนแปลงจำนวนระเบียนใหม่จะไม่สมเหตุสมผล (อาจจะมากกว่าสองสามพัน)