Es gibt ein paar Probleme:
- Sie benötigen ein Semikolon nach der Cursordefinition (d.h. nach der Abfrage).
- Sie können
bookCursor
nicht verwenden sowohl als Name des Cursors als auch als Name des abgerufenen Datensatzes. (Mir ist aufgefallen, dass ein Teil Ihres CodesbookCursorRec
verwendet für letzteres, also bleibe ich dabei.) - Der
fetch
muss in abrufen etwas, das heißt, inbookCursorRec
. - Sie benötigen ein Semikolon nach dem Aufruf von
dbms_output.put_line
. - Ihre Anfrage scheint falsch zu sein; es sieht so aus, als wären beide Joins Cross-Joins.
Es zusammensetzen und die Formatierung und Struktur ein wenig anpassen, damit es etwas "idiomatischer" ist 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;
/
Übrigens wird bei Oracle-Bezeichnern meistens zwischen Groß- und Kleinschreibung unterschieden (da sie implizit in Großbuchstaben umgewandelt werden, es sei denn, Sie setzen sie in doppelte Anführungszeichen), sodass normalerweise Bezeichner wie book_cursor_rec
verwendet werden und date_destroyed
statt bookCursorRec
(=bookcursorrec
) und dateDestroyed
(=datedestroyed
).