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.