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 utilisebookCursorRec
pour ce dernier, donc je vais y aller.) - Le
fetch
doit 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
).