PL / SQL выборка курсора и l oop UPDATE, возвращающий результат последней строки - PullRequest
0 голосов
/ 29 января 2020

Я получил 3 таблицы:

BOOK(bookid primary,nbloans)
COPIES(copyid primary,bookid REFERENCES BOOK bookid)
BORROW(bid,copyid REFERENCES COPIES COPYID)

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

create or replace procedure procedure1
IS
cursor c1 is
SELECT BOOK.BOOKID AS Books,COUNT(*) AS countloans
FROM BORROW,COPIES,BOOK
WHERE BORROW.COPYID=COPIES.COPYID AND COPIES.BOOKID=BOOK.BOOKID
group by BOOK.BOOKID;
rec1 c1%ROWTYPE;
v_rows number;
BEGIN
OPEN c1;
LOOP
    FETCH c1 into rec1;
    EXIT WHEN c1%notfound;
    UPDATE BOOK SET NBLOANS=rec1.countloans;
    END LOOP;
IF SQL%NOTFOUND THEN
    DBMS_OUTPUT.PUT_LINE('0 rows changed');
    ELSIF SQL%FOUND THEN
    v_rows:=SQL%ROWCOUNT;
    DBMS_OUTPUT.PUT_LINE(v_rows||' rows changed');
END IF;
END;

Когда я попробовал только запрос SELECT, в каждой книге мне показывалось, сколько было кредитов и каков результат:

BOOKS COUNTLOANS
137   5
 81   1
138   2

Этот результат верный, потому что я проверил таблицы. Но когда я делаю это в процедуре с курсором и l oop fetch, все nbloans были установлены в 2 (Заметил, что это было последнее значение) Почему это произошло?

1 Ответ

1 голос
/ 29 января 2020

Ваш оператор UPDATE:

UPDATE BOOK SET NBLOANS=rec1.countloans;

Это установит для NBLOANS значение rec1.countloans для каждой строки в таблице.

Возможно, вы имели в виду

UPDATE BOOK
  SET NBLOANS = rec1.countloans
  WHERE BOOKID = rec1.Books;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...