Посмотрите на оператор INSERT .
Ваша процедура делает именно этот оператор вставки :
INSERT INTO BankStats2 (BRANCHNAME,NUMBEROFLOANS)
SELECT branchName,COUNT(customerName) FROM loan GROUP BY branchName;
Этовсегда предпочтительнее использовать оператор SQL (если это возможно) вместо логики цикла курсора PL / SQL - поиск объяснения Тома Кайта"строка за строкой - медленный за медленным".
Четныйесли вы хотите использовать процедуру любой ценой - используйте это INSERT
в предоперационной процедуре.
Ваше исключение означает, что вы пытаетесь вставить значение столбца BRANCHNAME
, которое ужесуществует в таблице BankStats2
.
Это может быть вследствие несчастного случая или систематической проблемы.
Если это несчастный случай, просто очистите данные, т.е. УДАЛИТЕ строку (и) с помощьюсоответствующие ключи из таблицы BankStats2
.
Этот запрос возвращает значения, существующие в обеих таблицах
select BRANCHNAME from BankStats2
intersect
select branchName FROM loan;
Если вы хотите систематически избегать вставки дублируемой строки , добавьте этот логик в свой оператор INSERT:
INSERT INTO BankStats2 (BRANCHNAME,NUMBEROFLOANS)
SELECT branchName,COUNT(customerName)
FROM loan
WHERE branchName IS NOT NULL
and branchName NOT IN (select BRANCHNAME from BankStats2)
GROUP BY branchName;
Обратите внимание, чтоt SELECT исключает строку со значением, которое уже существует в целевой таблице - используя NOT IN (subquery)
.
Обратите внимание, что я подхожу к вашей следующей возможной проблеме .Столбец BRANCHNAME
не имеет значения NULL в BankStats2
, но имеет значение NULL (то есть может содержать NULL) в loan
, поэтому вам не удастся вставить строку с NULL в таблицу BankStats2
.Поэтому я исключаю эти строки с предикатом branchName IS NOT NULL
.
Если вы хотите обработать существующие ключи с помощью логики UPDATE, проверьте оператор MERGE .