Jest kilka problemów:
- Potrzebujesz średnika po definicji kursora (tj. po zapytaniu).
- Nie możesz użyć
bookCursorzarówno jako nazwa kursora, jak i nazwa pobieranego rekordu. (Zauważyłem, że część twojego kodu używabookCursorRecdla tego drugiego, więc pójdę z tym.) fetchmusi 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 ).