Hay algunos problemas:
- Necesita un punto y coma después de la definición del cursor (es decir, después de la consulta).
- No puedes usar
bookCursor
tanto como el nombre del cursor como el nombre del registro que busca. (Noté que una parte de su código usabookCursorRec
para lo último, así que me quedo con eso). - El
fetch
necesita buscar en algo, es decir, enbookCursorRec
. - Necesita un punto y coma después de la llamada a
dbms_output.put_line
. - Su consulta parece incorrecta; parece que ambas uniones son uniones cruzadas.
Juntándolo y ajustando un poco el formato y la estructura para que sea un poco más "idiomático" 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;
/
Por cierto, los identificadores de Oracle en su mayoría distinguen entre mayúsculas y minúsculas (en el sentido de que se convierten implícitamente a mayúsculas a menos que los envuelva entre comillas dobles), por lo que generalmente las personas usarán identificadores como book_cursor_rec
y date_destroyed
en lugar de bookCursorRec
(=bookcursorrec
) y dateDestroyed
(=dateDestroyed
).