Oracle 11g - Запуск курсоров PL / SQL - PullRequest
1 голос
/ 11 января 2012

Я пытаюсь запустить этот код в 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

Не могли бы вы указать мне, что не так?Кажется, я не понимаю, в чем дело

Спасибо, Брайан

Ответы [ 4 ]

8 голосов
/ 11 января 2012

Есть несколько проблем:

  • Вам нужна точка с запятой после определения курсора (т.е. после запроса).
  • Вы не можете использовать 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 и date_destroyed, а не bookCursorRec (= bookcursorrec) и dateDestroyed (= datedestroyed).

1 голос
/ 16 октября 2012
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;
1 голос
/ 11 января 2012

Вам необходимо изменить

 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;
0 голосов
/ 10 июля 2015

Также важно убедиться, что пользователь выбрал грант для рассматриваемого объекта или таблицы. Моя проблема была решена путем предоставления пользователю выбора доступа к таблице, используемой в курсоре;

GRANT SELECT ON <table> TO <user> ;
...