Há alguns problemas:
- Você precisa de um ponto e vírgula após a definição do cursor (ou seja, após a consulta).
- Você não pode usar
bookCursortanto como o nome do cursor quanto como o nome do registro que você busca. (Percebi que um pouco do seu código usabookCursorRecpara o último, então eu vou com isso.) - A
fetchprecisa buscar em algo, ou seja, embookCursorRec. - Você precisa de um ponto e vírgula após a chamada para
dbms_output.put_line. - Sua consulta parece errada; parece que ambas as junções são junções cruzadas.
Juntando e ajustando um pouco a formatação e a estrutura para que seja um PL/SQL um pouco mais "idiomático":
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;
/
A propósito, os identificadores Oracle diferenciam principalmente maiúsculas de minúsculas (pois são convertidos implicitamente em maiúsculas, a menos que você os coloque entre aspas), então geralmente as pessoas usarão identificadores como
book_cursor_rec e date_destroyed em vez de bookCursorRec (=bookcursorrec ) e dateDestroyed (=datedestroyed ).