Anda sudah setengah jalan menuju solusi:
Ini bukan kejutan. Implementasi Anda saat ini mengeksekusi banyak pernyataan SELECT baris tunggal untuk setiap baris yang Anda masukkan ke dalam tabel B. Itu pasti akan memberi Anda profil kinerja yang buruk. SQL adalah bahasa berbasis set dan berkinerja lebih baik dengan operasi multi-baris.
Jadi, yang perlu Anda lakukan adalah mencari cara untuk mengganti semua pernyataan SELECT alternatif yang lebih efisien. Kemudian Anda akan dapat menjatuhkan pemicu secara permanen. Misalnya, ganti pencarian di kamus dengan kunci asing antara kolom tabel A dan tabel referensi. Batasan integritas relasional, karena kode Oracle internal, berkinerja jauh lebih baik daripada kode apa pun yang dapat kita tulis (dan juga bekerja di lingkungan multi-pengguna).
Aturan untuk tidak memasukkan ke tabel A jika kombinasi kolom sudah ada di tabel B lebih bermasalah. Bukan karena sulit dilakukan tetapi karena kedengarannya seperti desain relasional yang buruk. Jika Anda tidak ingin memuat catatan di tabel A ketika mereka sudah keluar di tabel B mengapa Anda tidak memuat ke tabel B secara langsung? Atau mungkin Anda memiliki sub-set kolom yang harus diekstraksi dari tabel A dan tabel B dan dibentuk menjadi tabel C (yang akan memiliki hubungan kunci asing dengan A dan B)?
Bagaimanapun, meninggalkannya di satu sisi, Anda dapat melakukan ini dengan SQL berbasis set dengan mengganti SQL*Loader dengan tabel eksternal. Tabel eksternal memungkinkan kita untuk menyajikan file CSV ke database seolah-olah itu adalah tabel biasa. Ini berarti kita dapat menggunakannya dalam pernyataan SQL normal. Cari tahu lebih lanjut.
Jadi, dengan batasan kunci asing pada kamus dan tabel eksternal, Anda dapat mengganti kode SQL Loader dengan pernyataan ini (tunduk pada aturan lain apa pun yang dimasukkan ke dalam "...dan seterusnya"):
insert into table_a
select ext.*
from external_table ext
left outer join table_b b
on (ext.name = b.name and ext.last_name = b.last_name and ext.dept=b.dept)
where b.name is null
log errors into err_table_a ('load_fail') ;
Ini menggunakan sintaks logging kesalahan DML untuk menangkap kesalahan kendala untuk semua baris dalam mode berbasis set. Cari tahu lebih lanjut . Itu tidak akan memunculkan pengecualian untuk baris yang sudah ada di tabel B. Anda bisa menggunakan multi-tabel INSERT ALL untuk merutekan baris ke tabel luapan atau menggunakan operasi set MINUS setelah kejadian untuk menemukan baris di tabel eksternal yang tidak ada di tabel A. Tergantung pada tujuan akhir Anda dan bagaimana Anda perlu melaporkan sesuatu.
Mungkin jawaban yang lebih kompleks dari yang Anda harapkan. Oracle SQL adalah implementasi SQL yang sangat luas, dengan banyak fungsi untuk meningkatkan efisiensi operasi massal. Kami benar-benar membayar untuk membaca Panduan Konsep dan Referensi SQL untuk mengetahui seberapa banyak yang dapat kami lakukan dengan Oracle.