Oracle 11g - 运行PL/SQL游标

Bri*_*ian 1 sql oracle plsql cursor oracle11g

我正在尝试在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
Run Code Online (Sandbox Code Playgroud)

你能帮我指出什么是错的吗?我似乎无法理解什么是错的

谢谢,Brian

rua*_*akh 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;
/
Run Code Online (Sandbox Code Playgroud)

顺便说一句,甲骨文标识符大多是区分大小写(因为他们是隐式转换为大写,除非你在双引号包起来),所以通常人们会用标识符像book_cursor_rec和date_destroyed,而不是bookCursorRec(= bookcursorrec)和dateDestroyed(= datedestroyed).