Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle 11g - Esecuzione di cursori PL/SQL

Ci sono alcuni problemi:

  • È necessario un punto e virgola dopo la definizione del cursore (ovvero dopo la query).
  • Non puoi usare bookCursor sia come nome del cursore che come nome del record che prendi. (Ho notato che una parte del tuo codice usa bookCursorRec per quest'ultimo, quindi andrò con quello.)
  • Il fetch deve recuperare in qualcosa, cioè in bookCursorRec .
  • È necessario un punto e virgola dopo la chiamata a dbms_output.put_line .
  • La tua richiesta sembra sbagliata; sembra che entrambi i join siano cross-join.

Mettendolo insieme e regolando un po' la formattazione e la struttura in modo che sia leggermente più "idiomatico" 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;
/

A proposito, gli identificatori Oracle fanno per lo più distinzione tra maiuscole e minuscole (in quanto vengono convertiti implicitamente in maiuscolo a meno che non vengano racchiusi tra virgolette), quindi di solito le persone useranno identificatori come book_cursor_rec e date_destroyed anziché bookCursorRec (=bookcursorrec ) e dateDestroyed (=datedestroyed ).