Det finns några problem:
- Du behöver ett semikolon efter markördefinitionen (d.v.s. efter frågan).
- Du kan inte använda
bookCursor
både som namn på markören och som namn på posten du hämtar. (Jag märker att en del av din kod använderbookCursorRec
för det senare, så jag går med på det.) fetch
måste hämta in något, det vill säga tillbookCursorRec
.- Du behöver ett semikolon efter anropet till
dbms_output.put_line
. - Din fråga verkar fel; det ser ut som att båda kopplingarna är korsfogar.
Att sätta ihop det och justera formateringen och strukturen lite så att det blir lite mer "idiomatiskt" 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;
/
Förresten, Oracle-identifierare är mestadels skiftlägeskänsliga (i det att de implicit konverteras till versaler om du inte lindar in dem med dubbla citattecken), så vanligtvis använder folk identifierare som book_cursor_rec
och date_destroyed
snarare än bookCursorRec
(=bookcursorrec
) och dateDestroyed
(=datedestroyed
).