Il y a quelques problèmes :
- Vous avez besoin d'un point-virgule après la définition du curseur (c'est-à-dire après la requête).
- Vous ne pouvez pas utiliser
bookCursorà la fois comme nom du curseur et comme nom de l'enregistrement que vous récupérez. (Je remarque qu'une partie de votre code utilisebookCursorRecpour ce dernier, donc je vais y aller.) - Le
fetchdoit aller chercher dans quelque chose, c'est-à-dire dansbookCursorRec. - Vous avez besoin d'un point-virgule après l'appel à
dbms_output.put_line. - Votre requête semble erronée ; il semble que les deux jointures soient des jointures croisées.
Assembler et ajuster un peu la mise en forme et la structure pour que ce soit un peu plus "idiomatique" 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;
/
Soit dit en passant, les identifiants Oracle sont pour la plupart sensibles à la casse (en ce sens qu'ils sont implicitement convertis en majuscules à moins que vous ne les mettiez entre guillemets), donc généralement les gens utiliseront des identifiants comme book_cursor_rec et date_destroyed plutôt que bookCursorRec (=bookcursorrec ) et dateDestroyed (=datedestroyed ).