Има няколко проблема:
- Необходима ви е точка и запетая след дефиницията на курсора (т.е. след заявката).
- Не можете да използвате
bookCursor
както като име на курсора, така и като име на записа, който извличате. (Забелязвам, че част от вашия код използваbookCursorRec
за последното, така че ще се придържам към него.) fetch
трябва да извлече в нещо, тоест вbookCursorRec
.- Трябва ви точка и запетая след извикването на
dbms_output.put_line
. - Вашата заявка изглежда грешна; изглежда, че и двете съединения са кръстосани съединения.
Сглобяване и малко коригиране на форматирането и структурата, така че да е малко по-"идиоматичен" PL/SQL:
DECLARE
CURSOR bookcursor IS
SELECT btname, isbn, pubname, datedestroyed
FROM booktitle bt
JOIN publisher p
ON bt.pid = p.id -- this is just a guess
JOIN bookcopy bc
ON bt.bcid = bc.id -- this is just a guess
WHERE datedestroyed IS NULL
;
bookcursorrec bookcursor%ROWTYPE;
BEGIN
OPEN bookcursor;
LOOP
FETCH bookcursor INTO bookcursorrec;
EXIT WHEN bookcursor%NOTFOUND;
dbms_output.put_line( 'ISBN: ' ||bookcursorrec.isbn
|| ' - Book Name: ' || bookcursorrec.btname
|| ' - Publisher: ' || bookcursorrec.pubname );
END LOOP;
CLOSE bookcursor;
END;
/
Между другото, идентификаторите на Oracle са предимно чувствителни към малки и главни букви (в смисъл, че имплицитно се преобразуват в главни букви, освен ако не ги поставите в двойни кавички), така че обикновено хората ще използват идентификатори като book_cursor_rec
и date_destroyed
вместо bookCursorRec
(=bookcursorrec
) и dateDestroyed
(=datedestroyed
).