Existuje několik problémů:
- Za definicí kurzoru (tj. za dotazem) potřebujete středník.
- Nemůžete použít
bookCursorjako název kurzoru i jako název načteného záznamu. (Všiml jsem si, že část vašeho kódu používábookCursorRecpro to druhé, takže s tím půjdu.) fetchpotřebuje načíst do něco, tedy dobookCursorRec.- Za voláním
dbms_output.put_linepotřebujete středník . - Váš dotaz se zdá být nesprávný; vypadá to, že obě spojení jsou křížová.
Dát to dohromady a trochu upravit formátování a strukturu, aby to bylo trochu "idiomatičtější" 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;
/
Mimochodem, identifikátory Oracle většinou rozlišují velká a malá písmena (v tom, že jsou implicitně převedeny na velká písmena, pokud je nezabalíte do dvojitých uvozovek), takže lidé obvykle budou používat identifikátory jako book_cursor_rec a date_destroyed spíše než bookCursorRec (=bookcursorrec ) a dateDestroyed (=datedestroyed ).