Ci sono alcuni problemi:
- È necessario un punto e virgola dopo la definizione del cursore (ovvero dopo la query).
- Non puoi usare
bookCursor
sia come nome del cursore che come nome del record che prendi. (Ho notato che una parte del tuo codice usabookCursorRec
per quest'ultimo, quindi andrò con quello.) - Il
fetch
deve 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
).