Jest kilka problemów:
- Potrzebujesz średnika po definicji kursora (tj. po zapytaniu).
- Nie możesz użyć
bookCursor
zarówno jako nazwa kursora, jak i nazwa pobieranego rekordu. (Zauważyłem, że część twojego kodu używabookCursorRec
dla tego drugiego, więc pójdę z tym.) fetch
musi pobrać do coś, to znaczy dobookCursorRec
.- Potrzebujesz średnika po wywołaniu
dbms_output.put_line
. - Twoje zapytanie wydaje się błędne; wygląda na to, że oba sprzężenia są sprzężeniami krzyżowymi.
Łącząc to w całość i dostosowując nieco formatowanie i strukturę, aby było trochę bardziej "idiomatyczne" 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;
/
Nawiasem mówiąc, identyfikatory Oracle są w większości rozróżniane wielkości liter (ponieważ są niejawnie konwertowane na wielkie litery, chyba że umieścisz je w podwójnych cudzysłowach), więc zwykle ludzie będą używać identyfikatorów takich jak book_cursor_rec
i date_destroyed
zamiast bookCursorRec
(=bookcursorrec
) i dateDestroyed
(=datedestroyed
).