I'm trying to run this code on Oracle 11g and it's giving me the error below. I can't seem to get it right.
DECLARE
CURSOR bookcursor IS
SELECT btName, BookCopy.Isbn, pubName, dateDestroyed
FROM booktitle bt
JOIN publisher p
ON bt.pubId = p.pubId
JOIN bookcopy bc
ON bt.Isbn = bc.Isbn
WHERE datedestroyed IS NULL
;
bookcursorrec bookcursor%ROWTYPE;
BEGIN
OPEN bookcursor;
LOOP
FETCH bookcursor INTO bookcursorrer;
EXIT WHEN bookcursor%NOTFOUND;
dbms_output.put_line( 'ISBN: ' ||bookcursorrec.isbn
|| ' - Book Name: ' || bookcursorrec.btname
|| ' - Publisher: ' || bookcursorrec.pubname );
END LOOP;
CLOSE bookcursor;
END;
ERROR at line 3:
ORA-06550: line 3, column 20:
PL/SQL: ORA-00904: "BOOKCOPY"."ISBN": invalid identifier
ORA-06550: line 3, column 5:
PL/SQL: SQL Statement ignored
ORA-06550: line 2, column 12:
PLS-00341: declaration of cursor 'BOOKCURSOR' is incomplete or malformed
ORA-06550: line 11, column 19:
PL/SQL: Item ignored
ORA-06550: line 15, column 31:
PLS-00201: identifier 'BOOKCURSORRER' must be declared
ORA-06550: line 15, column 9:
PL/SQL: SQL Statement ignored
ORA-06550: line 17, column 42:
PLS-00320: the declaration of the type of this expression is incomplete or
malformed
ORA-06550: line 17, column 9:
PL/SQL: Statement ignored
Can you kindly point me to what is wrong? I can't seem to understand to what is wrong
Thanks, Brian
You need to change
into
above the
while
.Also
should read
Also important to check user has select grant to the object or table in question. My issue got resolved by granting user select access to table used in cursor;
There are a few problems:
bookCursor
both as the name of the cursor and as the name of the record you fetch. (I notice that a bit of your code usesbookCursorRec
for the latter, so I'll go with that.)fetch
needs to fetch into something, that is, intobookCursorRec
.dbms_output.put_line
.Putting it together, and adjusting the formatting and structure a bit so it's slightly more "idiomatic" PL/SQL:
By the way, Oracle identifiers are mostly case-sensitive (in that they're implicitly converted to uppercase unless you wrap them in double-quotes), so usually people will use identifiers like
book_cursor_rec
anddate_destroyed
rather thanbookCursorRec
(=bookcursorrec
) anddateDestroyed
(=datedestroyed
).