Вече сте на половината път до решението:
Това не е изненада. Вашето текущо внедряване изпълнява много оператори SELECT за един ред за всеки ред, който вмъквате в таблица B. Това неизбежно ще ви даде лош профил на производителност. SQL е базиран на набори език и се представя по-добре с многоредови операции.
И така, това, което трябва да направите, е да намерите начин да замените всички оператори SELECT с по-ефективни алтернативи. Тогава ще можете да премахнете тригерите за постоянно. Например, заменете справките в речника с външни ключове между колоните на таблицата A и референтната таблица. Ограниченията на релационния интегритет, тъй като са вътрешен код на Oracle, се представят много по-добре от всеки код, който можем да напишем (и също да работим в среди с много потребители).
Правилото за невмъкване в таблица A, ако комбинация от колони вече съществува в таблица B, е по-проблематично. Не защото е трудно да се направи, а защото звучи като лош релационен дизайн. Ако не искате да зареждате записи в таблица A, когато те вече излизат в таблица B, защо не зареждате директно в таблица B? Или може би имате поднабор от колони, които трябва да бъдат извлечени от таблица A и таблица B и оформена в таблица C (която би имала външни ключови връзки с A и B)?
Както и да е, оставяйки това настрана, можете да направите това с базиран на набор SQL, като замените SQL*Loader с външна таблица. Външна таблица ни позволява да представим CSV файл в базата данни, сякаш е обикновена таблица. Това означава, че можем да го използваме в нормални SQL изрази. Научете повече.
И така, с ограничения на външен ключ за речник и външна таблица, можете да замените кода на SQL Loader с този оператор (предмет на всички други правила, включени в „...и така нататък“):
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') ;
Това използва синтаксиса за регистриране на грешки в DML, за да улови грешките на ограниченията за всички редове по начин, базиран на набор. Научете повече . Няма да предизвика изключения за редове, които вече съществуват в таблица B. Можете да използвате или множествената таблица INSERT ALL за насочване на редове към таблица с препълване или използване на операция MINUS set след събитието, за да намерите редове във външната таблица, които не са в таблица A. Зависи от вашата крайна цел и как трябва да докладвате нещата.
Може би по-сложен отговор, отколкото сте очаквали. Oracle SQL е много обширна SQL реализация с много функционалност за подобряване на ефективността на масовите операции. Наистина ни се струва да прочетем Ръководството за концепции и Справочника за SQL, за да разберем колко много можем да направим с Oracle.