Existuje několik problémů:
- Za definicí kurzoru (tj. za dotazem) potřebujete středník.
- Nemůžete použít
bookCursor
jako název kurzoru i jako název načteného záznamu. (Všiml jsem si, že část vašeho kódu používábookCursorRec
pro to druhé, takže s tím půjdu.) fetch
potřebuje načíst do něco, tedy dobookCursorRec
.- Za voláním
dbms_output.put_line
potř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
).