Gabungkan pernyataan MERGE dan INSERT ALL

Saya memiliki masalah yang dapat diselesaikan dengan menerapkan aduting penuh baik dengan pemicu atau arsip data flash tetapi itu lebih dari yang diperlukan.

Jadi saat ini kami sedang melakukan penggabungan yang memperbarui baris saat ada atau menyisipkan saat tidak ada. Ini berfungsi dengan baik dan mudah untuk ditulis. Kami sekarang memiliki persyaratan baru yaitu pengguna harus mengetahui baris mana yang telah diperbarui atau disisipkan. Ya, hal ini dapat dilakukan dengan memasukkan bidang lain ke dalam tabel, namun hal tersebut tidak diperbolehkan karena hal tersebut akan mengubah tabel. Jadi kita terpaksa membuat satu atau dua tabel yang akan mengidentifikasi baris mana yang diupdate atau disisipkan melalui PK.

Apa yang ingin saya lakukan adalah mengambil pernyataan MERGE yang ada dan menambahkan kemampuan untuk menyisipkan ke dalam tabel sekunder, tetapi saya belum dapat menemukan pernyataan penggabungan yang berfungsi seperti itu, dan INSERT ALL tidak memiliki persyaratan penggabungan yang lebih rumit .

Berikut adalah struktur pernyataan MERGE yang saat ini digunakan.

 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);

Di bawah ini adalah cara yang saya harapkan untuk menyelesaikan 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');

Satu-satunya cara lain untuk mencapai hal ini secara wajar yang dapat saya lihat adalah dengan blok PLSQL yang berfungsi pada pernyataan baris dan akan lebih lambat.


person Fering    schedule 16.10.2018    source sumber
comment
@EvilTeach Tidak.... Bisakah Anda mengubah komentar Anda menjadi sebuah jawaban. Trigger pasti akan menangani apa yang saya coba lakukan dan itu akan langsung dan mudah.   -  person Fering    schedule 16.10.2018


Jawaban (1)


Di situs kami, kami menggunakan pemicu setelahnya untuk memperbarui hal-hal audit. Ini memiliki keuntungan dalam melacak perubahan melalui program, atau jika seseorang memberikan pernyataan pembaruan.

Itu mungkin berhasil untuk Anda.

person EvilTeach    schedule 16.10.2018
comment
Mengingat saya telah bekerja dengan pemicu untuk beberapa hal lain dalam proyek ini, saya sedikit kecewa karena saya tidak mempertimbangkan tujuan ini. - person Fering; 16.10.2018
comment
Segera kembali padamu. Bagian dari keajaiban situs ini adalah sudut pandang yang segar dapat membantu menghilangkan asap. Anda mungkin bisa membuat sesuatu bersama-sama dengan INSERT/RETURNING, tapi seperti yang Anda katakan. Ini bersih dan mudah dengan pemicu - person EvilTeach; 16.10.2018