Es gibt ein paar Probleme:
- Sie benötigen ein Semikolon nach der Cursordefinition (d.h. nach der Abfrage).
- Sie können
bookCursornicht verwenden sowohl als Name des Cursors als auch als Name des abgerufenen Datensatzes. (Mir ist aufgefallen, dass ein Teil Ihres CodesbookCursorRecverwendet für letzteres, also bleibe ich dabei.) - Der
fetchmuss 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 ).