Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle 11g - Executando Cursores PL/SQL


Há alguns problemas:
  • Você precisa de um ponto e vírgula após a definição do cursor (ou seja, após a consulta).
  • Você não pode usar bookCursor tanto como o nome do cursor quanto como o nome do registro que você busca. (Percebi que um pouco do seu código usa bookCursorRec para o último, então eu vou com isso.)
  • A fetch precisa buscar em algo, ou seja, em bookCursorRec .
  • Você precisa de um ponto e vírgula após a chamada para dbms_output.put_line .
  • Sua consulta parece errada; parece que ambas as junções são junções cruzadas.

Juntando e ajustando um pouco a formatação e a estrutura para que seja um PL/SQL um pouco mais "idiomático":
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;
/

A propósito, os identificadores Oracle diferenciam principalmente maiúsculas de minúsculas (pois são convertidos implicitamente em maiúsculas, a menos que você os coloque entre aspas), então geralmente as pessoas usarão identificadores como book_cursor_rec e date_destroyed em vez de bookCursorRec (=bookcursorrec ) e dateDestroyed (=datedestroyed ).