รวม MERGE และ INSERT คำสั่งทั้งหมด

ฉันมีปัญหาที่สามารถแก้ไขได้ด้วยการใช้ 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 ซึ่งทำงานกับคำสั่งแถวและจะทำงานช้าลง


person Fering    schedule 16.10.2018    source แหล่งที่มา
comment
@EvilTeach ไม่ .... คุณช่วยเปลี่ยนความคิดเห็นเป็นคำตอบได้ไหม Trigger จะจัดการกับสิ่งที่ฉันพยายามทำอย่างแน่นอน และมันจะตรงไปตรงมาและง่ายดาย   -  person Fering    schedule 16.10.2018


คำตอบ (1)


ที่ไซต์ของเรา เราใช้ after trigger เพื่ออัปเดตข้อมูลการตรวจสอบ มีข้อดีในการติดตามการเปลี่ยนแปลงผ่านโปรแกรม หรือหากมีผู้แจ้งคำสั่งอัปเดต

นั่นอาจจะทำงานให้คุณ

person EvilTeach    schedule 16.10.2018
comment
เมื่อพิจารณาว่าฉันได้ทำงานร่วมกับทริกเกอร์สำหรับสิ่งอื่นๆ สองสามอย่างในโปรเจ็กต์นี้ ฉันรู้สึกผิดหวังเล็กน้อยที่ไม่ได้พิจารณาเพื่อจุดประสงค์นี้ - person Fering; 16.10.2018
comment
ตรงกลับมาที่คุณ ส่วนหนึ่งของความมหัศจรรย์ของสถานที่นี้คือมุมมองที่สดใหม่สามารถช่วยพัดควันออกไปได้ คุณอาจสามารถปูอะไรบางอย่างร่วมกับ INSERT/RETURNING ได้ แต่อย่างที่คุณพูด มันสะอาดและใช้งานง่ายด้วยทริกเกอร์ - person EvilTeach; 16.10.2018