我正在尝试在Oracle 11g上运行此代码,它在下面给出了错误。我似乎无法做对。
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
你能否指出我的错误?我似乎无法理解什么是错的
谢谢, 布赖恩
答案 0 :(得分:8)
有一些问题:
bookCursor
用作游标的名称和您获取的记录的名称。 (我注意到你的一些代码使用bookCursorRec
作为后者,所以我会继续使用它。)fetch
需要将提取到内容,即bookCursorRec
。dbms_output.put_line
后,您需要一个分号。把它放在一起,然后稍微调整一下格式和结构,以便稍微“惯用”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;
/
顺便说一句,Oracle标识符大多区分大小写(因为它们被隐式转换为大写,除非用双引号将它们包装起来),所以通常人们会使用像book_cursor_rec
和{{1这样的标识符而不是date_destroyed
(= bookCursorRec
)和bookcursorrec
(= dateDestroyed
)。
答案 1 :(得分:1)
您需要更改
fetch bookCursor
到
fetch bookCursor into bookCursorRec;
高于while
。
另外
cursor bookCursor is
SELECT btName, ISBN, pubName, dateDestroyed
FROM BookTitle bt, publisher p, BookCopy bc
WHERE bt.bcId = bcId
AND dateDestroyed is null
bookCursor bookCursor%rowtype;
应该阅读
cursor bookCursor is
SELECT btName, ISBN, pubName, dateDestroyed
FROM BookTitle bt, publisher p, BookCopy bc
WHERE bt.bcId = bcId
AND dateDestroyed is null;
bookCursorRec bookCursor%rowtype;
答案 2 :(得分:1)
Set Serveroutput on
CREATE OR REPLACE A PROCEDURE TO GET_SENRYO_EMP
DECLARE
CURSOR Senryocursor IS
SELECT first_name, last_name, full_Name,Gender,DOB,Martialstatus,Nationality,Telephone,Email_id,job,Nationalidentifier,Hire_date
FROM Senryo;
--Senryocursorrec senryocursor%rowtype;
BEGIN
OPEN Senryocursor;
LOOP
FETCH Senryocursor INTO Senryocursorrec;
EXIT WHEN Senryocursor%NOTFOUND;
dbms_output.put_line( 'Senryocursor ' ||Senryocursorrec
|| '- Full_name :' || Senryocursorrec.full_name
|| ' - Job: ' || Senryocursorrec.Job );
END LOOP;
CLOSE Senryocursor;
END;
答案 3 :(得分:0)
检查用户是否已选择授予相关对象或表格也很重要。 我的问题通过授予用户对游标中使用的表的选择访问权来解决;
GRANT SELECT ON <table> TO <user> ;