ฉันมีปัญหาที่สามารถแก้ไขได้ด้วยการใช้ adading เต็มรูปแบบกับทริกเกอร์หรือที่เก็บข้อมูลแฟลช แต่นั่นเกินกว่าที่จำเป็นมาก
ตอนนี้เรากำลังดำเนินการผสานซึ่งจะอัปเดตแถวเมื่อมีอยู่หรือกำลังแทรกเมื่อไม่มี มันทำงานได้ดีและเขียนได้ง่าย ขณะนี้เรามีข้อกำหนดใหม่ซึ่งก็คือผู้ใช้จะต้องทราบว่าแถวใดได้รับการอัปเดตหรือแทรก ใช่ สามารถทำได้โดยการแนะนำฟิลด์อื่นลงในตาราง แต่นั่นไม่ได้รับอนุญาตเพราะจะทำให้ตารางเปลี่ยนไป ดังนั้นเราจึงถูกบังคับให้สร้างตารางหนึ่งหรือสองตารางซึ่งจะระบุว่าแถวใดได้รับการอัปเดตหรือแทรกผ่าน PK
สิ่งที่ฉันหวังจะทำคือใช้คำสั่ง MERGE ที่มีอยู่และเพิ่มความสามารถในการแทรกลงในตารางรอง แต่ฉันไม่สามารถค้นหาคำสั่งผสานที่ทำงานในลักษณะนั้นได้ และ INSERT ALL ขาดเงื่อนไขที่ซับซ้อนมากขึ้นของการผสาน .
นี่คือโครงสร้างของคำสั่ง MERGE ที่ใช้อยู่ในปัจจุบัน
MERGE INTO EXISTING_TABLE ET USING TMP_TABLE TMP ON (HRR.ID = TMP.ID)
WHEN MATCHED THEN UPDATE SET
ET.ID = TMP.ID,
ET.TITLE_EN = TMP.TITLE_EN,
ET.TITLE_FR = TMP.TITLE_FR,
WHEN NOT MATCHED THEN INSERT (ID, TITLE_EN, TITLE_FR)
VALUES (TMP.ID, TMP.TITLE_EN, TMP.TITLE_FR);
ด้านล่างนี้เป็นวิธีที่ฉันหวังว่าจะทำให้ MERGE INSERT ALL สำเร็จ
MERGE INTO EXISTING_TABLE ET USING TMP_TABLE TMP ON (HRR.ID = TMP.ID)
WHEN MATCHED THEN UPDATE
SET
ET.ID = TMP.ID,
ET.TITLE_EN = TMP.TITLE_EN,
ET.TITLE_FR = TMP.TITLE_FR,
INSERT INTO NEW_TABLE (ID, TYPE) VALUES (TMP.ID, 'U')
WHEN NOT MATCHED THEN INSERT ALL
INTO EXISTING_TABLE (ID, TITLE_EN, TITLE_FR) VALUES (TMP.ID, TMP.TITLE_EN, TMP.TITLE_FR),
INTO NEW_TABLE (ID, TYPE) VALUES (TMP.ID, 'I');
อีกวิธีเดียวที่จะทำสิ่งนี้ให้สำเร็จอย่างสมเหตุสมผลที่ฉันเห็นได้ก็คือบล็อก PLSQL ซึ่งทำงานกับคำสั่งแถวและจะทำงานช้าลง