เก็บผลลัพธ์ของคิวรีลบด้วยหลายคอลัมน์ในตัวแปรใน Oracle PL / SQL
ฉันใช้โค้ดด้านล่างเพื่อดึงรหัสโปรเจ็กต์พิเศษที่มีอยู่ใน 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 พร้อมกับชื่อโครงการที่เกี่ยวข้อง ทำอย่างไร? โปรดทราบว่าฉันจำเป็นต้องเก็บผลลัพธ์เคียวรีลบไว้ในตัวแปรเนื่องจากฉันจะดำเนินการหลายขั้นตอนกับผลลัพธ์
คำตอบ
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 ดังนั้นอย่าใช้รหัสนี้เพราะหากมีการเปลี่ยนแปลงจำนวนระเบียนใหม่จะไม่สมเหตุสมผล (อาจจะมากกว่าสองสามพัน)