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
bookCursor
tanto como o nome do cursor quanto como o nome do registro que você busca. (Percebi que um pouco do seu código usabookCursorRec
para o último, então eu vou com isso.) - A
fetch
precisa 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
).