Ci sono alcuni problemi:
- È necessario un punto e virgola dopo la definizione del cursore (ovvero dopo la query).
- Non puoi usare
bookCursorsia come nome del cursore che come nome del record che prendi. (Ho notato che una parte del tuo codice usabookCursorRecper quest'ultimo, quindi andrò con quello.) - Il
fetchdeve recuperare in qualcosa, cioè inbookCursorRec. - È necessario un punto e virgola dopo la chiamata a
dbms_output.put_line. - La tua richiesta sembra sbagliata; sembra che entrambi i join siano cross-join.
Mettendolo insieme e regolando un po' la formattazione e la struttura in modo che sia leggermente più "idiomatico" 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;
/
A proposito, gli identificatori Oracle fanno per lo più distinzione tra maiuscole e minuscole (in quanto vengono convertiti implicitamente in maiuscolo a meno che non vengano racchiusi tra virgolette), quindi di solito le persone useranno identificatori come book_cursor_rec e date_destroyed anziché bookCursorRec (=bookcursorrec ) e dateDestroyed (=datedestroyed ).