Автоматическая вставка данных в таблицу с использованием процедуры - PullRequest
0 голосов
/ 23 ноября 2018

Я хотел бы задать вам довольно простой вопрос, но я не могу обойти его, так как я новичок в SQL.

Моя задача: вводить исходные данные в BankStats2, вставляя строки в BankStats2, которыесодержать названия филиалов вместе с указанием количества ссуд в таблице ссуд для этого названия филиала.

desc BankStats2
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 BRANCHNAME                                NOT NULL VARCHAR2(20)
 NUMBEROFLOANS                                      NUMBER(38)

desc Loan
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 CUSTOMERNAME                                       CHAR(20)
 BRANCHNAME                                         CHAR(20)
 AMOUNT                                             NUMBER(38)
 LOANNUMBER                                NOT NULL NUMBER(38)

 select branchName,count(customerName) from Loan group by branchName;

BRANCHNAME           COUNT(CUSTOMERNAME)
-------------------- -------------------
Yorkshire                              3
RoyalBank                              1
Midlands                               3

По сути, я хотел бы вставить эту информацию в таблицу BankStats2, и я подумал об этом, создав процедуру, которую я будупокажите ниже.

CREATE OR REPLACE PROCEDURE PopulateBankStats AS
CURSOR someLoanRows IS
SELECT branchName,COUNT(customerName) FROM loan GROUP BY branchName;
aBranchNameRow loan.branchName%TYPE;
numberOfLoans INT;
BEGIN
OPEN someLoanRows;
LOOP
FETCH someLoanRows INTO aBranchNameRow, numberOfLoans;
INSERT INTO BankStats2 VALUES (aBranchNameRow,numberOfLoans);
EXIT WHEN someLoanRows%NOTFOUND;
END LOOP;
CLOSE someLoanRows;
END;
/

Но его выполнение выдает мне следующую ошибку:

ERROR at line 1:
ORA-00001: unique constraint (N0757934.SYS_C0034405) violated
ORA-06512: at "N0757934.POPULATEBANKSTATS", line 10
ORA-06512: at line 1

Любая помощь будет принята с благодарностью.Спасибо за ваше время!

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Посмотрите на оператор 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 .

0 голосов
/ 23 ноября 2018

Сбой при вставке: INSERT INTO BankStats2 VALUES (aBranchNameRow,numberOfLoans);
из-за ошибки: ORA-00001: unique constraint (N0757934.SYS_C0034405) violated

Это означает, что для некоторых столбцов таблицы создано уникальное ограничение BankStats2.

Чтобы определить, какой столбец имеет уникальное ограничение, выполните этот запрос:

select * from USER_IND_COLUMNS where index_name = 'SYS_C0034405';

Ваша процедура пытается вставить запись со значением этого столбца, которое уже существует в таблице.

...